🔗
【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