今日は SQL の 集約(グループ化してまとめる) と 結合(表と表をつなげる) を解説します。
この2つは 午後問題の必須パート。基本をしっかり押さえたいところ。
この記事で分かること(目次)
🔹 集約関数(Aggregate Functions)
集約関数は、たくさんのデータをまとめて「合計・平均・最大・最小・件数」を出す命令。
よく使う関数
COUNT(*):件数を数えるSUM(列):合計AVG(列):平均MAX(列):最大値MIN(列):最小値
👉 例:「生徒の平均年齢を出す」
SELECT AVG(Age) FROM Student;
👉 例:「生徒の人数を数える」
SELECT COUNT(*) FROM Student;
🔹 GROUP BY(グループ化)
GROUP BY を使うと、ある列ごとにグループを作って集計できる。
👉 例:「学年ごとに生徒の人数を数える」
SELECT Grade, COUNT(*)
FROM Student
GROUP BY Grade;
👉 結果:
- 1年生 → 120人
- 2年生 → 110人
- 3年生 → 100人
🔹 HAVING(条件付き集約)
集計結果に条件をつけたいときに使う。
👉 例:「人数が100人以上いる学年だけ表示」
SELECT Grade, COUNT(*)
FROM Student
GROUP BY Grade
HAVING COUNT(*) >= 100;
🔹 結合(JOIN)
データベースは複数のテーブルに分けて設計するので、必要に応じて結合します。
内部結合(INNER JOIN)
👉 共通するデータだけを取り出す。
SELECT S.Name, C.ClassName
FROM Student S
INNER JOIN Class C
ON S.ClassID = C.ClassID;
→ 「生徒とクラス表を結合して、生徒が所属するクラス名を表示」
外部結合(LEFT JOIN / RIGHT JOIN)
👉 片方にしかないデータも残す。
SELECT S.Name, C.ClassName
FROM Student S
LEFT JOIN Class C
ON S.ClassID = C.ClassID;
→ クラスにまだ割り当てられていない生徒も表示される。
🔹 幼稚園児的なたとえ
- 集約:お菓子を「1人ずつ」数える → 合計する → 平均を出す
- GROUP BY:クラスごとにお菓子を数える
- HAVING:たくさんもらったクラス(50個以上)だけ発表する
- JOIN:おもちゃ箱と名前シールを「同じ番号」でつなげて、誰のおもちゃか分かるようにする

🔹 午前問題の過去問
過去問①(令和2年・秋・午前)
次のSQL文の説明として正しいものはどれか。
SELECT 部署, COUNT(*)
FROM 社員
GROUP BY 部署
HAVING COUNT(*) >= 10;
- 部署ごとの社員数を数え、社員が10人以上いる部署だけ表示する
- 部署ごとの社員数を数え、社員が10人未満の部署だけ表示する
- 部署を重複なく表示する
- 社員数が10人の部署だけ表示する
➡️ 正解:1
🔹 午後問題の過去問
過去問例(令和元年・秋・午後)
商品テーブル(商品ID, 商品名)と販売テーブル(商品ID, 数量)がある。
商品ごとの販売数量合計を求めるSQLはどれか。
➡️ 解答例:
SELECT P.商品名, SUM(S.数量)
FROM 商品 P
INNER JOIN 販売 S
ON P.商品ID = S.商品ID
GROUP BY P.商品名;
👉 JOIN + GROUP BY + SUM の組み合わせは午後問題の王道!
🔹 まとめ
- 集約関数 → SUM, COUNT, AVG, MAX, MIN
- GROUP BY でグループ化、HAVING で条件
- JOIN でテーブルをつなげる
- 午後問題は「JOIN + GROUP BY」が鉄板
