はじめに
こんにちは。孔子の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が空の場合があることも想定します(出演した映画がない俳優が俳優なのか若干おかしな状況ですが)
こちらのテーブルをJOINしてみると、以下のような形になります。
actor_id 3の「無名の人」は、出演した映画がないので、JOINするときに外部キーと当てはまるキーがmovieテーブルにないです。逆にmovieテーブルから見ても、「君の名は。」に出演した俳優がactorテーブルにない状況です。このような状況で、当てはまるキーがないレコードを落とせばINNER JOIN、落とさなければOUTER JOINとなります。
LEFT JOINとRIGHT JOIN
左結合、右結合になるLEFT, RIGHT JOINです。左・右は結合の基準となるテーブルがどっちなのかを選択し、選択したテーブルの情報を残した形に合わせて結合を行う、とのことになります。
例えば、以下の例をご覧ください。
moiveテーブル(左)からみると「無名の人」は結合できないレコードとなりますし、actorテーブル(右)からみると「君の名は。」は結合できないレコードとなります。ですので、それぞれLEFT JOIN、RIGHT JOINをすると以下のような形でJOINが行われます。
- LEFT JOIN
- RIGHT JOIN
最後に
似ているようで似てないJOINの種類ですが、INNER・OUTERに関しては「両方のテーブルにおいて結合できないレコードをどう処理するか」、LEFT・RIGHTに関しては「結合する際にどちらのテーブルを基準にするか」を意識しながらSQLを書いてみると、紛らわしいJOINの使い方もマスターできるかと思います。私もSQLがすらすら書けるように研鑽を続けますので、一緒に頑張りましょう!