【SQL】INNER JOIN / LEFT JOIN の違いを解説
はじめに
SQLでテーブル同士を結合するときによく使われる JOIN
。
中でも INNER JOIN
と LEFT JOIN
は、実務でも頻繁に登場する代表的な結合方法です。
ただ、実際に使っていると、
- 「
INNER JOIN
とLEFT JOIN
の違いがよくわからない」 - 「とりあえず書いて動けばいい」
ということもあるのではないでしょうか?
本記事では、INNER JOIN
とLEFT JOIN
の違いを実例ベースで整理します。
JOIN
とは
1. JOIN
とは、複数のテーブルのデータを条件に従って「つなげて」使う機能です。
例えば、以下のような users
と orders
のテーブルがあるとします。
users
テーブル
id | name |
---|---|
1 | 山田 |
2 | 佐藤 |
3 | 鈴木 |
orders
テーブル
id | user_id | amount |
---|---|---|
101 | 1 | 5000 |
102 | 2 | 3000 |
103 | 4 | 7000 |
このとき、users.id
と orders.user_id
をもとに
「誰がいくら注文したか」を一覧にするには JOIN
を使います。
INNER JOIN
:両方に一致するデータだけを取得
2. SELECT
users.id AS user_id,
users.name,
orders.id AS order_id,
orders.amount
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
✅ 結果
user_id | name | order_id | amount |
---|---|---|---|
1 | 山田 | 101 | 5000 |
2 | 佐藤 | 102 | 3000 |
両方のテーブルに共通して存在するデータだけが抽出されます。
-
users.id = orders.user_id
が一致する行のみ対象になります。 - 注文のないユーザー(例:
users.id = 3
)や、存在しないユーザーに紐づいた注文(例:orders.user_id = 4
)は、結果に含まれません。
LEFT JOIN
:左のテーブルは全て表示、右がなければNULL
3. SELECT
users.id AS user_id,
users.name,
orders.id AS order_id,
orders.amount
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;
✅ 結果
user_id | name | order_id | amount |
---|---|---|---|
1 | 山田 | 101 | 5000 |
2 | 佐藤 | 102 | 3000 |
3 | 鈴木 | NULL |
NULL |
左側のテーブル(ここでは users
)のデータは必ず出力されます。
対応する orders
のデータがない場合は NULL
が入ります。
🔸 「左側のテーブル」とは、
FROM
に書かれたテーブルのことです。
この例ではFROM users
と書かれているため、users
がLEFT JOIN
の基準になります。
- 「全てのユーザーを一覧で表示し、注文があれば表示したい」ときに便利です。
4. 実務における使い分けのイメージ
目的 | 使うJOIN
|
---|---|
両方のテーブルに一致するものだけが欲しい | INNER JOIN |
片方(たとえばユーザー)を全部出して、もう片方の有無を見たい | LEFT JOIN |
JOIN
について
5. その他のJOIN
には他にもいくつか種類があります。
RIGHT JOIN
補足:RIGHT JOIN
は LEFT JOIN
の逆で、「右側のテーブルのデータを全て表示する」JOIN
です。
ただし、LEFT JOIN
を左右のテーブルを入れ替えて使えば同じ結果が得られるため、
実務で RIGHT JOIN
を使うことはあまり多くありません。
たとえば以下のように、orders
を基準にして users
を結合することで、
RIGHT JOIN
相当の結果を LEFT JOIN
で得ることができます。
SELECT
orders.id AS order_id,
orders.user_id AS order_user_id,
orders.amount,
users.id AS user_id,
users.name
FROM orders
LEFT JOIN users
ON users.id = orders.user_id;
✅ 結果
order_id | order_user_id | amount | user_id | name |
---|---|---|---|---|
101 | 1 | 5000 | 1 | 山田 |
102 | 2 | 3000 | 2 | 佐藤 |
103 | 4 | 7000 | NULL |
NULL |
-
orders
にある全ての注文が表示されます -
user_id = 4
はusers
に存在しないため、user_id
とname
はNULL
になります
このように、orders
を基準にした LEFT JOIN
を使うことで、
RIGHT JOIN
と同様の結果を得ることができます。
🔸 「右側のテーブルにあるデータをすべて表示したい」場合は、
LEFT JOIN
を使ってテーブルの順番を入れ替えるのが一般的です。
JOIN
(概要のみ)
その他の
JOIN の種類 |
説明 |
---|---|
FULL OUTER JOIN |
両方のテーブルに存在するすべてのデータを含む(片方だけでも含める) |
CROSS JOIN |
両テーブルの全組み合わせ(掛け算)を取得 |
SELF JOIN |
同じテーブル同士を結合して使う(親子構造などで利用) |
本記事では、使う頻度が高い INNER JOIN
と LEFT JOIN
を中心に解説しました。
おわりに
JOIN
の種類はたくさんありますが、
INNER JOIN
と LEFT JOIN
の違いを理解して使い分けられることが実務ではとても大切です。
今回は「何が出力されて、何が出力されないか」という観点で整理しました。
また実際にクエリを書いてみると、より理解が深まります。
本記事が参考になれば幸いです。
Discussion