🔖

【SQL】INNER JOIN / LEFT JOIN の違いを解説

に公開

はじめに

SQLでテーブル同士を結合するときによく使われる JOIN
中でも INNER JOINLEFT JOIN は、実務でも頻繁に登場する代表的な結合方法です。

ただ、実際に使っていると、

  • INNER JOINLEFT JOINの違いがよくわからない」
  • 「とりあえず書いて動けばいい」

ということもあるのではないでしょうか?

本記事では、INNER JOINLEFT JOINの違いを実例ベースで整理します。

1. JOINとは

JOINとは、複数のテーブルのデータを条件に従って「つなげて」使う機能です。

例えば、以下のような usersorders のテーブルがあるとします。

users テーブル

id name
1 山田
2 佐藤
3 鈴木

orders テーブル

id user_id amount
101 1 5000
102 2 3000
103 4 7000

このとき、users.idorders.user_id をもとに
「誰がいくら注文したか」を一覧にするには JOIN を使います。


2. INNER JOIN:両方に一致するデータだけを取得

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)は、結果に含まれません。

3. LEFT JOIN:左のテーブルは全て表示、右がなければNULL

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 と書かれているため、usersLEFT JOIN の基準になります。

  • 「全てのユーザーを一覧で表示し、注文があれば表示したい」ときに便利です。

4. 実務における使い分けのイメージ

目的 使うJOIN
両方のテーブルに一致するものだけが欲しい INNER JOIN
片方(たとえばユーザー)を全部出して、もう片方の有無を見たい LEFT JOIN

5. その他のJOINについて

JOINには他にもいくつか種類があります。

補足:RIGHT JOIN

RIGHT JOINLEFT 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 = 4users に存在しないため、user_idnameNULL になります

このように、orders を基準にした LEFT JOIN を使うことで、
RIGHT JOIN と同様の結果を得ることができます。

🔸 「右側のテーブルにあるデータをすべて表示したい」場合は、
LEFT JOIN を使ってテーブルの順番を入れ替えるのが一般的です。

その他のJOIN(概要のみ)

JOINの種類 説明
FULL OUTER JOIN 両方のテーブルに存在するすべてのデータを含む(片方だけでも含める)
CROSS JOIN 両テーブルの全組み合わせ(掛け算)を取得
SELF JOIN 同じテーブル同士を結合して使う(親子構造などで利用)

本記事では、使う頻度が高い INNER JOINLEFT JOIN を中心に解説しました。

おわりに

JOINの種類はたくさんありますが、
INNER JOINLEFT JOIN の違いを理解して使い分けられることが実務ではとても大切です。

今回は「何が出力されて、何が出力されないか」という観点で整理しました。
また実際にクエリを書いてみると、より理解が深まります。

本記事が参考になれば幸いです。

次に読みたい

Discussion