ChatGPTで出力、整形、追記。
AP科目B向けに、頻出ポイントを実践寄りに整理。
1. SELECT文の基本形
SELECT 列名
FROM 表名
JOIN 表名
ON 結合条件
WHERE 条件
GROUP BY 列名
HAVING 集約条件
ORDER BY 列名;
各句の意味
| 句 | 意味 |
|---|---|
| SELECT | 表示する列 |
| FROM | どの表を使うか |
| JOIN | どの表と結合するか |
| ON | どう結合するか |
| WHERE | 行を条件で絞る |
| GROUP BY | 同じ値ごとにまとめる |
| HAVING | グループ化後の条件 |
| ORDER BY | 並び替え |
2. SQLの実行順序(最重要)
SQLは上から読まれない。
FROM
↓
JOIN
↓
ON
↓
WHERE
↓
GROUP BY
↓
HAVING
↓
SELECT
↓
ORDER BY
超重要ポイント
SELECTは最後付近で実行される。
SELECT AVG(score)
と最初に書いてあっても、
実際は:
FROM
→ WHERE
→ GROUP BY
→ HAVING
→ SELECT
の順。
3. 実行順序の具体例
SELECT dept, AVG(test.score)
FROM test
JOIN test2
ON test.id = test2.id
WHERE test.score >= 60
GROUP BY dept
HAVING AVG(test.score) >= 70
ORDER BY AVG(test.score);
処理順
1. FROM
test表を読む。
2. JOIN
test2表と結合することを宣言。
3. ON
ON test.id = test2.id
idが一致する行同士を結合。
4. WHERE
WHERE test.score >= 60
60未満の行を除外。
5. GROUP BY
GROUP BY dept
部署ごとにまとめる。
6. HAVING
HAVING AVG(test.score) >= 70
平均70以上のグループだけ残す。
7. SELECT
表示列を決定。
8. ORDER BY
並び替え。
4. WHERE句
意味
行単位で条件を指定。
引数は論理値である事。
TRUEの行で絞り込む。
WHERE score >= 60
比較演算子
| 演算子 | 意味 |
|---|---|
| = | 等しい |
| <> | 等しくない |
| > | より大きい |
| < | より小さい |
| >= | 以上 |
| <= | 以下 |
AND / OR
WHERE age >= 20 AND age < 30
| 演算子 | 意味 |
|---|---|
| AND | 両方満たす |
| OR | どちらか満たす |
BETWEEN
WHERE score BETWEEN 60 AND 100
→ 60〜100
IN
WHERE dept IN ('営業', '開発')
ORの省略形イメージ。
WHERE dept='営業' OR dept='開発'
LIKE(部分一致)
WHERE name LIKE '田%'
| 記号 | 意味 |
|---|---|
| % | 0文字以上 |
| _ | 1文字 |
例
LIKE '田%'
→ 田中、田村
LIKE '%田%'
→ 山田、田中
5. NULL(超重要)
NULL = 「値が存在しない」
0や空文字ではない。
NG
WHERE col = NULL
NULLは = で比較できない。
OK
WHERE col IS NULL
WHERE col IS NOT NULL
三値論理
NULL = NULL
→ TRUEではない
→ UNKNOWN
6. ORDER BY句
意味
並び替え。
ORDER BY score DESC
| 指定 | 意味 |
|---|---|
| ASC | 昇順 |
| DESC | 降順 |
複数指定
ORDER BY dept ASC, score DESC
列番号指定
SELECT name, score
FROM test
ORDER BY 2 DESC;
→ 2列目(score)で降順。
7. 集約関数
意味
複数行をまとめて計算。
| 関数 | 意味 |
|---|---|
| COUNT(*) | 全行数 |
| COUNT(col) | NULL以外件数 |
| SUM(col) | 合計 |
| AVG(col) | 平均 |
| MAX(col) | 最大 |
| MIN(col) | 最小 |
8. NULLと集約関数
NULLは基本無視
AVG(score)
SUM(score)
MAX(score)
MIN(score)
→ NULL無視。
COUNT(*)だけ特殊
データ:
| score |
|---|
| 80 |
| NULL |
| 60 |
COUNT(*)
→ 3
COUNT(score)
→ 2
9. GROUP BY句(最重要)
意味
同じ値ごとにまとめる。
SELECT dept, AVG(score)
FROM test
GROUP BY dept;
10. GROUP BYの超重要ルール
SELECTに書けるのは:
- GROUP BYした列
- 集約関数
のみ。
OK
SELECT dept, AVG(score)
FROM test
GROUP BY dept;
NG
SELECT name, AVG(score)
FROM test
GROUP BY dept;
nameが1つに決まらない。
11. HAVING句
意味
GROUP BY後の条件。
HAVING AVG(score) >= 70
12. WHEREとHAVINGの違い
| 句 | 対象 |
|---|---|
| WHERE | 行 |
| HAVING | グループ |
WHEREは集約前
WHERE score >= 60
HAVINGは集約後
HAVING AVG(score) >= 70
NG例
WHERE AVG(score) >= 70
WHERE時点ではまだ集約されていない。
13. JOIN(最重要)
意味
複数表を結合。
INNER JOIN
SELECT *
FROM A
INNER JOIN B
ON A.id = B.id;
一致した行だけ。
LEFT JOIN
SELECT *
FROM A
LEFT JOIN B
ON A.id = B.id;
左表は全部残す。
一致しない右側はNULL。
14. JOIN種類まとめ
| 種類 | 意味 |
|---|---|
| INNER JOIN | 一致した行のみ |
| LEFT JOIN | 左表を全部残す |
15. JOINで件数増加(頻出)
A
| id |
|---|
| 1 |
B
| id |
|---|
| 1 |
| 1 |
SELECT *
FROM A
JOIN B
ON A.id = B.id;
結果:
| id |
|---|
| 1 |
| 1 |
→ 1対多では件数増加。
16. ON句
意味
JOIN条件。
ON A.id = B.id
17. LEFT JOIN + NULL(超頻出)
存在しないデータを探す
SELECT A.id
FROM A
LEFT JOIN B
ON A.id = B.id
WHERE B.id IS NULL;
→ Bに存在しないA。
18. ON と WHERE の違い(超重要)
ONに書く
LEFT JOIN B
ON A.id = B.id
AND B.type = 'X'
→ Aは全部残る。
WHEREに書く
LEFT JOIN B
ON A.id = B.id
WHERE B.type = 'X'
→ NULL行消滅。
→ INNER JOIN化しやすい。
19. 表の別名
FROM employee e
employee を e として扱う。
JOINで頻出
SELECT e.name, d.dept_name
FROM employee e
JOIN dept d
ON e.dept_id = d.id;
20. 自己結合
同じ表を2回使う。
FROM employee e1
JOIN employee e2
ON e1.manager_id = e2.id
21. DISTINCT
意味
重複削除。
SELECT DISTINCT dept
FROM employee;
22. DISTINCT と GROUP BY
SELECT DISTINCT dept
FROM employee;
と
SELECT dept
FROM employee
GROUP BY dept;
は似た結果。
| 機能 | 意味 |
|---|---|
| DISTINCT | 重複削除 |
| GROUP BY | 集約前提 |
23. 副問い合わせ
SQLの中にSQLを書く
単一行副問い合わせ
SELECT name
FROM employee
WHERE score >= (
SELECT AVG(score)
FROM employee
);
複数行副問い合わせ
SELECT name
FROM employee
WHERE dept_id IN (
SELECT id
FROM dept
);
24. EXISTS
意味
存在確認。
WHERE EXISTS (
SELECT *
FROM B
)
25. EXISTS と IN の違い
| 演算子 | 特徴 |
|---|---|
| IN | 値比較 |
| EXISTS | 存在確認 |
26. CASE式
if文みたいな分岐
CASE
WHEN score >= 80 THEN 'A'
WHEN score >= 60 THEN 'B'
ELSE 'C'
END
27. UNION
結果を縦結合
SELECT name FROM A
UNION
SELECT name FROM B
28. INSERT
INSERT INTO employee(id, name)
VALUES(1, '田中');
29. UPDATE
UPDATE employee
SET salary = 300000
WHERE id = 1;
超危険
WHERE忘れると全更新。
30. DELETE
DELETE FROM employee
WHERE id = 1;
超危険
WHERE忘れると全削除。
31. AP頻出読み替え辞典
| 問題文 | 疑うもの |
|---|---|
| 〜ごと | GROUP BY |
| 平均以上 | 副問い合わせ |
| 存在しない | LEFT JOIN + NULL |
| 件数 | COUNT(*) |
| 並び替え | ORDER BY |
| 条件で絞る | WHERE |
| 重複除去 | DISTINCT |
| 存在する | EXISTS |
| 該当なしも含む | LEFT JOIN |
32. AP超頻出ひっかけ
LEFT JOIN後のWHERE
FROM A
LEFT JOIN B
ON A.id = B.id
WHERE B.id IS NOT NULL
→ INNER JOINっぽくなる。
LEFT JOINの意味が薄れる。
33. 最低限覚えるテンプレ
JOIN
SELECT *
FROM A
JOIN B
ON A.id = B.id;
GROUP BY
SELECT dept, AVG(score)
FROM test
GROUP BY dept;
HAVING
HAVING AVG(score) >= 70
副問い合わせ
WHERE score >= (
SELECT AVG(score)
FROM test
)
34. AP対策コツ
- SELECTよりFROMから読む
- 実行順序を常に意識
- 「〜ごと」→ GROUP BY
- 「存在しない」→ LEFT JOIN + NULL
- GROUP BY時のSELECT制限注意
- NULL関連を最優先警戒
- JOIN後の件数変化を見る
- WHEREとHAVINGを混同しない
- LEFT JOIN後のWHEREに注意
35. 優先順位
最優先
- JOIN
- GROUP BY
- HAVING
- 副問い合わせ
- NULL
次点
- CASE
- DISTINCT
- ORDER BY
- EXISTS
- UPDATE / DELETE