情報処理試験のデータベース分野を勉強していると、「内部結合と外部結合って何が違うの?」「INNER JOINの構文がいまいちピンとこない」と悩む場面が出てきます。

この記事では、内部結合(INNER JOIN)の定義・SQL構文・動作の仕組みを、日常の例え話と図解で整理します。

対象試験と出題頻度

内部結合は、基本情報技術者・応用情報技術者で出題されるテーマです。

SQLのテーブル結合問題として定番化しており、WHERE句やINNER JOIN句を使った結合結果の推定が繰り返し問われます。

詳細をクリックして確認
対象試験:
基本情報技術者
応用情報技術者
出題頻度:
★★★★☆
ランクA(重要)必ず覚えておくべき

用語の定義

情報処理試験を勉強していると、「内部結合って外部結合と何が違うの?」と混乱しがちです。

内部結合(INNER JOIN)とは、一言で言うと

 「2つの表を共通の列で突き合わせ、両方に一致する行だけを取り出す結合方法

のことです。

📊 内部結合の基本情報

項目 内容
英語名 INNER JOIN
分類 SQLのテーブル結合(DMLの範囲)
構文キーワード INNER JOIN ~ ON 条件 / WHERE句での等値結合
結果に含まれる行 両方の表で結合条件が一致した行のみ
対比用語 外部結合(OUTER JOIN)

解説

業務システムでは、データを正規化して複数の表に分割して管理するのが基本です。例えば「注文データ」と「製品マスタ」は別テーブルに格納されます。

しかし、「注文された製品の名前と数量を一覧で見たい」という要件では、2つの表を横につなげて1つの結果にする必要があります。このとき使うのがテーブル結合であり、最も基本的な結合方法が内部結合です。

SQL構文:2つの書き方

内部結合のSQLには、INNER JOIN句を使う書き方と、WHERE句で結合条件を指定する書き方の2種類があります。どちらも実行結果は同じです。

📝 書き方① INNER JOIN句(推奨)

SELECT 社員.社員名, 部署.部署名
FROM 社員
  INNER JOIN 部署
    ON 社員.部署ID = 部署.ID;

※ ON句で結合条件を明示するため、可読性が高い。

📝 書き方② WHERE句

SELECT 社員.社員名, 部署.部署名
FROM 社員, 部署
WHERE 社員.部署ID = 部署.ID;

※ FROM句にカンマ区切りで表を並べ、WHERE句で結合条件を書く旧来の書き方。IPA過去問ではこの形式が多い。

図解:内部結合の動作イメージ

具体例として、「社員」表と「部署」表を内部結合するケースを示します。

内部結合の動作イメージ

社員テーブル

社員名 部署ID
田中 1
鈴木 2
佐藤 4

部署テーブル

ID 部署名
1 営業部
2 開発部
3 人事部

▼ 部署IDが一致する行だけを結合

結合結果

社員名 部署ID 部署名
田中 1 営業部
鈴木 2 開発部

黄色=両方に存在し結合された行 =相手にIDが存在しないため結果から除外された行

佐藤(部署ID=4)は部署テーブルにID=4が存在しないため結果に含まれません。人事部(ID=3)も社員テーブルに部署ID=3の行がないため同様です。

これが「一致する行だけを取り出す」という内部結合の核心的な動作です。

外部結合との違い

内部結合を正しく位置づけるには、外部結合との対比が近道です。

結合の種類 結果に含まれる行 NULLの扱い
内部結合
(INNER JOIN)
両方の表で条件が一致した行のみ 一致しない行は除外される
左外部結合
(LEFT OUTER JOIN)
左表の全行+右表で一致した行 右表に一致がない列はNULL
右外部結合
(RIGHT OUTER JOIN)
右表の全行+左表で一致した行 左表に一致がない列はNULL
完全外部結合
(FULL OUTER JOIN)
両方の表の全行 一致がない列はNULL

外部結合は「基準テーブルの行を全て残す」のに対し、内部結合は「双方に一致がなければ容赦なく除外する」点が最大の違いです。

内部結合 vs 左外部結合 比較図

INNER JOIN

左表 右表 一致

▲ 一致する行(緑)だけが結果に残る

LEFT OUTER JOIN

左表 右表 一致

▲ 左表の全行(青)が残る+一致行(緑)も含む

一致行(結果に含まれる) 左表の全行(LEFT JOINで残る) 結果に含まれない

では、この用語が試験でどのように出題されるか見ていきましょう。

💡 内部結合の核心を3行で

・2つの表を共通の列で突き合わせ、両方に一致する行だけを取り出す結合方法
・INNER JOIN ~ ON 構文とWHERE句による等値結合の2種類の書き方がある
・一致しない行は結果から除外される点が、NULLを補って残す外部結合との違い


試験ではこう出る!

内部結合は、FE・APの科目A(午前)でSQL結合問題として繰り返し出題されています。

出題パターンは大きく2つに分かれます。

📊 過去問での出題実績

試験回 出題内容 問われたポイント
FE R2免除
問28
「注文」表と「製品」表をWHERE句で結合したSQL文の実行結果を選ぶ問題 ・WHERE句での等値結合は内部結合と同じ動作
・片方にしか存在しない製品コードは結果に含まれない
FE H24春
午前 問30
上記FE R2問28と同一構成の問題(流用) ・FEでは同じ問題が別の年度で再出題される典型例
AP R3秋
午前 問29
「部門別売上」表から部門コードごと・期ごとの売上を得るSQL文を選ぶ問題 ・INNER JOINの結果とUNION・CROSS JOIN・INTERSECTの結果の違い
・正解はUNION(内部結合はひっかけ選択肢)
FE H31春
午前 問29
「学生」表と「学部」表をWHERE句で結合し、条件で絞って氏名を取得する問題 ・結合条件とフィルタ条件を正しく読み分ける力が必要

📝 IPA試験での出題パターン

パターン1:「SQL文の実行結果を選べ」(最頻出)
2つの表とSQL文が示され、実行結果として正しい表を4択から選ぶ形式。WHERE句やINNER JOIN句による結合結果を手作業でトレースして解く。ひっかけは「片方にしか存在しないキーの行が結果に含まれる」選択肢(外部結合の結果と混同させる狙い)。

 

パターン2:「正しい結合方法を選べ」
AP R3秋問29のように、INNER JOIN・UNION・CROSS JOIN・INTERSECTの4つの中から目的に合うものを選ばせる形式。それぞれの集合演算の結果行数の違いを理解していれば即答できる。

 

ここだけは確実に押さえてください。「両方に存在する行だけが残る」というルールさえ押さえておけば、結合結果を正しくトレースできます。深追いは不要です。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. 「社員」表と「部署」表をINNER JOINで結合した場合の説明として、最も適切なものはどれでしょうか?

  • A. 社員表と部署表の両方に結合条件が一致する行だけが結果に含まれ、一致しない行は除外される。
  • B. 社員表の全行が結果に残り、部署表に一致する行がない場合は部署名がNULLで補われる。
  • C. 社員表と部署表のすべての行の組み合わせ(直積)が結果として返される。

正解と解説を見る

正解:A

解説:
INNER JOINは、2つの表で結合条件が一致する行だけを取り出す結合方法です。一致しない行は結果から除外されます。

選択肢Bは左外部結合(LEFT OUTER JOIN)の説明です。左外部結合は左表の全行を結果に残し、右表に一致がない列をNULLで補います。選択肢Cは直積(CROSS JOIN)の説明です。直積は結合条件を指定せず、2つの表のすべての行の組み合わせを返す演算であり、結果の行数は「左表の行数 × 右表の行数」になります。


よくある質問(FAQ)

Q. INNER JOINの「INNER」は省略できますか?

省略できます。SQL標準では、単に「JOIN」と書いた場合はINNER JOINとして扱われます。ただし、IPA試験の問題文ではINNER JOINと明記されるか、WHERE句による等値結合で出題されることが大半です。実務でも可読性の観点からINNERを省略しないのが一般的です。

Q. 3つ以上の表を内部結合することはできますか?

できます。INNER JOINを連続して記述することで3表以上の結合が可能です。例えば「社員 INNER JOIN 部署 ON ~ INNER JOIN 勤務地 ON ~」のように、ON句ごとに結合条件を指定します。APの午後(科目B)問題では3表結合のSQL文が出題されることがあるため、構文に慣れておくと有利です。

Q. 内部結合と関係代数の「結合」は同じ意味ですか?

関係代数における「自然結合(Natural Join)」は共通属性名が一致する行を結合する演算であり、内部結合と本質的に同じ操作です。ただし、SQLのINNER JOINはON句で任意の条件を指定できるため、関係代数のθ結合(シータ結合)に近い柔軟性を持ちます。IPA試験では関係代数の問題とSQL問題は別々に出題されるため、「SQLではINNER JOIN、関係代数では結合演算」と対応づけて整理しておけば十分です。

Q. 実務ではINNER JOINとOUTER JOINのどちらを使うことが多いですか?

要件次第ですが、基本的にはINNER JOINの使用頻度が圧倒的に高いです。業務ロジックの多くは「対応するデータが存在する行」を処理対象にするためです。一方、「まだ注文がない顧客も一覧に含めたい」というケースではLEFT OUTER JOINを使います。どちらを使うかは「一致しない行を結果に残す必要があるか否か」で判断します。