【SQL】INNER/LEFT/RIGHT/FULL/CROSS JOINの違いと具体例

SQL
記事内に広告が含まれています。

はじめに

SQLの INNER JOINLEFT JOINRIGHT JOIN……
「何がどう違うの?」と聞かれるとちょっと不安。
この記事では、自分の頭の中を整理するために、JOINの基本的な種類と違いを簡単な例と一緒にまとめてみました。

JOINの「書き方の違い」について

SQLのJOINは、同じ意味でも書き方にバリエーションがあります。
省略形が使われることもあるので、違いを整理しておくと理解しやすくなります。

JOINの種類省略形
INNER JOINJOIN
LEFT OUTER JOINLEFT JOIN
RIGHT OUTER JOINRIGHT JOIN
FULL OUTER JOINFULL JOIN
CROSS JOINなし

INNER JOIN の場合は INNER を、OUTER JOIN の場合は OUTER を省略して記述することが可能です。
例えば、INNER JOINJOIN と、LEFT OUTER JOINLEFT JOIN と書くことができます。

使用するテーブルの例

  • users テーブル
idname
1佐藤
2
3スミス
  • orders テーブル
iduser_iditem
11寿司
21納豆
32キムチ
44トムヤムクン

INNER JOIN(内部結合)

INNER JOIN は「両方のテーブルにマッチするデータ」だけを取得します。

SELECT users.name, orders.item
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
nameitem
佐藤寿司
佐藤納豆
キムチ

スミス は注文がないので除外され、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;
nameitem
佐藤寿司
佐藤納豆
キムチ
スミス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;
nameitem
佐藤寿司
佐藤納豆
キムチ
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;
nameitem
佐藤寿司
佐藤納豆
キムチ
スミスNULL
NULLトムヤムクン

CROSS JOIN(クロス結合)

CROSS JOIN は「すべての行の組み合わせを返す」結合です。
users に3件、orders に4件ある場合、3 × 4 = 12件 が返されます。

SELECT users.name, orders.item
FROM users
CROSS JOIN orders;
nameitem
佐藤寿司
佐藤納豆
佐藤キムチ
佐藤トムヤムクン
寿司
納豆
キムチ
トムヤムクン
スミス寿司
スミス納豆
スミスキムチ
スミストムヤムクン

おわりに

JOIN の違いや書き方のバリエーションは、よく使うからこそ曖昧にしたくないところ。
この記事が、自分と同じようにモヤモヤしていた方の助けになればうれしいです。

最後までお読みいただきありがとうございました。

皆さんからのコメントやSNSでのシェア、嬉しい投稿をいただくと本当に励みになります。

もしこの記事が気に入ったら感想をコメントやSNSでシェアしていただけると嬉しいです。

皆さんの声を聞かせてくださいね!

SQL
tetsuをフォローする
簿記はじめるってよ

コメント

タイトルとURLをコピーしました