SQLで複数のテーブルを結合してデータを取得したい場合、欠かせないのが「JOIN」構文です。しかし、INNER・LEFT・RIGHT・FULLと種類が多く、「どれを選べば良いかわからない…」という悩みをよく聞きます。
本記事では、各JOINの違いを図解付きでわかりやすく解説します。
✅JOINとは?
JOINとは、複数のテーブルを条件に基づいて結び付ける操作です。
たとえば、「社員テーブル」と「部署テーブル」を組み合わせて、社員名と部署名を一覧表示するといったケースが典型例です。
✅テスト用テーブル(例)
| 社員テーブル(employees) | 部署テーブル(departments) | |
|---|---|---|
| emp_id | emp_name | dept_id |
| 1 | 佐藤 | 10 |
| 2 | 鈴木 | 20 |
| 3 | 高橋 | 30 |
| 4 | 田中 | 40 |
✅1. INNER JOIN(内部結合)
👉 両方のテーブルで一致するデータのみ取得
✅結果(部署が存在するデータだけ表示)
| emp_name | dept_name |
|---|---|
| 佐藤 | 営業 |
| 鈴木 | 開発 |
| 高橋 | 総務 |
❌部署IDが40の田中さんは表示されません。
✅2. LEFT JOIN(左外部結合)
👉 左側テーブル(employees)を基準に、マッチしない行も取得
✅結果(左基準)
| emp_name | dept_name |
|---|---|
| 佐藤 | 営業 |
| 鈴木 | 開発 |
| 高橋 | 総務 |
| 田中 | NULL |
✔部署がない社員も「NULL」として表示されます。
✅3. RIGHT JOIN(右外部結合)
👉 右側テーブル(departments)を基準にマッチしない行も取得
✅結果(右基準)
| emp_name | dept_name |
|---|---|
| 佐藤 | 営業 |
| 鈴木 | 開発 |
| 高橋 | 総務 |
※部署側に存在しない社員は現れません。
✅4. FULL JOIN(完全外部結合)
👉 両テーブルのすべての行を対象に、合致しないデータも含めて取得
✅結果(両方)
| emp_name | dept_name |
|---|---|
| 佐藤 | 営業 |
| 鈴木 | 開発 |
| 高橋 | 総務 |
| 田中 | NULL |
💡※MySQLではFULL JOINは直接サポートされていないため、UNIONで代替します。
✅JOINの違いまとめ(図で理解)
| JOIN種類 | 取得範囲イメージ |
|---|---|
| INNER | 🎯一致する部分のみ |
| LEFT | 📘左テーブル全体+一致 |
| RIGHT | 📙右テーブル全体+一致 |
| FULL | 🌐両テーブルの全体 |
✅どれを使えば良い?
| シーン | オススメJOIN |
|---|---|
| 双方の共通データだけ欲しい | INNER JOIN |
| 左側を優先して一覧取得したい | LEFT JOIN |
| 右側を基準にしたい | RIGHT JOIN |
| すべてのデータを見たい | FULL JOIN |
✅まとめ
| JOIN | 特徴 |
|---|---|
| INNER | 共通する行のみ取得 |
| LEFT | 左基準で関連しない行も取得 |
| RIGHT | 右基準で関連しない行も取得 |
| FULL | 両テーブル全体を包括 |
👉まずは INNER JOINを基本とし、
「欠けているデータを埋めたいとき」にLEFT/RIGHTを検討すると理解しやすいです。
