FE EXAM

外部結合(OUTER JOIN)

一方の表の行を必ず残しつつ2つの表を組み合わせる結合。

INTERACTIVE VISUALIZATION
共通部分
NULL
フェーズ
idle
結果の行数
0
NULLを含む行
0
シナリオ
ステップ1 / 6
STEP 1/62つの表を用意する左に社員表、右に部署表があります。社員「田中」の部署ID(D09)は部署表になく、部署「D03(総務部)」には社員がいません。この「相手が見つからない行」を結果にどう扱うかが外部結合のテーマです。
社員表(左)
社員名部署ID
佐藤D01
鈴木D02
田中D09
部署表(右)
部署ID部署名
D01営業部
D02開発部
D03総務部
↓ 外部結合の結果
社員名部署ID部署名
(まだ結合された行はありません)
社員表部署表結合前
対応するSQL(左外部結合の例)
SELECT 社員名, 社員.部署ID, 部署名
FROM 社員
LEFT OUTER JOIN 部署
 ON 社員.部署ID = 部署.部署ID;
解説

📌
OUTER JOINとは

必ず残す側相手の表

外部結合(OUTER JOIN)とは、一方(または両方)の表の行を、相手に一致する行がなくても必ず残しながら2つの表を組み合わせる結合のことです。相手が見つからない列は NULL(=値なし)で埋めます。

身近な例で考えると、クラス全員の出席簿に、提出された宿題を突き合わせる作業に似ています。内部結合だと「宿題を出した人」しか残りませんが、外部結合なら「全員」を残し、宿題を出していない人は提出欄を空欄(NULL)にできます。誰が出していないかも一目で分かるわけです。

上のツールで▶ボタンを押すと、共通部分から始まり、LEFT・RIGHT・FULL の順に「必ず残す側」が広がり、相手のいない行が NULL付きで残っていく流れを確認できます。

🔀
LEFT/RIGHT/FULLの違い

LEFTRIGHTFULL

外部結合は「どちらの表を必ず残すか」で3種類に分かれます。色の付いた円が「必ず残す側」だと考えてください。


LEFT OUTER JOIN(左外部結合):左の表の行をすべて残す。右に相手がなければ右の列を NULL に
RIGHT OUTER JOIN(右外部結合):右の表の行をすべて残す。左に相手がなければ左の列を NULL に
FULL OUTER JOIN(完全外部結合):左右どちらの行も残す。LEFT と RIGHT を合わせたもの

どれを使うかは目的で決めます。「左の表(FROMで先に書いた表)を漏らさず残したい」なら LEFT、逆なら RIGHT、両方漏らしたくないなら FULL です。実は LEFT と RIGHT は表の左右を入れ替えれば同じ結果になるため、現場では LEFT がよく使われます。

NULLが入る場面

田中 / D09NULL相手の部署が見つからない → 部署名はNULL

NULL が現れるのは、「必ず残す側」の行に対して、相手の表に一致する行が存在しないときです。残った行の「相手側の列」を埋める値がないので、データベースは NULL を入れます。

NULL について注意したいのは、「空文字("")」や「0」とは別ものだという点です。NULL は「データそのものが存在しない・不明」という意味で、たとえば「部署が割り当てられていない」状態を正確に表します。0円や空文字は「値はあるが中身がそれ」という意味なので区別します。

この性質を使うと、「相手のいないデータ」を見つけることができます。外部結合した結果で部署名が NULL の行を探せば「所属が決まっていない社員」が、社員名が NULL の行を探せば「人がいない部署」が分かります。内部結合ではこれらの行が消えてしまうため見つけられない、というのが両者の決定的な違いです。

📌
なぜNULLが生まれるのか

社員表(左)佐藤 D01田中 D09部署表(右)D01 営業部一致 → 結合相手なし田中 D09NULL社員行は残す、部署名は埋めるものがない → 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付きで全員残す外部結合」と「完全なペアだけ残す内部結合」、この対比を覚えておくと迷いません。

練習問題

🎯
基本情報技術者 練習問題

Q1.外部結合(OUTER JOIN)の説明として最も適切なものはどれか。
A.結合条件を満たした行だけを残し、相手のいない行は捨てる
B.一方(または両方)の表の行を、相手がいなくても必ず残す結合
C.2つの表の列を重ねて重複行を取り除く
D.行を絞り込み、条件に合う行だけを取り出す
Q2.社員表をすべて残し、対応する部署があれば部署名を付け、なければNULLにしたい。使うべき結合はどれか(社員表が左)。
A.INNER JOIN(内部結合)
B.LEFT OUTER JOIN(左外部結合)
C.RIGHT OUTER JOIN(右外部結合)
D.どれを使っても結果は同じ
Q3.外部結合の結果にNULLが現れるのはどんなときか。
A.必ず残す側の行に対し、相手の表に一致する行が存在しないとき
B.両方の表に一致する行がそろっているとき
C.結合条件をまったく指定しなかったとき
D.主キーが設定されていないとき

関連コンテンツ