0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

SQLの INNER JOINLEFT JOINRIGHT 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 JOINJOIN と、LEFT OUTER JOINLEFT 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 の違いや書き方のバリエーションは、よく使うからこそ曖昧にしたくないところ。
この記事が、自分と同じようにモヤモヤしていた方の助けになればうれしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?