#左外部結合
前回(SQLの複数テーブルの結合をおさらいしてみた(1))で結合条件の列がNULLの場合や値がない場合は結合結果から除外すると説明しました。しかし、NULLの場合や値がない場合でも結果として出力する方法があります。その一つにまずは左外部結合からご紹介します。まずはコードを見てみましょう。
SELECT ~ FROM 左表
LEFT JOIN 右表
ON 結合条件
今下記コードを実行した場合
SELECT * FROM 家計簿
LEFT JOIN 費目
ON 家計簿.費目ID = 費目.ID
費目IDが費目テーブルにない値、またはNULLであっても上記のように出力結果として取り出すことができます。(仮に左表の結合条件がNULLの場合、リストに抽出される右表の列は全てNULLになります。)
また右表の全行を全て出力する場合は右外部結合になります。コードは下記のようになります。
SELECT ~ FROM 左表
RIGHT JOIN 右表
ON 結合条件
左外部結合とLEFT→RIGHTに変わっただけですね。
また、左右表の全て出力する場合は完全外部結合になります。
SELECT ~ FROM 左表
FULL JOIN 右表
ON 結合条件
今紹介した3つはいずれも本来出力結果から消滅する行を出力する効果があり、総称して外部結合といいます。
###コラム
MySQLやMariaDBでは完全外部結合FULL OUTER JOINは使えません。これらの場合UNION演算にを使用することで解決できます。
SELECT ~ FROM 左表
FULL JOIN 右表
ON 結合条件
UNION
SELECT ~ FROM 左表
RIGHT JOIN 右表
ON 結合条件
LEFT JOINとRIGHT JOINの両方法で出力した後にNUIONによって足し合わせるイメージになります。
#SELF JOIN(自己結合)
RDMSでは自分自身と結合することが可能です。一般的にそのような結合を自己結合といいます。
例えば下記のようなケースを見てみましょう
このテーブルから自己結合をすることで好きな人の部活がわかるようになります。
自己結合のイメージとしては元のテーブルを複製して、そこから結合するイメージをもつとわかりやすいです。
コードで表すと
SLECT クラス.名前, クラス.部活, クラス.好きな人, クラス(複製).部活 AS 好きな人の趣味
FROM クラス
LEFT JOIN クラス AS クラス(複製)
ON クラス.好きな人 = クラス(複製).名前
上のコードでのポイントはAS クラス(複製)です。自分自身のテーブル名をASで別名にすることであたかも2つの別テーブルを用意したかのように扱うことができるのです。
##参考
書籍: スッキリわかるSQL入門 第2版 ドリル222問付き!
中山 清喬 著/飯田 理恵子 著
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典:https://wa3.i-3-i.info/word15317.html