FE EXAM

内部結合(INNER JOIN)

2つの表で結合条件を満たす行だけを組み合わせる結合。

INTERACTIVE VISUALIZATION
一致して採用
相手なし→除外
フェーズ
idle
結合された行
0
結合条件
部署ID 一致
シナリオ
ステップ1 / 7
STEP 1/72つの表を用意する左に社員表(社員名と所属の部署ID)、右に部署表(部署IDと部署名)があります。社員表には「部署ID」しかなく部署名が分かりません。これを部署表とつなげて、社員名と部署名を一覧にしたいというのが目標です。
社員表
社員名部署ID
佐藤D01
鈴木D02
田中D09
部署表
部署ID部署名
D01営業部
D02開発部
D03総務部
↓ 内部結合の結果
社員名部署ID部署名
(まだ結合された行はありません)
社員表部署表共通部分
対応するSQL
SELECT 社員名, 社員.部署ID, 部署名
FROM 社員
INNER JOIN 部署
 ON 社員.部署ID = 部署.部署ID;
解説

📌
INNER JOINとは

社員表部署表結果

内部結合(INNER JOIN)とは、2つの表で結合条件(=つなぐルール)を満たす行だけを組み合わせて、1つの表として取り出す操作のことです。条件に合わなかった行は結果に残りません。

身近な例で考えると、名簿と座席表を「学生番号」でつき合わせる作業に似ています。名簿にあって座席表にもいる学生だけが「名前と座席」のセットになります。番号がどちらか片方にしかない人は、つなぎ合わせられないので一覧から外れます。

上のツールで▶ボタンを押すと、社員表と部署表を部署IDで突き合わせ、両方にそろった行だけが結果表に積み上がっていく流れを確認できます。

🔗
結合条件の指定

結合条件とは、どの列の値が等しい行どうしをつなぐかを表すルールです。多くの場合、2つの表に共通する意味を持つ列(今回は「部署ID」)を等号で結びます。SQLでは ON のあとに条件を書きます。

ON 社員.部署ID = 部署.部署ID

条件を読み解く手順は次のとおりです。
①つなぐ列を選ぶ:両方の表に共通する「部署ID」を選ぶ
②等号で結ぶ:社員側の部署IDと部署側の部署IDが等しい行を探す
③一致した行を組み合わせる:見つかった2行を横につなげて1行にする

どちらの表のどの列かをはっきりさせるため、表名.列名の形で書きます。共通でない列どうし(社員名と部署名など)を比べても正しくつながらないので、結合条件には「同じ意味を持つ列」を選ぶのがポイントです。

⚖️
外部結合との違い

内部結合外部結合(左)

内部結合は両方の表にそろった「共通部分」だけを残します。一方、外部結合は一方の表の行を相手がいなくても必ず残す結合です(足りない列はNULL=値なしで埋めます)。

項目内部結合外部結合
残る行両方そろった行だけ一方の表の行は必ず残る
相手なしの扱い捨てるNULLで埋めて残す
ベン図で言うと重なった部分片方の円すべて+重なり

たとえば「所属が決まっていない新人も含めて社員を全員一覧にしたい」場合は内部結合では新人が消えてしまうため、外部結合を使います。「漏らさず全部残したい表があるか」で内部結合か外部結合かを使い分けると覚えておくと迷いません。

📌
なぜ「一致した行だけ」になるのか

社員表佐藤 D01田中 D09鈴木 D02部署表D01 営業部D02 総務部D03 開発部結果:佐藤・鈴木の2行田中(D09なし)D03(社員なし)

内部結合は、内部で「全組み合わせを試してから、条件を満たすものだけ残す」という手順を踏みます。社員表の全行と部署表の全行を一時的に掛け合わせた後、部署IDが一致する組み合わせだけを選び出します。

上の図で確認してみましょう。
佐藤(D01):部署表にD01「営業部」がある → 一致 → 結果に残る
田中(D09):部署表にD09がない → 不一致 → 消える
鈴木(D02):部署表にD02「総務部」がある → 一致 → 結果に残る
D03(開発部):社員表にD03を持つ社員がいない → 不一致 → 消える

「一致した行だけ残る」という結果は、「両方に対になるデータが存在する行のみ意味のある組み合わせとして扱う」というデータベースの考え方から来ています。対応するデータがない行を無理に残すと「部署が不明な社員一覧」のような、不完全な情報が混じったデータになってしまうからです。

📌
INNER JOINを使う場面

注文表注文ID商品ID商品表商品ID商品名商品IDで結合注文ID・商品ID・商品名 がそろった行

INNER JOINが最適な場面は「両方の表に対応するデータが必ずある」と分かっているときです。たとえば次のようなケースです。
注文一覧に商品名を加えたい:注文表の「商品ID」と商品表の「商品ID」で結合 → 商品のある注文だけが対象なので一致が保証されやすい
社員の部署名を一覧に追加したい:全社員に部署が必ず割り当てられている前提なら内部結合で十分
完全なデータだけを取り出したい:不完全なレコード(対応なし)を結果から除外したい場合

逆に、「部署に配属されていない新人も表示したい」「注文のない商品も含めたい」という場面では、外部結合(OUTER JOIN)の出番になります。「漏れなく全部残したい側があるか」を基準に選ぶのが、内部結合と外部結合を使い分けるコツです。

練習問題

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

Q1.内部結合(INNER JOIN)の説明として最も適切なものはどれか。
A.2つの表の行をすべて掛け合わせ、条件は無視して残す
B.結合条件を満たし両方の表にそろった行だけを組み合わせて取り出す
C.一方の表の行は条件に合わなくても必ず残す
D.列を取り除いて重複行を1つにまとめる
Q2.社員表(社員名, 部署ID)と部署表(部署ID, 部署名)を内部結合するとき、結合条件として適切なものはどれか。
A.ON 社員.社員名 = 部署.部署名
B.ON 社員.部署ID = 部署.部署ID
C.ON 社員.社員名 = 部署.部署ID
D.条件は不要で、すべての組み合わせを残す
Q3.内部結合と外部結合の違いとして正しいものはどれか。
A.内部結合は相手のいない行も必ず残すが、外部結合は捨てる
B.両者に違いはなく、結果はつねに同じになる
C.内部結合は両方にそろった行だけ残し、外部結合は一方の表の行を必ず残す
D.内部結合は列を絞る操作で、外部結合は行を絞る操作である

関連コンテンツ

内部結合(INNER JOIN) | Vizigo