【SQL】JOINの種類を5分で理解する

記事タイトルとURLをコピーする

はじめに

こんにちは。孔子の80代目子孫兼ディベロップメントサービス課の孔です。制限時間5分とのことで、今日の小咄は省略で早速スタートです。

今日はJOINに関する話を持ってきました。JOINには以下の4つがあります。

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • OUTER JOIN

JOINがテーブルとテーブルの結合(JOIN)というのは解っても、それぞれのJOINが何なのか、紛らわしいですね。それをたった5分で理解しよう!というのが今回のブログの目的です。もう1分経ちましたので早速始めます。

まず、JOINに関して

JOINはテーブルとテーブルの結合する際に使うコマンドです。構文は以下のようになります。

table_a JOIN table_b
ON table_a.foreign_key = table_b.primary_key

例えば、映画に関するデータベースがあるとして

SELECT actor.name, movie.name FROM actor
JOIN movie ON actor.movie_id = movie.movie_id

とやると、FROMにはactorテーブルとmovieテーブルを結合して両方のテーブルに入ってるカラムをSELECTできるようになり、俳優名と映画名を同時に取得できるようになります。

そして、そのJOINの種類ですが、「INNER」と「OUTER」JOINをペアで、「LEFT」と「RIGHT」JOINをペアで覚えると覚えやすいので、本記事ではそれぞれをセットで説明いたします。

INNER JOINとOUTER JOIN

上記のようにactorテーブルがあり、actorテーブルは外部キーでmovie_idを持っていますが、movie_idが空の場合があることも想定します(出演した映画がない俳優が俳優なのか若干おかしな状況ですが)

f:id:swx-kong:20210326010844p:plain

こちらのテーブルをJOINしてみると、以下のような形になります。

f:id:swx-kong:20210326011032p:plain

actor_id 3の「無名の人」は、出演した映画がないので、JOINするときに外部キーと当てはまるキーがmovieテーブルにないです。逆にmovieテーブルから見ても、「君の名は。」に出演した俳優がactorテーブルにない状況です。このような状況で、当てはまるキーがないレコードを落とせばINNER JOIN、落とさなければOUTER JOINとなります。

f:id:swx-kong:20210326232107p:plain

LEFT JOINとRIGHT JOIN

左結合、右結合になるLEFT, RIGHT JOINです。左・右は結合の基準となるテーブルがどっちなのかを選択し、選択したテーブルの情報を残した形に合わせて結合を行う、とのことになります。

例えば、以下の例をご覧ください。

f:id:swx-kong:20210326230802p:plain

moiveテーブル(左)からみると「無名の人」は結合できないレコードとなりますし、actorテーブル(右)からみると「君の名は。」は結合できないレコードとなります。ですので、それぞれLEFT JOIN、RIGHT JOINをすると以下のような形でJOINが行われます。

  • LEFT JOIN

f:id:swx-kong:20210326230850p:plain

  • RIGHT JOIN

f:id:swx-kong:20210326230927p:plain

最後に

似ているようで似てないJOINの種類ですが、INNER・OUTERに関しては「両方のテーブルにおいて結合できないレコードをどう処理するか」、LEFT・RIGHTに関しては「結合する際にどちらのテーブルを基準にするか」を意識しながらSQLを書いてみると、紛らわしいJOINの使い方もマスターできるかと思います。私もSQLがすらすら書けるように研鑽を続けますので、一緒に頑張りましょう!