はじめに
SQLの勉強をしようと思ったので,学んだことをまとめていきます.随時更新(多分)
ミス等があれば,コメントして頂けると幸いです.
データベースとは
テキストや数値などのデータを保存するためのツール.例えば,TwitterなどのSNSでは「投稿データ」,楽天やAmazonなどのショッピングサイトでは「顧客の購買データ」をデータベースに保管しています.
仕組み
データベースは下図のような表でデータを管理している.この表をテーブル,列をカラム,行をレコードと呼びます.テーブルは必要に応じて複数作成可能です.
クエリ
データベースからデータを取得するには,データベースにクエリと呼ばれる命令を送る必要があります.SQLはクエリを書くための言語のことです.
クエリは1行で書くこともできますが,読みやすいように改行して書くことにします.
また,SQLは大文字と小文字を区別しないため,小文字でも問題ありません.(だからついつい小文字で書いてしまう…)
データを取得する
SELECT文を使ってどのカラムのどのデータを取得するかを選びます.
SELECT name;
複数のテーブルが存在する場合
FORMを用いてSELECTで選んだカラムがどのテーブルのカラムかを指定する必要があります.
SELECT name
FROM people;
複数のカラムからデータを取得する
カラム名をカンマ[ , ]区切りで書きます.
SELECT name, type;
全てのカラムからデータを取得する
*の記号を使います.
SELECT *
FROM people;
特定のデータだけ取得する
WHEREを使ってどこのレコード(行)を取得するかを指定します.
カラムのデータがテキストデータ,日付データの場合にはクォーテーション[ " or ' ]で囲む必要があります.
数値データの場合は囲む必要がありません.
※データ型については他にもありますが,今回は以上の3つを対象にしています.
SELECT *
FROM people
WHERE category = "大人"; # テキストデータ,日付データ
------------------------------------------------
WHERE height = 150; # 数値データ
比較演算子
SELECT *
FROM people
WHERE height < 150; # 150より小さいデータを検索
------------------------------------------------
WHERE height <= 150; # 150以下のデータを検索
------------------------------------------------
WHERE height > 150; # 150より大きいデータを検索
------------------------------------------------
WHERE height >= 150; # 150以上のデータを検索
比較演算子は数値データ以外にも,日付データにも使用可能です.
SELECT *
FROM people
WHERE height < "2020-01-01"; # 2020-01-01以前のデータを検索
ある文字を含むデータの検索
LIKE演算子を使用して,指定したカラムが「カレー」を含むレコードを指定します.
SELECT *
FROM people
WHERE food LIKE "カレー";
ワイルドカード
「カレー」を含むどんな文字列にも一致するものを検索できます.
SELECT *
FROM people
WHERE food LIKE "%カレー%";
===============================
カレー, 焼きカレー, カレーライス, カツカレーライス
前方一致
「カレー」以降だけどんな文字列にも一致するものを検索できます.
SELECT *
FROM people
WHERE food LIKE "%カレー";
===============================
カレー, 焼きカレー
後方一致
「カレー」より前はどんな文字列にも一致するものを検索できます.
SELECT *
FROM people
WHERE food LIKE "カレー%";
===============================
カレー, カレーライス
否定の条件
NOT演算子を使用して, 「カレー」を含まないデータや**「カレー」に一致しないデータ**を取得できます.
SELECT *
FROM people
WHERE NOT height < 150; # 150より小さいデータではない(150以上のデータ)を取得
-----------------------------------------------------------------------
WHERE NOT food LIKE "%カレー%"; # 「カレー」を含まないデータを取得
NULLデータ
NULLは中身が何か分からないデータのことです.
何のデータも保存されていない場合などが該当します.
NULLのデータを取得する
指定したカラムがNULLであるレコードデータを取得します.
SELECT *
FROM people
WHERE height IS NULL;
NULLではないデータを取得する
指定したカラムがNULLでないレコードデータを取得できます.
SELECT *
FROM people
WHERE height IS NOT NULL;
※NULLデータを取得したい時に,イコール[ = ]を使うことはできません.
AND演算子
WHEREに複数の条件を指定することができます.
以下のようにすることで,2つの条件を共に満たすデータを検索することができます.
SELECT *
FROM people
WHERE category = "大人"
AND age >= 40;
OR演算子
AND演算子と同様に,複数の条件を指定することができます.
以下のようにすることで,2つの条件のうちどちらかを満たすデータを検索することができます.
SELECT *
FROM people
WHERE category = "大人"
AND age <= 40;
データの並び替え
ORDER BYを使って.並べ替えたいカラムと並べ方を指定します.
ASC(昇順):1, 2, 3, …, 100
SELECT *
FROM people
ORDER BY height ASC;
DESC(降順):100, 99, 98, …, 1
SELECT *
FROM people
ORDER BY height DESC;
どちらもwhereと併用が可能です.
SELECT *
FROM people
WHERE category = "大人"
ORDER BY height ASC;
-----------------------
ORDER BY height DESC;
取得するデータ数の制限
LIMITを使って,取得するデータの件数を指定します.
SELECT *
FROM people
LIMIT 10;
ORDER BYと同様にWHEREと併用が可能です.
SELECT *
FROM people
WHERE category = "大人"
LIMIT 10;
重複したデータを除く
**DISTINCT (カラム名)**を使って,検索結果から指定したカラムの重複するデータを除くことができます.
SELECT DISTINCT(name)
FROM item;
四則演算
+:足す
-:引く
*:かける
/:割る
SELECT name, price * 1.08
FROM item;
集計関数
合計,平均などを求めることができます.
合計
SELECTで取得するカラムに使用することで,合計を取得できます.
SELECT SUM(price)
FROM item;
WHEREと併用できます.
SELECT SUM(price)
FROM item
WHERE name = 'Aさん';
平均
SELECTで取得するカラムに使用することで,平均を取得できます.
SELECT AVG(price)
FROM item;
WHEREと併用できます.
SELECT AVG(price)
FROM item
WHERE name = 'Aさん';
データ数を数える
SELECTで取得するカラムに使用することで,指定したカラムの合計数を取得できます.
しかし,NULLになっているデータはカウントされません.
SELECT COUNT(price)
FROM item;
NULLも含めてデータ数を計算したいときは, COUNT(*)(全てのカラム)を指定します.
SELECT COUNT(*)
FROM item;
WHEREと併用できます.
SELECT COUNT(*)
FROM item
WHERE name = 'Aさん';
最大・最小
SELECTで取得するカラムに使用することで,最大のデータ,最小のデータを取得できます.
最大
SELECT MAX(price)
FROM item;
WHEREと併用できます.
SELECT MAX(price)
FROM item
WHERE name = 'Aさん';
最小
SELECT MIN(price)
FROM item;
WHEREと併用できます.
SELECT MIN(price)
FROM item
WHERE name = 'Aさん';
データのグループ化
GROUP BYを使用することで,日付ごと,人ごとに金額の合計を算出することができます.
※SELECTで使えるのはGROUP BYに指定しているカラム名と集計関数だけです.
SELECT SUM(price), date
FROM item
GROUP BY date;
以下では,SELECTで集計関数を使用していないため,日付ごとに集計された値が取得できません.
SELECT price, date
FROM item
GROUP BY date;
複数カラムのグループ化
絡む名をカンマ[ , ]でつなげることで,複数のカラム名を適用させることができます.
複数のカラム名でグループ化すると,データの組み合わせの数だけグループができます.
例:「Aさん」の「2020-01-01」のグループ, 「Bさん」の「2020-01-02」のグループ, etc…
SELECT SUM(price), date, name
FROM item
GROUP BY date, name;
集計関数を使用することで,各グループごとにデータを集計できます.
例:日付と人ごとの金額の合計, 日付と人ごとの購入数, etc…
より細かい条件でグループ化
WHEREと併用できます.
実行順は,上から
| 検索 | WHERE |
|:---:|:---:|:---:|
| グループ化 | GROUP BY |
| 関数 | COUNT・SUN・AVG・MAX・MIN |
のようになっています.
そのため,日付と人ごとの食事に使ったお金の合計を取得するときは,
- WHEREでカテゴリが「食品」であるレコードを検索
- 日付とキャラクターでグループ化する
- 集計関数で集計する
という順番で行います.
SELECT SUM(price), date, name
FROM item
WHERE category = '食品'
GROUP BY date, name;
さらに絞り込む
HAVINGを使用することで,条件を満たすグループを取得できます.
HAVINGはグループ化された後のテーブルから検索するため,条件文で使用するカラムは必ずグループ化されたテーブルのカラムを使用します.
SELECT SUM(price), date
FROM item
GROUP BY date
HAVING SUM(price) > 2000;
グループ化した後のデータを絞り込む際にWHEREではなくHAVINGを使用するのは,以下の実行順によるためです.
| 検索 | WHERE |
|:---:|:---:|:---:|
| グループ化 | GROUP BY |
| 関数 | COUNT・SUN・AVG・MAX・MIN |
| HAVING | HAVING |
WHERE:検索対象がグループ化される前のテーブル全体
HAVING:検索対象がGROUP BYによってグループ化されたデータ
2020 04 01 ~ 04 02
データベースとは 〜 否定の条件
2020 04 02 ~ 04 03
NULLデータ ~ データのグループ化