【あうたーじょいん】
OUTER JOIN とは?
最終更新:
💡 相手がいない行にも、一覧の席を残す
2つのテーブルを結合するとき、一致する相手のない行も残すSQLの外部結合です。LEFT・RIGHT・FULLで、どちら側の行を残すかが変わります。
📌 このページのポイント
- LEFTは左側、RIGHTは右側、FULLは両側の一致しない行も残す
- 相手がいない部分の列にはNULLが入る。ゼロとは異なる
- 相手が複数あれば行は増え、WHEREの条件で行が消えることもある
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で選ぶんだ。