SQLのJOINについて

SQLのJOINは、複数のテーブルを結合して1つの結果セットを取得するための機能です。JOINを使用することで、関連するデータを効率的に取得することができます。

どのJOINがどんな結合を行うのかを忘れてしまいがちなので、整理してまとめておきます。

また、縦の結合を行うUNIONについても説明します。

JOINの種類

SQLのJOINには主に以下の種類があります。

  1. INNER JOIN(または単にJOIN)
  2. LEFT JOIN (または LEFT OUTER JOIN)
  3. RIGHT JOIN (または RIGHT OUTER JOIN)
  4. FULL JOIN (または FULL OUTER JOIN)
  5. CROSS JOIN(または単にCROSS JOIN)

INNER JOIN

INNER JOINは、両方のテーブルに共通するデータのみを結合して取得する方法です。例えば、以下のように使用します。

テーブルAの例

ID名前
1田中
2鈴木
3佐藤
4高橋

テーブルBの例

ID年齢
125
230
428
SELECT *
FROM テーブルA
INNER JOIN テーブルB
ON テーブルA.id = テーブルB.id;

結果

ID名前年齢
1田中25
2鈴木30
4高橋28

図にまとめると以下のようになります(AI生成)

INNER JOINの図

LEFT JOIN

LEFT JOINは、左側のテーブルのすべてのデータを取得して、右側のテーブルの一致するデータを結合する方法です。
左側のテーブルはFROM句で指定されるテーブルで、右側のテーブルはJOIN句で指定されるテーブルを指します。

例えば、以下のように使用します。

テーブルAの例

ID名前
1田中
2鈴木
3佐藤
4高橋

テーブルBの例

ID年齢
125
230
428
SELECT テーブルA.id, テーブルA.名前, テーブルB.年齢
FROM テーブルA
LEFT JOIN テーブルB
ON テーブルA.id = テーブルB.id;

※SELECT *とした場合、テーブルAのID,名前,テーブルBのID,年齢の順で取得されますが、テーブルBのIDがNULLとなり分かりにくくなるため、上のSQLでは必要なカラムのみを指定しています。

結果

ID名前年齢
1田中25
2鈴木30
3佐藤NULL
4高橋28

図にまとめると以下のようになります(AI生成)

LEFT JOINの図

RIGHT JOIN

RIGHT JOINは、右側のテーブルのすべてのデータを取得して、左側のテーブルの一致するデータを結合する方法です。
右側のテーブルはJOIN句で指定されるテーブルで、左側のテーブルはFROM句で指定されるテーブルを指します。

例えば、以下のように使用します。

テーブルAの例

ID名前
1田中
2鈴木
3佐藤
4高橋

テーブルBの例

ID年齢
125
230
428
522
SELECT テーブルA.id, テーブルA.名前, テーブルB.年齢
FROM テーブルA
RIGHT JOIN テーブルB
ON テーブルA.id = テーブルB.id;

結果

ID名前年齢
1田中25
2鈴木30
4高橋28
NULLNULL22

図にまとめると以下のようになります(AI生成)

RIGHT JOINの図

LEFT JOINとRIGHT JOINの違い

FROM テーブルA
LEFT JOIN テーブルB

と

FROM テーブルB
RIGHT JOIN テーブルA

は結果的に同じになることから、LEFT JOIN,RIGHT JOINはお互いに置き換えて使用することができます。

ですが、一般的にはLEFT JOINを使用することが多いです。LEFT JOINの方が直感的に理解しやすく、可読性も高いためです。

調べた限り、RIGHT JOINは実務でほとんど見たことがないといった意見が多くみられました。

例えば長いSQLで運用していて、途中でほしい結果が変わった場合のようなユースケースでは、SQLをがらっと書き直すのではなく、LEFT JOINからRIGHT JOINに書き直すことがあるようです。

AI時代の今では上記のようなユースケースでも、LEFT JOINのままでリファクタリングすることが可能ではありますが、、。

FULL JOIN

FULL JOINは、両方のテーブルのすべてのデータを取得して、共通するデータを結合する方法です。
一致しないデータについてはNULLが入ります。

例えば、以下のように使用します。

テーブルAの例

ID名前
1田中
2鈴木
3佐藤
4高橋

テーブルBの例

ID年齢
125
230
428
522
SELECT テーブルA.id, テーブルA.名前, テーブルB.年齢
FROM テーブルA
FULL JOIN テーブルB
ON テーブルA.id = テーブルB.id;

結果

ID名前年齢
1田中25
2鈴木30
3佐藤NULL
4高橋28
NULLNULL22

片方のテーブルにしか存在しないデータも漏れなく取得されるのがFULL JOINの特徴です。

図にまとめると以下のようになります(AI生成)

FULL JOINの図

注意点としては、FULL JOINはMySQLなど一部のデータベースではサポートされていない場合があることです。
その場合は、LEFT JOINとRIGHT JOINで出した結果をUNIONで結合することで、FULL JOINと同様の結果を得ることができます。

例えば、以下のようにLEFT JOINとRIGHT JOINをUNIONで結合することで、FULL JOINと同様の結果を得ることができます。

SELECT テーブルA.id, テーブルA.名前, テーブルB.年齢
FROM テーブルA
LEFT JOIN テーブルB
ON テーブルA.id = テーブルB.id
UNION
SELECT テーブルA.id, テーブルA.名前, テーブルB.年齢
FROM テーブルA
RIGHT JOIN テーブルB
ON テーブルA.id = テーブルB.id;

UNIONとは

UNIONは、複数のSELECT文の結果を結合して1つの結果セットとして返すSQLの構文です。

JOINが「横の結合」を行うのに対して、UNIONは「縦の結合」を行うと考えると理解しやすいです。

重複する行は自動的に削除されます。重複を残したい場合は、UNION ALLを使用します。

UNION と UNION ALLの図は以下のようになります。

UNIONの図 UNION ALLの図

CROSS JOIN

CROSS JOINは、両方のテーブルのすべての組み合わせを取得する結合方法です。
リレーションは関係なく、すべての組み合わせが取得されます。

例えば、以下のように使用します。

テーブルAの例

ID名前
1田中
2鈴木

テーブルBの例

ID年齢
125
230
SELECT テーブルA.id, テーブルA.名前, テーブルB.年齢
FROM テーブルA
CROSS JOIN テーブルB;

結果

ID名前年齢
1田中25
1田中30
2鈴木25
2鈴木30

図にまとめると以下のようになります(AI生成)

CROSS JOINの図

理解度チェック(AI生成)

以下の4択問題で、JOINとUNIONの理解度をチェックしてみましょう。答えは折りたたまれているので、クリックして確認してください。

Q1. INNER JOINの説明として正しいものはどれか?

  1. 両方のテーブルのすべてのデータを取得する
  2. 左側のテーブルのすべてのデータを取得する
  3. 両方のテーブルに共通するデータのみを取得する
  4. 両方のテーブルのすべての組み合わせを取得する

Q2. 記事中で説明されている、LEFT JOINとRIGHT JOINの関係として正しいものはどれか?

  1. FROM句とJOIN句のテーブルを入れ替えれば、互いに置き換えて同じ結果を得られる
  2. RIGHT JOINはLEFT JOINより新しい構文であり、原則RIGHT JOINを使うべきである
  3. LEFT JOINとRIGHT JOINは結合条件の書き方が異なり、置き換えることはできない
  4. RIGHT JOINはNULLを含む結果を返さない

Q3. FULL JOINの特徴として正しいものはどれか?

  1. 両方のテーブルに共通するデータのみを取得する
  2. 片方のテーブルにしか存在しないデータも漏れなく取得され、一致しない部分にはNULLが入る
  3. すべてのデータベースで標準的にサポートされている
  4. 結合条件を指定せずに使用する

Q4. CROSS JOINの説明として正しいものはどれか?

  1. 結合条件(ON句)に基づいて一致する行のみを結合する
  2. リレーションに関係なく、両方のテーブルのすべての組み合わせを取得する
  3. 片方のテーブルのデータのみを重複なく取得する
  4. 複数のSELECT文の結果を縦に結合する

Q5. JOINとUNIONの違いとして、記事の内容と合致するものはどれか?

  1. JOINは「縦の結合」、UNIONは「横の結合」を行う
  2. JOINは「横の結合」、UNIONは「縦の結合」を行う
  3. JOINとUNIONはどちらも同じ処理を行い、書き方が異なるだけである
  4. UNIONは常に重複行を残す