SQLのJOINを完全理解!初心者でもわかるJOINの種類と使い方
データベースで複数のテーブルを結合する際に使われる JOIN(ジョイン)。
SQLの中でも重要な概念ですが、初心者には 「INNER JOINとLEFT JOINの違いは?」「OUTER JOINって何?」 など、少し分かりにくい部分もあります。
この記事では、JOINの種類と使い方を初心者向けに解説 します!
実際のデータを使って視覚的に理解できるように説明するので、ぜひ最後まで読んでみてください!
🔹 1. JOINとは?
📌 JOINの基本
JOINとは、複数のテーブルを結合して1つの結果セットを作成する SQLの機能です。
リレーショナルデータベースでは、データを複数のテーブルに分けて管理 するため、必要に応じてデータを結合する必要があります。
例えば、以下の users テーブルと orders テーブル を考えます。
📝 users テーブル
| user_id | name | |
|---|---|---|
| 1 | 中野 | tanaka@example.com |
| 2 | 哲平 | suzuki@example.com |
| 3 | 佐藤 | sato@example.com |
📝 orders テーブル
| order_id | user_id | product |
|---|---|---|
| 101 | 1 | ノートPC |
| 102 | 1 | スマートフォン |
| 103 | 2 | タブレット |
👉 この2つのテーブルを結合して「ユーザー名」と「購入した商品」を取得 する場合、JOINを使います!
🔹 2. JOINの種類と使い方
SQLのJOINには、以下の 5種類 があります。
| JOINの種類 | 説明 |
|---|---|
| INNER JOIN | 両方のテーブルに一致するデータだけを取得 |
| LEFT JOIN | 左側のテーブルのデータをすべて取得し、一致しない場合はNULL |
| RIGHT JOIN | 右側のテーブルのデータをすべて取得し、一致しない場合はNULL |
| FULL OUTER JOIN | 両方のテーブルのすべてのデータを取得 |
| CROSS JOIN | 両方のテーブルのすべての組み合わせ(直積)を取得 |
それでは、1つずつ見ていきましょう!
✅ 2-1. INNER JOIN(内部結合)
📌 特徴
- 両方のテーブルに一致するデータだけを取得 する
- 一致しないデータは無視される
📌 SQL
SELECT users.user_id, users.name, orders.product
FROM users
INNER JOIN orders ON users.user_id = orders.user_id;
📌 結果
| user_id | name | product |
|---|---|---|
| 1 | 哲平 | ノートPC |
| 1 | 中野 | スマートフォン |
| 2 | 鈴木 | タブレット |
👉 ユーザーIDが一致するデータのみ取得され、「佐藤(user_id=3)」は注文がないため表示されない!
✅ 2-2. LEFT JOIN(左外部結合)
📌 特徴
- 左側のテーブル(
users)のデータはすべて取得 - 一致するデータがない場合は
NULLが入る
📌 SQL
SELECT users.user_id, users.name, orders.product
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id;
📌 結果
| user_id | name | product |
|---|---|---|
| 1 | 田中 | ノートPC |
| 1 | 田中 | スマートフォン |
| 2 | 鈴木 | タブレット |
| 3 | 佐藤 | NULL |
👉 「佐藤(user_id=3)」は注文がないため、NULL が表示される!
📌 どんなときに使う?
- すべてのユーザーを取得し、注文がないユーザーも表示する場合
- 「データがないこと」も考慮して分析したいとき
✅ 2-3. RIGHT JOIN(右外部結合)
📌 特徴
- 右側のテーブル(
orders)のデータはすべて取得 - 一致するデータがない場合は
NULLが入る
📌 SQL
SELECT users.user_id, users.name, orders.product
FROM users
RIGHT JOIN orders ON users.user_id = orders.user_id;
📌 結果
| user_id | name | product |
|---|---|---|
| 1 | 田中 | ノートPC |
| 1 | 田中 | スマートフォン |
| 2 | 鈴木 | タブレット |
👉 この例では orders にすべての user_id が存在するため、RIGHT JOIN でも INNER JOIN と同じ結果になる
👉 「ユーザーがいないのに存在する注文」などがある場合に NULL が表示される
✅ 2-4. FULL OUTER JOIN(完全外部結合)
📌 特徴
- 両方のテーブルのすべてのデータを取得
- 一致しないデータは
NULLになる
📌 SQL
SELECT users.user_id, users.name, orders.product
FROM users
FULL OUTER JOIN orders ON users.user_id = orders.user_id;
📌 結果
| user_id | name | product |
|---|---|---|
| 1 | 田中 | ノートPC |
| 1 | 田中 | スマートフォン |
| 2 | 鈴木 | タブレット |
| 3 | 佐藤 | NULL |
👉 LEFT JOIN と RIGHT JOIN を組み合わせたような結果!
👉 「どちらのテーブルにも存在しないデータ」も取得できる
📌 どんなときに使う?
- すべてのデータを結合したいとき
- どちらかのテーブルにしかないデータも取得したい場合
📌 注意点
- MySQL では
FULL OUTER JOINをサポートしていない(UNIONを使って実現)
✅ 2-5. CROSS JOIN(クロス結合)
📌 特徴
- 両方のテーブルのすべての組み合わせを取得
- 条件がないため、データ量が爆発的に増える
📌 SQL
SELECT users.name, orders.product
FROM users
CROSS JOIN orders;
📌 結果
| name | product |
|---|---|
| 田中 | ノートPC |
| 田中 | スマートフォン |
| 田中 | タブレット |
| 鈴木 | ノートPC |
| 鈴木 | スマートフォン |
| 佐藤 | タブレット |
👉 すべてのユーザーとすべての注文の組み合わせが作成される!
🔹 まとめ
| JOINの種類 | 特徴 |
|---|---|
| INNER JOIN | 一致するデータのみ取得 |
| LEFT JOIN | 左のテーブルをすべて取得(NULLあり) |
| RIGHT JOIN | 右のテーブルをすべて取得(NULLあり) |
| FULL OUTER JOIN | 両方のデータをすべて取得 |
| CROSS JOIN | すべての組み合わせを取得 |
JOINを適切に使いこなせると、データをより効率的に取得できます! 🚀
Discussion