2つの表で結合条件を満たす行だけを組み合わせる結合。
内部結合(INNER JOIN)とは、2つの表で結合条件(=つなぐルール)を満たす行だけを組み合わせて、1つの表として取り出す操作のことです。条件に合わなかった行は結果に残りません。
身近な例で考えると、名簿と座席表を「学生番号」でつき合わせる作業に似ています。名簿にあって座席表にもいる学生だけが「名前と座席」のセットになります。番号がどちらか片方にしかない人は、つなぎ合わせられないので一覧から外れます。
上のツールで▶ボタンを押すと、社員表と部署表を部署IDで突き合わせ、両方にそろった行だけが結果表に積み上がっていく流れを確認できます。
結合条件とは、どの列の値が等しい行どうしをつなぐかを表すルールです。多くの場合、2つの表に共通する意味を持つ列(今回は「部署ID」)を等号で結びます。SQLでは ON のあとに条件を書きます。
ON 社員.部署ID = 部署.部署ID
条件を読み解く手順は次のとおりです。
・①つなぐ列を選ぶ:両方の表に共通する「部署ID」を選ぶ
・②等号で結ぶ:社員側の部署IDと部署側の部署IDが等しい行を探す
・③一致した行を組み合わせる:見つかった2行を横につなげて1行にする
どちらの表のどの列かをはっきりさせるため、表名.列名の形で書きます。共通でない列どうし(社員名と部署名など)を比べても正しくつながらないので、結合条件には「同じ意味を持つ列」を選ぶのがポイントです。
内部結合は両方の表にそろった「共通部分」だけを残します。一方、外部結合は一方の表の行を相手がいなくても必ず残す結合です(足りない列はNULL=値なしで埋めます)。
| 項目 | 内部結合 | 外部結合 |
|---|---|---|
| 残る行 | 両方そろった行だけ | 一方の表の行は必ず残る |
| 相手なしの扱い | 捨てる | NULLで埋めて残す |
| ベン図で言うと | 重なった部分 | 片方の円すべて+重なり |
たとえば「所属が決まっていない新人も含めて社員を全員一覧にしたい」場合は内部結合では新人が消えてしまうため、外部結合を使います。「漏らさず全部残したい表があるか」で内部結合か外部結合かを使い分けると覚えておくと迷いません。
内部結合は、内部で「全組み合わせを試してから、条件を満たすものだけ残す」という手順を踏みます。社員表の全行と部署表の全行を一時的に掛け合わせた後、部署IDが一致する組み合わせだけを選び出します。
上の図で確認してみましょう。
・佐藤(D01):部署表にD01「営業部」がある → 一致 → 結果に残る
・田中(D09):部署表にD09がない → 不一致 → 消える
・鈴木(D02):部署表にD02「総務部」がある → 一致 → 結果に残る
・D03(開発部):社員表にD03を持つ社員がいない → 不一致 → 消える
「一致した行だけ残る」という結果は、「両方に対になるデータが存在する行のみ意味のある組み合わせとして扱う」というデータベースの考え方から来ています。対応するデータがない行を無理に残すと「部署が不明な社員一覧」のような、不完全な情報が混じったデータになってしまうからです。
INNER JOINが最適な場面は「両方の表に対応するデータが必ずある」と分かっているときです。たとえば次のようなケースです。
・注文一覧に商品名を加えたい:注文表の「商品ID」と商品表の「商品ID」で結合 → 商品のある注文だけが対象なので一致が保証されやすい
・社員の部署名を一覧に追加したい:全社員に部署が必ず割り当てられている前提なら内部結合で十分
・完全なデータだけを取り出したい:不完全なレコード(対応なし)を結果から除外したい場合
逆に、「部署に配属されていない新人も表示したい」「注文のない商品も含めたい」という場面では、外部結合(OUTER JOIN)の出番になります。「漏れなく全部残したい側があるか」を基準に選ぶのが、内部結合と外部結合を使い分けるコツです。