内部結合と外部結合の違い:残る行・NULL・左外部結合と右外部結合・SQLの書き方を比較
結合(JOIN)は、2つの表の行を、ONで指定した条件(多くは外部キーと主キーの値が等しいこと)で組み合わせて、1つの結果の表を作る操作です。内部結合は、条件に一致する相手がある行の組み合わせだけを結果に残し、相手がない行は、どちらの表のものも消えます。外部結合は、一致する組み合わせに加えて、指定した側の表の行を、相手がなくても残し、相手の表の列をNULLで埋めます。左側の表の行をすべて残すのが左外部結合(LEFT OUTER JOIN)、右側を残すのが右外部結合(RIGHT OUTER JOIN)、両方を残すのが完全外部結合(FULL OUTER JOIN)です。「相手がない行も結果に出したいか」で使い分けます。
| 項目 | 内部結合(INNER JOIN) | 外部結合(OUTER JOIN) |
|---|---|---|
| 結果に残る行 | 結合の条件に一致する行の組み合わせだけ | 一致する組み合わせに加えて、残す側に指定した表の、一致する相手がない行 |
| 相手がない行の扱い | 左右どちらの表の行も、結果から消える | 残す側の行は、相手の表の列をNULLにして1行として残る。残す側でない表の行は消える |
| 種類 | 1種類。INNERを省いて JOIN とだけ書いてもよい | 左外部結合(LEFT)、右外部結合(RIGHT)、完全外部結合(FULL)の3種類。OUTERは省いてもよい |
| SQLの書き方の例 | SELECT … FROM 社員 INNER JOIN 部署 ON 社員.部署ID = 部署.部署ID | SELECT … FROM 社員 LEFT OUTER JOIN 部署 ON 社員.部署ID = 部署.部署ID |
| 結果の行数の例(社員4人のうち1人は部署IDがNULL、3つの部署のうち1つは社員がいない) | 3行。部署IDがNULLの社員と、社員のいない部署は出てこない | 社員表を残す左外部結合では4行(部署IDがNULLの社員は部署名がNULLになる)。両方を残す完全外部結合では5行 |
| 表を書く順番 | 左右を入れ替えても、結果の行は同じ(列の並びは変わる) | 左外部結合と右外部結合では、どちらの表を左に書くかで結果が変わる。A LEFT OUTER JOIN B と B RIGHT OUTER JOIN A は同じ行を返す |
| 相手の表の列への条件 | ONに書いても、WHERE句に書いても、結果は同じ | WHERE句に書くと、NULLで埋めた行が条件を満たさずに消え、内部結合と同じ結果になることがある。相手がない行も残したいときはONに書く |
| 主な用途 | 両方の表にデータがそろっているものだけを使いたいとき(注文に顧客の氏名を付けるなど) | 相手がない行も含めて一覧にしたいとき(部署が未設定の社員も含めた社員の一覧など)、相手がない行を探したいとき |
数値は代表的な目安で、世代や製品によって異なります。