【あうたーじょいん】

OUTER JOIN とは?

最終更新:
💡 相手がいない行にも、一覧の席を残す

2つのテーブルを結合するとき、一致する相手のない行も残すSQLの外部結合です。LEFT・RIGHT・FULLで、どちら側の行を残すかが変わります。

📌 このページのポイント
一致しない行も、一覧に残す社員(左の表)ID 1:田中ID 2:佐藤売上(右の表)ID 1:100ID 3:50結合条件:社員IDが同じLEFT JOIN社員名 | 売上田中 | 100佐藤 | NULLRIGHT JOIN社員名 | 売上田中 | 100NULL | 50FULL JOIN社員名 | 売上田中 | 100佐藤 | NULLNULL | 50NULLは相手なし。売上ゼロとは別
各IDは入力の表に1回ずつ現れる例です。同じIDの相手が複数あれば結果の行数は増えます。
ひよこ ひよこ
OUTER JOINって、どんなときに使うの?
ペンギン先生 ペンギン先生
たとえば社員一覧と売上一覧を組み合わせたいけれど、売上が登録されていない社員も表示したいときだよ。社員を左側にしたLEFT JOINなら、一致する売上のない社員も残せるんだ。
ひよこ ひよこ
LEFT、RIGHT、FULLは何が違うの?
ペンギン先生 ペンギン先生
LEFTは左の全行、RIGHTは右の全行が少なくとも1回は現れるようにする。FULLは両側の一致しない行も残すよ。残した行に相手がいなければ、相手側の列はNULLになるんだ。
ひよこ ひよこ
売上がNULLなら、売上ゼロってこと?
ペンギン先生 ペンギン先生
同じではないよ。NULLはここでは結合する相手の行がないことを示す。表示上ゼロにしたいならCOALESCEなどで置き換えられるけれど、未登録とゼロを同じ扱いにしてよいか先に考えよう。
ひよこ ひよこ
社員が2人なら、結果も2行になる?
ペンギン先生 ペンギン先生
必ずではないよ。同じ社員IDの売上が3件あれば、その社員は3行に現れる。OUTER JOINが残すのは行の存在で、結果の行数を元の表と同じにする保証ではないんだ。
ひよこ ひよこ
LEFT JOINなのに、売上のない社員が消えたよ?
ペンギン先生 ペンギン先生
WHEREで売上額が100以上、といった条件を付けると、売上額がNULLの行は通らないんだ。結合相手を選ぶONと、結合後の行を絞るWHEREでは結果が違う。相手がいない行も残す必要があるなら、条件をどこに置くか確認しよう。
もっと詳しく知りたい人へ

RIGHT JOINはLEFT JOINに書き換えられる?

結合する表の左右を入れ替えれば、対応するLEFT JOINにできるよ。ただしSELECT *の列順などには注意しよう。RIGHT JOINが無意味ということではなく、読みやすい向きを選ぶとよいんだ。対応する結合の種類は、使うDB製品・バージョンでも確認しよう。

売上件数を数えるときCOUNT(*)でよい?

売上がない社員もLEFT JOINの結果には1行現れるので、COUNT(*)はその行を数えるよ。売上側のNULLにならないID列をCOUNTで数えれば、相手がいない行の件数は0になる。集計の目的に合わせて数える列を選ぼう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「OUTER JOIN」って出てきたら「一致する相手のない行も残す結合」と思えばだいたいOK!
📖 おまけ:英語の意味
「Outer Join」 = 外部結合
💬 innerが一致する組だけを返すのに対し、outerは一致しない行も含める結合を指すよ。どちら側を残すかはLEFT・RIGHT・FULLで選ぶんだ。

参考資料

← 用語集にもどる