だれでもエンジニアさんの動画で、テーブル結合を学ぶ

はじめに
29分から始まる内容だ。
INNER JOINとOUTER JOIN

まずは、この2つの概要をネットで調べてみる。
TECH PLAYの記事によると、INNER JOINは複数のテーブルを結合する際に用いられる。
基本構文は以下となる。
SELECT 列名
FROM テーブル1
INNER JOIN テーブル2
ON テーブル1.キーとなる列名 = テーブル2.キーとなる列名;
OUTER JOINについても、TECH PLAYの記事を参考にしてみた。
OUTER JOINによって、結合するカラムの値が一致しない場合でも、関連性を持ったデータを結合することができる。
基本構文は以下となる。
SELECT 列名
FROM テーブル1
LEFT/RIGHT/FULL OUTER JOIN テーブル2
ON テーブル1.キーとなる列名 = テーブル2.キーとなる列名;
いまいちピンと来ていない。
動画で理解していこう。
今回使用するテーブル

火星人のmartiansテーブルと、惑星の渡航歴のhistoriesテーブルが存在する。
INNER JOIN

2つのテーブルを紐づけるのに使用するのが、JOIN。
martiansテーブルのidと、historiesテーブルのmartians_idを紐づける。
INNER JOINで、2つのテーブルを内部結合させることができる。
以下の構文は、「martiansテーブル(m)のidと、histriesテーブル(h)のmartians_idを紐づけて、結合させる」というような意味だ。

ASの後に書いた名前で、テーブル名にアクセスすることができる。
現状では、historiesテーブルのidとmartians_idが残ってしまっている。
以下のお題に対応するには、どうすればいいだろうか?

正解は、列を指定するということだ。mariansテーブルのnameとhistoriesテーブルのplanetを指定している。

複数のテーブルを結合する時にカラムの名前が被るものがあるので、m.nameというようにテーブル名を指定してあげて、カラムにアクセスする。
OUTER JOINの使い所

INNER JOINだと、紐づけるデータがなければ、そのレコードは削除されてしまう。

LEFT OUTER JOINを使用すれば、紐づけたカラムが無いレコードは、nullとして追加される。ベースとなる左のカラムは全部残しておいてくれる。

INNER JOINとLEFT OUTER JOINの違い

INNER JOINは、内部結合と呼ばれるように、ベン図で言うと、二つが重なる部分。
一方、LEFT OUTER JOINは、外部結合と呼ばれ、ベン図で言うと、左の要素全てが対象となる。
条件に合わないデータも欲しい時に、LEFT OUTER JOINを使う。
コメントを残す