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