SQL基本(SELECT)
まず結論
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) | |||
|---|---|---|---|
| id | category | amount | month |
| 1 | 食品 | 5000 | 4 |
| 2 | 家電 | 30000 | 4 |
| 3 | 食品 | 8000 | 5 |
| 4 | 家電 | 45000 | 5 |
| 5 | 食品 | 3000 | 5 |
-- 例1:食品のデータを金額降順で取得
SELECT id, amount
FROM sales
WHERE category = '食品'
ORDER BY amount DESC;
| id | amount |
|---|---|
| 3 | 8000 |
| 1 | 5000 |
| 5 | 3000 |
GROUP BY・HAVING・集計関数
-- 例2:カテゴリ別の合計金額(合計10000以上のみ)
SELECT category, SUM(amount) AS total
FROM sales
GROUP BY category
HAVING SUM(amount) >= 10000
ORDER BY total DESC;
| category | total |
|---|---|
| 家電 | 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);
🎯 試験での出方
- SQLを実行した結果の表を選ぶ問題(GROUP BYのHAVINGが頻出)
- 「WHEREとHAVINGの違い」→ WHEREは行の絞り込み、HAVINGはグループの絞り込み
- 「SELECT DISTINCTの効果」→ 重複行を除いた結果を返す
- 「COUNT(*)とCOUNT(列名)の違い」→ COUNT(*)はNULL含む全行、COUNT(列名)はNULL除外
⚠️ よくある間違い
- 「HAVINGはWHEREと同じタイミングで実行」→ ✗ HAVINGはGROUP BY後に実行。WHEREではSUM()等の集計関数は使えない
- 「ORDER BY DESC は昇順」→ ✗ DESCは降順(大→小)。ASCが昇順(小→大、省略可)
- 「GROUP BYなしでHAVINGが使える」→ ✗ HAVINGはGROUP BY句と組み合わせて使う
✍️ 確認クイズ
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