一方の表の行を必ず残しつつ2つの表を組み合わせる結合。
外部結合(OUTER JOIN)とは、一方(または両方)の表の行を、相手に一致する行がなくても必ず残しながら2つの表を組み合わせる結合のことです。相手が見つからない列は NULL(=値なし)で埋めます。
身近な例で考えると、クラス全員の出席簿に、提出された宿題を突き合わせる作業に似ています。内部結合だと「宿題を出した人」しか残りませんが、外部結合なら「全員」を残し、宿題を出していない人は提出欄を空欄(NULL)にできます。誰が出していないかも一目で分かるわけです。
上のツールで▶ボタンを押すと、共通部分から始まり、LEFT・RIGHT・FULL の順に「必ず残す側」が広がり、相手のいない行が NULL付きで残っていく流れを確認できます。
外部結合は「どちらの表を必ず残すか」で3種類に分かれます。色の付いた円が「必ず残す側」だと考えてください。
・LEFT OUTER JOIN(左外部結合):左の表の行をすべて残す。右に相手がなければ右の列を NULL に
・RIGHT OUTER JOIN(右外部結合):右の表の行をすべて残す。左に相手がなければ左の列を NULL に
・FULL OUTER JOIN(完全外部結合):左右どちらの行も残す。LEFT と RIGHT を合わせたもの
どれを使うかは目的で決めます。「左の表(FROMで先に書いた表)を漏らさず残したい」なら LEFT、逆なら RIGHT、両方漏らしたくないなら FULL です。実は LEFT と RIGHT は表の左右を入れ替えれば同じ結果になるため、現場では LEFT がよく使われます。
NULL が現れるのは、「必ず残す側」の行に対して、相手の表に一致する行が存在しないときです。残った行の「相手側の列」を埋める値がないので、データベースは NULL を入れます。
NULL について注意したいのは、「空文字("")」や「0」とは別ものだという点です。NULL は「データそのものが存在しない・不明」という意味で、たとえば「部署が割り当てられていない」状態を正確に表します。0円や空文字は「値はあるが中身がそれ」という意味なので区別します。
この性質を使うと、「相手のいないデータ」を見つけることができます。外部結合した結果で部署名が NULL の行を探せば「所属が決まっていない社員」が、社員名が NULL の行を探せば「人がいない部署」が分かります。内部結合ではこれらの行が消えてしまうため見つけられない、というのが両者の決定的な違いです。
NULLが生まれる理由は「行は残さなければならないが、埋める値がどこにも存在しない」からです。LEFT OUTER JOIN(左外部結合)を例にすると、データベースは次の手順を踏みます。
・① 左の表の行を1行ずつ見ていく
・② 右の表に一致する行があれば → 通常どおり結合した行を作る
・③ 右の表に一致する行がなければ → 左の行をそのまま残し、右側の列に NULL を入れる
NULLは「値がゼロ」でも「空欄のまま」でもなく、「そのデータ自体が存在しない」ことを示す特別な印です。そのため NULL を条件に使うときは = NULL ではなく IS NULL と書かないと正しく検索できません。外部結合の結果から「相手のいない行を探す」ときは WHERE 部署名 IS NULL と書く、と覚えておくと実際に役立ちます。
| 使いたい場面 | 使う結合 |
|---|---|
| 両方の表に対応データがある行だけ取り出したい | INNER JOIN |
| 左の表の全行を残したい(右に相手なしでもOK) | LEFT OUTER JOIN |
| 右の表の全行を残したい(左に相手なしでもOK) | RIGHT OUTER JOIN |
| 両方の表の全行をすべて残したい | FULL OUTER JOIN |
結合の選び方は、「どちらの表のデータを絶対に漏らしたくないか」で決まります。
・漏らしたくない表がない(共通部分だけでよい) → INNER JOIN
・左の表を全部残したい → LEFT OUTER JOIN
・右の表を全部残したい → RIGHT OUTER JOIN
・両方残したい → FULL OUTER JOIN
たとえば「出席簿(全生徒)に対して、提出した宿題を付け加えたい」なら、全生徒を漏らしたくないので LEFT OUTER JOIN を使います。「提出物があるかどうかに関係なく全員表示、ない人はNULL」という結果になります。内部結合にすると「宿題を出した生徒しか表示されない」ので、提出していない人を見つけられません。「NULL付きで全員残す外部結合」と「完全なペアだけ残す内部結合」、この対比を覚えておくと迷いません。