まず結論

SQLのSELECT文はSELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BYの順で書きます。この句の順序と役割を完全に把握することが試験対策の第一歩です。

SQL実行順序の図解

書く順序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
↓ 実際の処理はこの順番(書く順序 ≠ 実行順序)
実行順序
① FROM
② WHERE
③ GROUP BY
④ HAVING
⑤ SELECT
⑥ ORDER BY
⚠️ WHERE は集計前なので SUM() 等は使えない → 集計後のフィルタは HAVING を使う

SELECT文の基本構造

SELECT 列名1, 列名2, ... -- 取得する列(*で全列) FROM テーブル名 -- 対象テーブル WHERE 条件式 -- 絞り込み条件(任意) GROUP BY グループ化する列 -- グループ化(任意) HAVING グループ条件式 -- グループの絞り込み(任意) ORDER BY 並び替え列 ASC/DESC -- 並び替え(任意)
実行順序はWRITE順と異なる:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY の順で処理される。HAVINGはGROUP BY後のフィルタリング。

サンプルテーブルで理解する

売上テーブル(sales)
idcategoryamountmonth
1食品50004
2家電300004
3食品80005
4家電450005
5食品30005
-- 例1:食品のデータを金額降順で取得 SELECT id, amount FROM sales WHERE category = '食品' ORDER BY amount DESC;
idamount
38000
15000
53000

GROUP BY・HAVING・集計関数

-- 例2:カテゴリ別の合計金額(合計10000以上のみ) SELECT category, SUM(amount) AS total FROM sales GROUP BY category HAVING SUM(amount) >= 10000 ORDER BY total DESC;
categorytotal
家電75000
食品16000
主な集計関数

COUNT(*): 行数
SUM(列): 合計
AVG(列): 平均
MAX(列): 最大値
MIN(列): 最小値

WHERE vs HAVING

WHERE:個々の行を絞り込む(GROUP BY前に実行)
HAVING:グループ化した結果を絞り込む(GROUP BY後に実行)

その他の重要な構文

-- DISTINCT:重複を除く SELECT DISTINCT category FROM sales; -- LIKE:パターンマッチング(%=任意文字列、_=1文字) SELECT * FROM products WHERE name LIKE '鉛筆%'; -- BETWEEN:範囲指定 SELECT * FROM sales WHERE amount BETWEEN 3000 AND 10000; -- IN:複数値のどれか SELECT * FROM sales WHERE month IN (4, 5);

🎯 試験での出方

⚠️ よくある間違い

✍️ 確認クイズ

Q1. 「GROUP BY category HAVING COUNT(*) >= 2」の意味はどれか。
✅ 正解は②。GROUP BY categoryでカテゴリ別にグループ化し、HAVING COUNT(*)>=2でそのグループの行数が2以上のカテゴリだけを残します。
Q2. 個々の行を絞り込む(例:amount > 5000)のに使うSQL句はどれか。
✅ 正解は②。WHERE句はGROUP BYの前に実行され、個々の行を条件で絞り込みます。HAVINGはGROUP BY後のグループに対して絞り込みます。
Q3. 「SELECT COUNT(*), AVG(amount) FROM sales」の実行結果として正しいものはどれか(上記サンプルテーブルを使用)。
✅ 正解は②。COUNT(*)はNULLを含む全行数=5。AVG(amount)=(5000+30000+8000+45000+3000)÷5=91000÷5=18200。
Q4. SELECT文の各句が処理される順序として正しいものはどれか。
✅ 正解は②。SQLの実際の処理順序はFROM(テーブル特定)→WHERE(行絞り込み)→GROUP BY(グループ化)→HAVING(グループ絞り込み)→SELECT(列選択)→ORDER BY(並び替え)です。書く順序と処理順序が異なるため、WHERE句にSUM()などの集計関数は使えません(集計はSELECT処理時のため)。
Q5. LIKE演算子で「名前が"田"で始まる"」を検索する正しい条件はどれか。
✅ 正解は②。LIKEのワイルドカード:「%」は0文字以上の任意文字列、「_」(アンダースコア)は1文字のみ。「田%」は「田」で始まる任意の文字列(田中、田村、田代山 など)。「%田」は「田」で終わる文字列、「田_」は「田」+1文字のみ(田中、田辺 は一致するが田中一郎 は不一致)。

Sponsor Link