2026年9月25日金曜日

SQLのJOIN と GROUP BYについて解説してください

 結論から言うと、JOIN と GROUP BY は SQL の“心臓部”です。 ここを理解すると、データ分析もアプリ開発も一気にレベルアップします。 しまさん向けに、具体例・図解イメージ・練習問題までセットで解説します。

🔗 JOIN(テーブル結合)を具体的に理解する

◆ JOIN の目的

複数のテーブルを組み合わせて、1つの結果を作るための操作。

例:

  • users(ユーザー情報)

  • orders(注文情報)

この2つを「ユーザーごとの注文一覧」にしたいときに JOIN を使う。

◆ テーブル例(イメージ)

users テーブル

idname
1田中
2佐藤
3鈴木

orders テーブル

iduser_idamount
115000
213000
328000

⭐ INNER JOIN(共通するデータだけ)

sql
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o
  ON u.id = o.user_id;

結果

nameamount
田中5000
田中3000
佐藤8000

ポイント

  • 注文があるユーザーだけが出る

  • 鈴木(id=3)は注文がないので結果に出ない

⭐ LEFT JOIN(左側を全部残す)

sql
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o
  ON u.id = o.user_id;

結果

nameamount
田中5000
田中3000
佐藤8000
鈴木NULL

ポイント

  • 左側(users)は全員出る

  • 注文がない鈴木は amount が NULL になる

📌 JOIN の理解を深めるコツ

  • INNER = 共通部分だけ

  • LEFT = 左側は必ず残す

  • ON の条件が JOIN の本体

  • WHERE を書くと結果が変わるので注意(LEFT JOIN の NULL が消える)

📊 GROUP BY(集計)を具体的に理解する

◆ GROUP BY の目的

同じ値を持つ行をまとめて、集計する。

例: 「ユーザーごとの注文数」 「月ごとの売上」 「商品カテゴリごとの平均価格」

◆ 例:ユーザーごとの注文数

sql
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;

結果

user_idorder_count
12
21

◆ JOIN と組み合わせると最強

sql
SELECT u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o
  ON u.id = o.user_id
GROUP BY u.id, u.name;

結果

nameorder_count
田中2
佐藤1
鈴木0

ポイント

  • LEFT JOIN を使うことで「注文がない人も 0 件」として出せる

  • GROUP BY は SELECT の中で使う列をすべて含める必要がある

🔥 GROUP BY の注意点(重要)

① WHERE と HAVING の違い

  • WHERE:集計前に絞る

  • HAVING:集計後に絞る

例:注文数が 2 件以上のユーザーだけ出す

sql
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 2;

🎯 JOIN と GROUP BY の関係を一言で言うと

  • JOIN = データを横に広げる

  • GROUP BY = データを縦にまとめる(集計)

この2つを使いこなすと、ほぼすべての実務的な SQL が書けるようになる。

📝 練習問題(しまさん向け)

実際に手を動かすと理解が一気に深まる。

【問題1】

ユーザー名と、そのユーザーの注文合計金額を出してください。

期待する結果:

nametotal_amount
田中8000
佐藤8000
鈴木0

【問題2】

注文が 1 件以上あるユーザーだけを表示してください。

【問題3】

注文金額が 5000 以上の注文を持つユーザー名を表示してください。

👉 次のステップ

しまさん、 実際に SQL を書いてみたいですか? それとも JOIN と GROUP BY の理解をさらに深めるための図解や例題を増やしたいですか?

どちらでも進めます。

0 件のコメント:

コメントを投稿