結論から言うと、JOIN と GROUP BY は SQL の“心臓部”です。 ここを理解すると、データ分析もアプリ開発も一気にレベルアップします。 しまさん向けに、具体例・図解イメージ・練習問題までセットで解説します。
🔗 JOIN(テーブル結合)を具体的に理解する
◆ JOIN の目的
複数のテーブルを組み合わせて、1つの結果を作るための操作。
例:
users(ユーザー情報)
orders(注文情報)
この2つを「ユーザーごとの注文一覧」にしたいときに JOIN を使う。
◆ テーブル例(イメージ)
users テーブル
| id | name |
|---|---|
| 1 | 田中 |
| 2 | 佐藤 |
| 3 | 鈴木 |
orders テーブル
| id | user_id | amount |
|---|---|---|
| 1 | 1 | 5000 |
| 2 | 1 | 3000 |
| 3 | 2 | 8000 |
⭐ INNER JOIN(共通するデータだけ)
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o
ON u.id = o.user_id;
結果
| name | amount |
|---|---|
| 田中 | 5000 |
| 田中 | 3000 |
| 佐藤 | 8000 |
ポイント
注文があるユーザーだけが出る
鈴木(id=3)は注文がないので結果に出ない
⭐ LEFT JOIN(左側を全部残す)
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;
結果
| name | amount |
|---|---|
| 田中 | 5000 |
| 田中 | 3000 |
| 佐藤 | 8000 |
| 鈴木 | NULL |
ポイント
左側(users)は全員出る
注文がない鈴木は amount が NULL になる
📌 JOIN の理解を深めるコツ
INNER = 共通部分だけ
LEFT = 左側は必ず残す
ON の条件が JOIN の本体
WHERE を書くと結果が変わるので注意(LEFT JOIN の NULL が消える)
📊 GROUP BY(集計)を具体的に理解する
◆ GROUP BY の目的
同じ値を持つ行をまとめて、集計する。
例: 「ユーザーごとの注文数」 「月ごとの売上」 「商品カテゴリごとの平均価格」
◆ 例:ユーザーごとの注文数
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;
結果
| user_id | order_count |
|---|---|
| 1 | 2 |
| 2 | 1 |
◆ JOIN と組み合わせると最強
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;
結果
| name | order_count |
|---|---|
| 田中 | 2 |
| 佐藤 | 1 |
| 鈴木 | 0 |
ポイント
LEFT JOIN を使うことで「注文がない人も 0 件」として出せる
GROUP BY は SELECT の中で使う列をすべて含める必要がある
🔥 GROUP BY の注意点(重要)
① WHERE と HAVING の違い
WHERE:集計前に絞る
HAVING:集計後に絞る
例:注文数が 2 件以上のユーザーだけ出す
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】
ユーザー名と、そのユーザーの注文合計金額を出してください。
期待する結果:
| name | total_amount |
|---|---|
| 田中 | 8000 |
| 佐藤 | 8000 |
| 鈴木 | 0 |
【問題2】
注文が 1 件以上あるユーザーだけを表示してください。
【問題3】
注文金額が 5000 以上の注文を持つユーザー名を表示してください。
👉 次のステップ
しまさん、 実際に SQL を書いてみたいですか? それとも JOIN と GROUP BY の理解をさらに深めるための図解や例題を増やしたいですか?
どちらでも進めます。