🔗

【SQL】JOIN句の種類を具体例で整理してみた

に公開

はじめに

  • JOIN
  • INNER JOIN
  • OUTER JOIN
  • LEFT JOIN
  • RIGHT JOIN

たくさん種類があり、混同しがちなJOIN句の種類を整理していきたいと思います。

JOINを分類する

まずJOINは大きく2つに分類できます。

  • INNER JOIN (内部結合)
  • OUTER JOIN (外部結合)

そして、OUTER JOINの中にLEFT JOINとRIGHT JOINが含まれます。
また、JOINはINNER JOINの省略形であり、同じ意味となります。

つまり、以下のように整理できます。

  • INNER JOIN = JOIN
  • OUTER JOIN
    • LEFT JOIN
    • RIGHT JOIN

実際にクエリとして使うなら、JOIN、LEFT JOIN、RIGHT JOINの3つになると思います。

テーブル例

それぞれのJOIN句について説明するために、以下2つのテーブルを例として使用します。

users (ユーザー一覧)

user_id name
1 Aさん
2 Bさん
3 Cさん

orders (注文一覧)

order_id user_id item
101 1
102 1 ペン
103 2 ノート
104 4 バッグ

JOIN (INNER JOIN)

両方のデータに存在するデータのみを取得します。

SELECT *
FROM users u
JOIN orders o
 ON u.user_id = o.user_id;

結果: 両方のテーブルに存在するuser_idが1と2のみが取得されました。

user_id name order_id item
1 Aさん 101
1 Aさん 102 ペン
2 Bさん 103 ノート

LEFT JOIN (OUTER JOIN)

左側のテーブル(usersテーブル)はすべて取得し、一致した右側のテーブル(ordersテーブル)が結合されます。もし一致しなければNULLに置き換えられます。

SELECT *
FROM users u
LEFT JOIN orders o
 ON u.user_id = o.user_id;

結果: user_id = 3の注文は存在しないため、orders側がNULLになります。

user_id name order_id item
1 Aさん 101
1 Aさん 102 ペン
2 Bさん 103 ノート
3 Cさん NULL NULL

RIGHT JOIN (OUTER JOIN)

LEFT JOINの逆です。
右側のテーブル(ordersテーブル)はすべて取得し、一致した左側のテーブル(usersテーブル)が結合されます。もし一致しなければNULLに置き換えられます。

SELECT *
FROM users u
RIGHT JOIN orders o
 ON u.user_id = o.user_id;

結果: user_id = 4のユーザーは存在しないため、users側がNULLになります。

user_id name order_id item
1 Aさん 101
1 Aさん 102 ペン
2 Bさん 103 ノート
NULL NULL 104 バッグ

まとめ

最後に、それぞれのJOINの特徴を簡単に表にまとめました。

JOINの種類 取得されるデータ 一致しない場合
JOIN 両方に存在するデータのみ 結果に含まれない
LEFT JOIN 左側は全件 + 右側の一致分 右側がNULLになる
RIGHT JOIN 右側は全件 + 左側の一致分 左側がNULLになる

Discussion