SQLの基本構文
まずは基本形です。
SELECT カラム名
FROM テーブル名
WHERE 条件
GROUP BY カラム名
HAVING 条件
ORDER BY カラム名
LIMIT 件数
これを見て「何が何やら」となった方も多いと思います。順番に日本語へ変換していきます。
それぞれの句を日本語でたとえる
SELECT =「何を」
SELECTは、「何を取り出すか」を最初に宣言する部分です。
日本語にすると「〜を」に近い役割です。
SELECT 名前, 年齢
→「名前と年齢を(取り出したい)」
FROM =「どこから」
FROMは、**データの取得元(テーブル)**を指定します。
FROM 顧客テーブル
→「顧客テーブルから」
ここまでで「顧客テーブルから、名前と年齢を」という日本語の語順に近くなります。
WHERE =「〜という条件で」
WHEREは、絞り込みの条件です。買い物で例えると、店員さんに「1000円以下の商品で」と伝えるイメージです。
WHERE 年齢 >= 20
→「年齢が20以上という条件で」
GROUP BY =「〜ごとにまとめて」
GROUP BYは、指定したカラムの値ごとにグループ化する処理です。
GROUP BY 都道府県
→「都道府県ごとにまとめて」
クラス名簿を出席番号順ではなく、部活動ごとに束ねるイメージに近いです。
HAVING =「まとめた後で、さらに条件を絞る」
HAVINGはGROUP BYでまとめたグループに対しての条件です。WHEREとの違いでつまずきやすい部分です。
-
WHERE:まとめる前の、1件1件のデータに対する条件 -
HAVING:まとめた後の、グループに対する条件
GROUP BY 都道府県
HAVING COUNT(*) >= 10
→「都道府県ごとにまとめて、その中で10件以上あるグループだけ」
ORDER BY =「〜順に並べて」
ORDER BYは、結果の並び替えです。
ORDER BY 年齢 DESC
→「年齢が高い順に並べて」
DESCが「降順(大きい順)」、ASCが「昇順(小さい順、省略時のデフォルト)」です。
LIMIT =「〜件だけ」
LIMITは、取得する件数の上限です。
LIMIT 5
→「5件だけ」
全部つなげると、ひとつの日本語文になる
SELECT 名前, 年齢
FROM 顧客テーブル
WHERE 年齢 >= 20
GROUP BY 都道府県
HAVING COUNT(*) >= 10
ORDER BY 年齢 DESC
LIMIT 5
これを日本語に直すと、次のような形になります。
「20歳以上の顧客だけを集めて、都道府県ごとにグループ分けする。その中から10人以上いる都道府県だけを対象にして、年齢が高い人から順番に並べ、上から5人を選んで、その人の名前と年齢を取り出す」
ちょっと長い文章になってしまいますが、言ってることはわかると思います。
SELECTは書く位置こそ先頭ですが、実際にDB内部で処理される順番は最後の方です。先にFROMやWHEREで対象データが絞り込まれてから、最後に取り出すカラムが決まります。
つまずきやすいポイント
- WHEREとHAVINGを混同する:グループ化する前の条件か、後の条件かで使い分けます。
- GROUP BYなしでHAVINGだけ使おうとする:HAVINGは基本的にGROUP BYとセットで使います。
-
書く順序と実行順序が違う:書く順は
SELECTが先頭ですが、実行はFROMから始まります。
おわりに
SQLは英語の命令文というより、日本語の「〜から、〜で、〜して、〜を」という語順で読み替えると理解しやすくなります。
「SQLが呪文に見える」という方は、一度日本語に変換しながら読んでみてください。