SQLの基礎を勉強しました。


はじめに

先日SQLの基礎の勉強会に参加したので復習のためにアウトプットしたいと思います。
よろしく御願い致します。

この記事で使用しているDBアプリはDBeaverのバージョン7.1.4を使っています。

SQLについて

SQLとは(Structured Query Language)の略です。
データベースのデータを操作したりデータ定義を行う為の言語。
プログラム言語ではなくてデータベース言語になる。

大きく3つに分けられる。

DML(Data Manipulation Language)
データ操作言語
例:SELECT,UPDATE,INSERT,DELETE等

DDL(Data Definition Language)
データ定義言語
例:CREATE,ALTER,DROP等

DCL(Data Control Language)
データ制御言語
例:GRANT(権限付与),REVOKE(権限取り消し)等

上記のような感じですね。
今回は一番基礎のデータ操作言語のSELECT分について記述していきます。

SELECT文

まず使い方を簡単に説明します。


SELECT カラム名
FROM テーブル名

上記のように使います。


SELECT * (←全てのカラムの意味  指定したテーブルの全データ)
FROM テーブル名

上記の例は指定したテーブル内の全データが対象ということになります。

では実際に練習問題を解いて行きたいと思います。

問題1

テーブル名:sales
カラム名:item_nm, sales_date, sales_amt

上記の内容を「sales_date」の昇順で抽出する。

今回新たに使用するコマンド


order by (昇順[asc]、降順[desc]の指定ができる)

昇順は省略可能

回答


SELECT s.item_nm, s.sales_date, s.sales_amt
FROM sales s
ORDER BY s.sales_date

実行結果

実行結果は上記のようになります。
少し説明が必要な箇所がありますので説明します。

まずSQL文はターミナルなどで記述する時は基本的に最後にセミコロン(;)を入れます。
入れ忘れるとターミナルはまだ終わってないと認識して続きのコマンドを求めます。
なので基本的には入れるものなのですがデータベース用のアプリケーション(Sequel Pro)などでSQL文を実行する際はセミコロンは省略出来ます。

そしてもう一つは「sales s」,「s.item_nm」など「s」があるのが気になるかと思います。
この「s」はテーブル名への別名(エイリアス)付けと呼ばれる方法です。
「FROM」のあとのテーブル名のあとにスペースをあけることで「sales」というテーブル名を「s」という名前に一時的に変更しています。

別名はどんな風につければいいかの参考に良さそうな記事がありましたのでリンクを貼っておきます。
参考:SQLのエイリアスの付け方って迷う。

問題1は以上になります。

問題2ー1

テーブル名:sales
カラム名:item_nm, sales_date, unit_price, qty, sales_amt

上記の内容を「item_nm」が「クルトガ」かつ「sales_amt」が10000円未満のデータを抽出する。(クルトガはただの商品名です。)

今回新たに使用するコマンド


where  (検索する条件を指定出来る)

回答


SELECT
s.item_nm, s.sales_date, s.unit_price, s.qty, s.sales_amt
FROM sales s
where s.item_nm = 'クルトガ'
and s.sales_amt < 10000

実行結果

実行結果は上記のようになります。
今回は「and」を使うことによって「かつ」(条件Aも条件Bも満たす)の条件を指定しています。

問題2ー2

テーブル名: sales
カラム名: 全項目

上記の内容を「unit_price」が1500円以上15000円以下のデータを抽出する。

回答


SELECT *
FROM sales s
where s.unit_price >= 1500
and s.unit_price <= 15000

実行結果

実行結果は上記のようになります。

問題2は以上になります。

問題3−1

テーブル名: sales
カラム名: cust_nm, item_nm, sales_date, unit_price, qty, sales_amt

上記の内容を「cust_nm」がA店またはB店またはC店のデータを抽出する。

今回新たに使用するコマンド


in('値1','値2','値3')
(複数の条件を指定出来る。「or」と同じように使えるが「or」よりもっとシンプルにコードを書ける。)

回答


SELECT s.cust_nm, s.item_nm, s.sales_date, s.unit_price, s.qty, s.sales_amt
FROM sales s
where s.cust_nm in('A文具店','B商店','C雑貨店')

実行結果


実行結果は上記のようになります。

問題3ー2

テーブル名: sales
カラム名: 全項目

上記の内容を「sales_date」が「2020-06-02」以上「2020-06-05」以下のデータを抽出する。

今回新たに使用するコマンド

BETWEEN 1 and 2
(1以上値2以下のデータを抽出する)

回答


SELECT *
FROM sales s
where s.sales_date BETWEEN '2020-06-02' and '2020-06-05'

実行結果


実行結果は上記のようになります。

問題3は以上になります。

問題4

テーブル名: sales
カラム名: cust_nm, 合計金額(合計金額という別名のカラムを作る)

上記の内容を「cust_nm」別の「sales_amt」の合計が10000円以上30000円以下のデータを抽出する。

今回新たに使用するコマンド

集合関数(SUMMAXMINAVGCOUNT
GROUP BY カラム名 (上記の集合関数を使い合計値や平均値などを求める時に使用する)
HAVING (GROUP BYでグループ化した時にWHEREと同じ用途で使用する)

集合関数とは

ここで集合関数について少し説明します。

集合関数の種類と機能
SQLには以下の関数が提供されています。SUMとAVGは数値以外を引数にできません。

SUM 引数の総和を求める。NULLの場合は集計対象外
MAX 引数の最大値を求める。
MIN 引数の最小値を求める。
AVG 引数の平均値を求める。NULLの場合は集計対象外。
COUNT 引数の値の総数を求める。NULLの場合は集計対象外。COUNT(*)と記載可。

上記の集合関数について引用させて頂いたサイト
参考:SQL攻略

回答


SELECT s.cust_nm, sum(s.sales_amt) 合計金額
FROM sales s
GROUP BY s.cust_nm
HAVING sum(s.sales_amt) BETWEEN 10000 and 30000

実行結果

実行結果は上記のようになります。

問題4は以上になります。

おわりに

いかがでしたでしょうか。
今回の記事は先日オンラインでの初心者向けの勉強会に参加させて頂いた際の内容を、復習のためにアウトプットした内容となっております。そのため一部分かりにくい箇所があると思いますがご了承ください。
今回の勉強会でSQLについては実際にコードを書いて実行結果を見て覚えるのが自分にとっては一番良いということが分かりました。SQLは実務でも非常に重要なスキルとのことなので今後も継続して学習に励みたいと思います。

今回の勉強会で教えて頂きました講師の方
Twitter:NAO|基礎を極めたエンジニア/SQL勉強会講師

今回の記事で参考にさせて頂いたサイト