【Day35】SQLの集約(SUM・COUNT)と結合(JOIN)を攻略!

投稿者: | 2025年9月10日

今日は 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:おもちゃ箱と名前シールを「同じ番号」でつなげて、誰のおもちゃか分かるようにする

基本情報技術者試験JOINイメージ図 ここならどっとこむ
午後の問題は特に大切!

🔹 午前問題の過去問

過去問①(令和2年・秋・午前)

次のSQL文の説明として正しいものはどれか。

SELECT 部署, COUNT(*) 
FROM 社員
GROUP BY 部署
HAVING COUNT(*) >= 10;
  1. 部署ごとの社員数を数え、社員が10人以上いる部署だけ表示する
  2. 部署ごとの社員数を数え、社員が10人未満の部署だけ表示する
  3. 部署を重複なく表示する
  4. 社員数が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」が鉄板