【SQL超入門講座】12.テーブルの結合(RIGHT JOIN/OUTER JOIN)

こんにちは。キノコードです。
前回のjoinのレッスンはみていただけましたでしょうか?
そのレッスンではSQLiteを使っていました。
そのレッスンでもお話ししたように、SQLiteには、right join,outer joinが実装されていません。
そこで以前のレッスンでPostgreSQLの環境構築の動画と、データベースをバックアップと復元、つまりリストア0する方法について解説をしました。
キノコードのウェブサイトにレッスンで使っているデータベースをアップしました。
そのファイルを使って、データベースのリストアされましたでしょうか?
そうであれば、レッスンの準備は完璧です。
この動画では、前回のSQLiteのjoinで説明できなかったright join,outer joinを説明していきます。

キノコードでは、SQL超入門講座の他に、人気言語のPython超入門講座、SQLのようなデータ抽出やデータ前処理が得意なPandas入門講座、Pythonを使った仕事の自動化の講座なども配信しています。
チャンネル登録がまだの方は、チャンネルがどこにいったかわからなくならないように、チャンネル登録をお願いします。

また、キノコードではメンバーシップをやっています。キノコードの動画制作活動を応援してもいいよーって方は、キノコードのチャンネルメンバーになって応援をお願いします。290円から応援できます。詳しくはチャンネル登録ボタンの隣にある「メンバーになる」をクリックしてください。解説動画があります。

それではレッスンスタートです。

 データの準備

まず、テーブルを2つ用意します。
冒頭でもお伝えしましたが、キノコードのウェブサイトにあるdumpファイルを使ってリストアすればテーブルがあるはずです。
リストアすると、1つは、test_table01というテーブルと、test_table02というテーブルがあります。

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

前回の復習

SELECT * 
FROM test_table01 AS A
INNER JOIN test_table02 AS B
ON A.氏名 = B.氏名

まず、INNER JOINのやりかたです。
INNER JOINはこのように書きましたよね。
test_table01とtest_table02を、氏名のカラムをキーに内部結合をしました。
つまり、一致するレコードのみ抽出することができます。
実行します。
FROMに書いたテーブルであるtest_table01が左側にきて、
INNER JOINに書いたtest_table02が右側にきています。
これはJOINでの基本ルールなので覚えておきましょう。
そして、一致するレコードのみ抽出できています。

SELECT * 
FROM test_table01 AS A
LEFT JOIN test_table02 AS B
ON A.氏名 = B.氏名

LEFT JOINはこうでしたよね。
test_table01とtest_table02と、左外部結合です。
今回も、FROMに書いたテーブルであるtest_table01が左側にきて、
LEFT JOINに書いたtest_table02が右側にきています。
LEFT JOINなので、左側のテーブルが基準となります。
つまり、FROMの部分のtest_table01です。
左側のテーブルはすべて表示されて、右側のテーブルは結合されたもののみが表示されます。
以上が、復習です。

RIGHT JOINの使い方

次に、RIGHT JOINです。
理屈は簡単です。
基本ルール通り、FROMに書いたテーブルであるtest_table01が左側にきて、
INNER JOINに書いたtest_table02が右側にきます。

は右のテーブルを基準として、もう一方のテーブルを結合します。
LEFT JOINを追加したSELECT文の構文は以下の通りです。

SELECT * 
FROM test_table01 AS A
RIGHT JOIN test_table02 AS B
ON A.氏名 = B.氏名

基準とするテーブルが変わるだけで、考え方はLEFT JOINと同じです。
そのためLEFT JOINとRIGHT JOINはセットで覚えるようにしましょう。
こうすることで双方の理解をより深めることができます。
ではtest01テーブルとtest02テーブルを今度はRIGHT JOINを使って結合してみましょう。

SELECT
  *
FROM test01 t1
RIGHT JOIN test02 t2 ON t1.氏名 = t2.氏名

SQLを実行します。

氏名 出席番号 数学 氏名 出席番号 国語
高橋 a001 1 高橋 a001 5
伊藤 a002 2 伊藤 a002 6
NULL NULL NULL 渡辺 a005 7
NULL NULL NULL 加藤 a006 8

今度は結合にあたり基準となるtest02テーブルのすべてのレコードが実行結果に表示されています。
そしてもう一方のtest01テーブルの氏名の値と、対をつくることができなかったレコードはNULLで補完されています。
結合にあたり基準とするテーブルが変わるだけで、LEFT JOINとやっていることは同じです。

またLEFT JOIN、RIGHT JOINは相互に書き換え可能です。
書き換えるためにはFROM句で指定しているテーブルと、JOIN句で指定しているテーブルの位置を交換します。
先ほどRIGHT JOINを使ってテーブル結合したSQLは以下のように書き換えることができます。

SELECT
  *
FROM test02 t2
LEFT JOIN test01 t1 ON t2.氏名 = t1.氏名

LEFT JOINとRIGHT JOINのどちらかを使ってでしかできないことは基本的にありません。
そのためLEFT JOIN、RIGHT JOINは自分が使いやすい方を使用して構わないと言えます。

ただソース上にLEFT JOIN、RIGHT JOINが混在するのは望ましくありません。
というのも後から見返したときや第三者が見たときに分かりづらくなってしまうからです。
そのたLEFT JOIN、RIGHT JOINは、どちらかに使用を統一するのがよいでしょう。

FULL OUTER JOINの使い方

最後にFULL OUTER JOINについて説明します。
FULL OUTER JOINを追加したSELECT文の構文は以下の通りです。

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

LEFT JOIN、RIGHT JOINは一方のテーブルを基準として、もう一方のテーブルを結合しました。
これに対しFULL OUTER JOINは両方のテーブルを基準とするテーブル結合であると述べることができます。
そしてFULL OUTER JOINは両方のテーブルの全てのレコードを、実行結果に表示します。
では実際にFULL OUTER JOINを使ってテーブル結合を行ってみましょう。

SELECT
  *
FROM test01 t1
FULL OUTER JOIN test02 t2 ON t1.氏名 = t2.氏名

SQLを実行します。

氏名 出席番号 数学 氏名 出席番号 国語
高橋 a001 1 高橋 a001 5
伊藤 a002 2 伊藤 a002 6
鈴木 a003 3 NULL NULL NULL
佐藤 a004 4 NULL NULL NULL
NULL NULL NULL 渡辺 a005 7
NULL NULL NULL 加藤 a006 8

結合後のテーブルにtest0とtest02の全てのレコードが表示されています。
そして結合先が見つからないレコードにはNULLが補完されています。
FULL OUTER JOINはLEFT JOIN、RIGHT JOINと比較すると、使用機会は多くありませんが考え方は覚えておくようにしましょう。

抽出されるデータと結合方法について

テーブル結合を行う際は、それぞれのテーブルから抽出したいデータに合わせて結合方法を選択します。
この抽出したいデータと結合方法の関係性をベン図で次のように表現することができます。

このように抽出したいデータをイメージできれば、適したテーブルの結合方法が見えてきます。
それぞれのテーブル結合の使い方を理解して、正しく使い分けられるようになりましょう。