【図解】SQLでJOINを使う方法(OUTER・LEFT・RIGHT)

目次

JOINとは?

JOINを簡単に説明すると、テーブルとテーブルを結合することです。
あるキーを用いて、複数のテーブルを結合してあげます。

例えば、以下のような社員の所属部署が格納されたテーブルと
社員それぞれの年齢が格納されたテーブルがあるとします。

所属部署

社員ID 社員名 部署
1 田中 営業
2 山田 営業
3 清水 経理
4 高橋 経理
5 岩井 人事
6 村田 人事

社員の年齢

社員ID 社員名 年齢
1 田中 24
2 山田 35
3 清水 40
4 高橋 50
5 岩井 33
6 村田 29



結合してみる

結合するためには、結合キーが必要になります。
今回で言うと”社員ID”が結合するためのキーになります。

f:id:gotto50105010:20181221233321p:plain

上の画像のように、"社員ID"を結合のキーとして用います。
こうすることで、2つのテーブルを結合し、1つのテーブルにすることができます。

JOINのSQLクエリ

イメージは、図解したとおりになりますが、
実際のSQLクエリは、どのようになるでしょうか。

今回の社員IDをキーとして、部署と年齢のテーブルを結合してみたいと思います。

SELECT
    所属部署.社員ID,
    所属部署.社員名,
    所属部署.部署,
    社員の年齢.年齢
FROM
    所属部署
JOIN
    社員の年齢
ON
    所属部署.社員ID = 社員の年齢.社員ID

実行結果

社員ID 社員名 部署 年齢
1 田中 営業 24
2 山田 営業 35
3 清水 経理 40
4 高橋 経理 50
5 岩井 人事 33
6 村田 人事 29

さて、結合した結果はこのようになりました。
バラバラのテーブルに存在していた所属部署と社員の年齢のデータが、
1つのテーブルに格納されましたね。

このように、SQLを用いてテーブルを結合することができます。
結合にもいくつかの種類があるので、それぞれを説明していきたいと思います。

(INNER) JOIN

INNER JOIN(内部結合)は、それぞれのテーブルに
指定したキーが一致するものだけを結合します。

言葉ではなく、図を用いて説明していきましょう。

f:id:gotto50105010:20181221233420p:plain

INNER JOINのクエリ

SELECT
    所属部署.社員ID,
    所属部署.社員名,
    所属部署.部署,
    社員の年齢.年齢
FROM
    所属部署
(INNER)JOIN ※INNERは、書いても書かなくても同じ
    社員の年齢
ON
    所属部署.社員ID = 社員の年齢.社員ID

この一部分だけキーが存在するテーブルを結合すると、
一致しない部分は消えてしまい、結合できた部分だけ残ります。

実行結果

社員ID 社員名 部署 年齢
1 田中 営業 24
3 清水 経理 40
4 高橋 経理 50
5 岩井 人事 33

ポイント

  • INNER JOINは、結合キーが一致するもののみ結合される
  • 結合キーが一致しないものは、消えてしまう

LEFT JOIN

これは、文字通り「左側のテーブルに結合する」という意味です。
INNER JOINとの違いは、左側のテーブルをベースにするので、
キーが一致しない場合でも、左側のテーブルに存在する値は残ります。

早速、言葉よりも図でご説明しましょう。

f:id:gotto50105010:20181221233503p:plain

f:id:gotto50105010:20181221233527p:plain

LEFT JOINのクエリ

SELECT
    社員の年齢.社員ID,
    社員の年齢.社員名,
    社員の年齢.年齢,
    所属部署.部署
FROM
    社員の年齢
LEFT JOIN
    所属部署
ON
    社員の年齢.社員ID = 所属部署.社員ID

LEFT JOINする際に、どちらにLEFT側のテーブルを記載するかと言うと、
以下の画像のように、最初に記載したほうがLEFTのテーブルになります。

f:id:gotto50105010:20181221233608p:plain

LEFT JOINやRIGHT JOINを利用する際には、
テーブルの記載する順番には気をつけましょう!

RIGHT JOIN

RIHGT JOINは、LEFT JOINと処理が逆になります。
右側のテーブルに対して左側のテーブルをJOINします。

f:id:gotto50105010:20181221233634p:plain

f:id:gotto50105010:20181221233651p:plain

RIHGT JOINのクエリ

SELECT
    社員の年齢.社員ID,
    社員の年齢.社員名,
    社員の年齢.年齢,
    所属部署.部署
FROM
    所属部署
RIHGT JOIN
    社員の年齢
ON
    社員の年齢.社員ID = 所属部署.社員ID

LEFT JOINもRIGHT JOINも書き方は、ほとんど変わりませんね。
JOINの前にLEFTかRIHGTを記載することで処理が異なります。
基本的にJOINしか記載しなかった場合は、INNER JOINになります。

LEFT RIGHTどっちから結合する?

さて、LEFT JOINの両方を解説してきました。
ここで1つ疑問があります。

LEFTとRIHGTどっちに結合すると良いでしょうか?

原則、大きいテーブルの方に結合させてください。
もし、LEFT側のテーブルが大きい場合は、LEFT JOINを使います。
逆にRIGHT側のテーブルが大きい場合は、RIGHT JOINを利用します。

f:id:gotto50105010:20181221233723p:plain

f:id:gotto50105010:20181221233734p:plain

細かな説明は割愛しますが、大きいテーブルに結合するほうが、
処理速度が早くなる可能性が高いからです。

そのため、JOINをする際には、どちらのテーブルが大きいか確認してから、 結合を行うようにしましょう。

参考文献

入門者の方に非常におすすめの本になります。
今回のような入門テーマをわかりやすく解説してくれており、
練習問題までたくさん用意されているので、
SQLの習得に有用ではないかと思います。

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)