【SQL超入門講座】08.JOIN|テーブルの結合(INNER JOIN/LEFT JOIN)

こんにちは。キノコードです。
この動画では、テーブルとテーブルを結合する方法について解説をします。
テーブル同士の結合は、JOINを使います。
このJOINにも種類が4つあります。
inner join、left join,right join,outer joinの4つです。
例えば、2つテーブルがあったとします。
1つめのテーブルは、高橋さん、伊藤さん、鈴木さん、佐藤さんの数学の点数が記録されたテーブル。
2つめのテーブルは、1つめのテーブルと共通して高橋さん、伊藤さんが記録されており、1つめのテーブルにいないのが渡辺さん、加藤さんで、このテーブルには国語の点数が記録されています。
この氏名の部分を共通キーに2つのテーブルを結合することができます。
そして、inner joinをすると、共通しているレコードのみ結合します。
つまり、高橋さん、伊藤さんのレコードのみ抽出されます。
left joinをすると、左のテーブルのデータはすべて抽出して、右のテーブルにはないものはNULLで返されます。
right joinも同様で、右のテーブルのデータはすべて抽出して、左のテーブルにはないものはNULLで返されます。
outer joinは、どちらかのテーブルにあるレコードのすべてが返されます。
これだけだとわかりにくいともいますので、レッスンで詳しく解説します。
ちなみに、PythonのライブラリPandas入門講座をみていただいている方はこのjoinはmergeメソッドと同じ役割です。
キノコードでは、人気言語のPython超入門講座、Pythonを使ったデータ集計データ加工のPandas入門講座、仕事の自動化の講座、人工知能のレッスンもアップしています。
チャンネル登録していただけますと新着通知がいきますので、ぜひチャンネル登録をお願いします。
それではパソコン画面に切り替えてレッスンを進めていきます。

【SQL超入門講座】08.JOIN|テーブルの結合(INNER JOIN/LEFT JOIN)

INNER JOINとは

まずは、INNER JOINから解説をします。
INNER JOINは、テーブルとテーブルを結合するためのものです。
内部結合といったりもします。
SELECTにINNER JOINを付けることで、複数のテーブルから必要なデータを取得できるようになります。
しかし、テーブルを結合するには色々とルールが存在します。
テーブルの結合はSQLの学習でハマりがちな部分なので、一つずつしっかりと見ていきましょう。

INNER JOINの使い方

SELECT
    カラム
FROM
    テーブル名 A
INNER JOIN
    テーブル名 B
ON
    A.キー = B.キー
WHERE
    条件式

SELECTにINNER JOINを追加した構文は以下の通りです。
INNER JOINはFROMとWHEREの間に記述します。
FROMとINNER JOINは、どのテーブルからデータを抽出を決めるものなので、近い場所にあると分かりやすくていいですね。
以前のレッスンで、テーブル名にasをつけると別名を付けることができるとお伝えしました。
このasは省略することができ、テーブル名の後にスペースを一つ空けて別名をつけることができます。
この構文のAとBがそれに該当します。
次のONですが、これは実際に使って見ながらお話しします。
それでは実際にINNER JOINを使ってみましょう。

今回使用するテーブルは2つです。
1つ目はtest01というテーブルです。
氏名、出席番号、数学の点数が記録されています。
2つめはtest02というテーブルです
こちらには、氏名、出席番号、国語の点数が記録されています。

SELECT
    A.氏名,A.数学,B.国語
FROM
    test01 as A
INNER JOIN
    test02  as B
ON
    A.氏名 = B.氏名

test01テーブルとtest02テーブルをINNER JOINを使って結合しました。
test01テーブルはA、test02テーブルはBとそれぞれ別名を付けています。
例えばSELECTのA.氏名は「test01テーブルの氏名のカラム」を表しています。
同じようにA.数学はtest01テーブルの数学のカラムから、B.国語は、test02テーブルの国語のカラムからデータを取得しています。
このように、テーブルを結合することで、両方のテーブルのデータを同時に取得することができるようになります。
また、ONについてですが、これは「どのカラムで結合するか」を指定しています。
今回は、氏名で結合をしてみましょう。
A.氏名でtest01テーブルのカラムの氏名、b.氏名でtest02テーブルのカラムの氏名。
これをキーに結合します。
それぞれのテーブルの氏名では、高橋さんと伊藤さんが共通するレコードです。
この2つのレコードが抽出されるはずです。
またカラムはSELECTで氏名、数学、国語のカラムを指定しているので、このカラムが抽出されるはずです。
実行します。

SELECT
    *
FROM
    test01 as A
INNER JOIN
    test02  as B
ON
    A.氏名 = B.氏名

ONについてさらに理解を深めるため、このSQLについてみていきたいと思います。
先ほどのSQLを、全てのカラムを表示するように変更しました。
実行します。
2つのテーブルを結合した結果ですが、これだと分かりにくいので、枠で囲って見てみましょう。
赤枠で囲っている部分がtest01テーブルのデータで、青枠で囲っているのはtest02テーブルのデータです。
test01テーブルのデータにtest02テーブルが後ろにくっついているようなイメージが伝わるでしょうか?
これがテーブルの結合です。
改めて伝えますと、どのレコードとどのレコードが繋がるのかはONで指定しています。
見てわかる通り、test02のレコードは、test01と同じ氏名を持ったレコードとくっついています。
これがON句が必要な理由です。
以上が基本的なINNER JOINの使い方です。

left join

SQLのjoinには、INNER JOINのほかにLEFT JOIN、RIGHT JOIN、OUTER JOINがあります。
ただし、SQliteは、right joinとouter joinについてはサポートしていません。
次回、PostgresqlというRDBMSを使って、right joinとouter joinを説明する予定です。
ひとまず、この動画では、Left joinについて説明をします。
さて、先ほど紹介したinner joinは、日本語では内部結合といいます。
一方、left join、right join、outer joinは外部結合と言います。

では内部結合と外部結合ではいったいどのような違いがあるのでしょうか。
内部結合では、on句で指定した条件に一致するレコードのみSQLの実行結果に表示されます。
一方で外部結合ではon句で指定した条件に一致しないレコードも実行結果に表示されます。
というのも外部結合では結合の基準となるテーブル、つまりFROMを指定したテーブルのレコードをすべて抽出するからです。

言葉だけでの説明ではイメージが中々つきづらいと思います。
実際に外部結合、今回はleft joinでテーブル結合を行って違いを確認してみましょう。

LEFT JOINの使い方

LEFT JOINは左のテーブルを基準として、もう一方のテーブルを結合します。
LEFT JOINを用いたSELECT文の構文はこの通りです。

SELECT
    カラム
FROM
    テーブル名 A
LEFT JOIN
    テーブル名 B
ON
    A.キー = B.キー
WHERE
    条件式
SELECT
  *
FROM test01 A
LEFT JOIN test02 B ON A.氏名 = B.氏名

ではtest01テーブルとtest02テーブルをLEFT JOINを使って結合してみましょう。
ここでは全てのカラムを抽出対象とします。

test01、test02は、それぞれA、Bと別名をつけています。
またon句で両方のテーブルに存在する氏名のカラムを指定しています。
実行します。
結合の基準となるtest01テーブルのレコードが実行結果に全て表示されています。
そしてtest02からは、氏名の値が「高橋」、「伊藤」のレコードのみ抽出されています。
これはon句で指定した氏名をキーに結合できたレコードです。
一方でキーに結合できなかったレコードについてはNULLで補完されています。

以上がLEFT joinの説明です。
少し難しかったでしょうか。
わからない点などありましたらコメント欄にてお教えください。
postgresqlを使った解説の時にコメントいただいた部分を加えて解説をいたします。