はじめに
SQLの INNER JOIN、LEFT JOIN、RIGHT JOIN……
「何がどう違うの?」と聞かれるとちょっと不安。
この記事では、自分の頭の中を整理するために、JOINの基本的な種類と違いを簡単な例と一緒にまとめてみました。
JOINの「書き方の違い」について
SQLのJOINは、同じ意味でも書き方にバリエーションがあります。
省略形が使われることもあるので、違いを整理しておくと理解しやすくなります。
| JOINの種類 | 省略形 |
|---|---|
| INNER JOIN | JOIN |
| LEFT OUTER JOIN | LEFT JOIN |
| RIGHT OUTER JOIN | RIGHT JOIN |
| FULL OUTER JOIN | FULL JOIN |
| CROSS JOIN | なし |
INNER JOIN の場合は INNER を、OUTER JOIN の場合は OUTER を省略して記述することが可能です。
例えば、INNER JOIN は JOIN と、LEFT OUTER JOIN は LEFT JOIN と書くことができます。
使用するテーブルの例
- users テーブル
| id | name |
|---|---|
| 1 | 佐藤 |
| 2 | 朴 |
| 3 | スミス |
- orders テーブル
| id | user_id | item |
|---|---|---|
| 1 | 1 | 寿司 |
| 2 | 1 | 納豆 |
| 3 | 2 | キムチ |
| 4 | 4 | トムヤムクン |
INNER JOIN(内部結合)
INNER JOIN は「両方のテーブルにマッチするデータ」だけを取得します。
SELECT users.name, orders.item
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
| name | item |
|---|---|
| 佐藤 | 寿司 |
| 佐藤 | 納豆 |
| 朴 | キムチ |
スミス は注文がないので除外され、user_id=4 の トムヤムクン も users に存在しないため除外されます。
LEFT OUTER JOIN(左外部結合)
LEFT OUTER JOIN は「左側のテーブル(ここでは users)をすべて表示し、右側に対応するデータがなければ NULL にする」結合です。
SELECT users.name, orders.item
FROM users
LEFT OUTER JOIN orders
ON users.id = orders.user_id;
| name | item |
|---|---|
| 佐藤 | 寿司 |
| 佐藤 | 納豆 |
| 朴 | キムチ |
| スミス | NULL |
スミス は注文していないけれど、users に存在するので表示されます。
RIGHT OUTER JOIN(右外部結合)
RIGHT OUTER JOIN は「右側のテーブル(ここでは orders)をすべて表示し、左側に対応するデータがなければ NULL にする」結合です。
SELECT users.name, orders.item
FROM users
RIGHT OUTER JOIN orders
ON users.id = orders.user_id;
| name | item |
|---|---|
| 佐藤 | 寿司 |
| 佐藤 | 納豆 |
| 朴 | キムチ |
| NULL | トムヤムクン |
user_id=4 の トムヤムクン は users に該当しないため、name が NULL になります。
FULL OUTER JOIN(完全外部結合)
FULL OUTER JOIN は「両方のテーブルの全データを対象とし、一致しない部分は NULL で補完する」結合です。
SELECT users.name, orders.item
FROM users
FULL OUTER JOIN orders
ON users.id = orders.user_id;
※MySQL では直接使えないため、LEFT JOIN+RIGHT JOIN+UNION で代用します。
SELECT users.name, orders.item
FROM users
LEFT OUTER JOIN orders ON users.id = orders.user_id
UNION
SELECT users.name, orders.item
FROM users
RIGHT OUTER JOIN orders ON users.id = orders.user_id;
| name | item |
|---|---|
| 佐藤 | 寿司 |
| 佐藤 | 納豆 |
| 朴 | キムチ |
| スミス | NULL |
| NULL | トムヤムクン |
CROSS JOIN(クロス結合)
CROSS JOIN は「すべての行の組み合わせを返す」結合です。
users に3件、orders に4件ある場合、3 × 4 = 12件 が返されます。
SELECT users.name, orders.item
FROM users
CROSS JOIN orders;
| name | item |
|---|---|
| 佐藤 | 寿司 |
| 佐藤 | 納豆 |
| 佐藤 | キムチ |
| 佐藤 | トムヤムクン |
| 朴 | 寿司 |
| 朴 | 納豆 |
| 朴 | キムチ |
| 朴 | トムヤムクン |
| スミス | 寿司 |
| スミス | 納豆 |
| スミス | キムチ |
| スミス | トムヤムクン |
おわりに
JOIN の違いや書き方のバリエーションは、よく使うからこそ曖昧にしたくないところ。
この記事が、自分と同じようにモヤモヤしていた方の助けになればうれしいです。



コメント