データベースの勉強をしていると、「結合って何種類あるの?内部結合と外部結合は何が違うの?」と混乱しがちです。この記事では、関係データベースにおける結合(JOIN)の仕組みと種類を、日常の例え話と図解で整理します。
対象試験と出題頻度
結合(JOIN)は、ITパスポート・基本情報技術者・応用情報技術者のすべてで出題されるテーマです。
SQLのSELECT文と組み合わせた実践問題や、関係演算としての「選択」「射影」との区別が問われます。
詳細をクリックして確認
ITパスポート
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
結合(JOIN)とは、一言で言うと
「2つの表(テーブル)を、共通の列の値を手がかりにして横につなげる操作」
のことです。
イメージとしては、「2冊の名簿を「社員番号」で突き合わせて1枚にまとめる作業」です。
A名簿には社員番号と名前、B名簿には社員番号と部署名が書かれている。
この2冊を社員番号で照合してくっつければ、「名前と部署名が一覧で見える1枚のリスト」が完成します。これが結合の本質です。
📊 結合(JOIN)の基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | JOIN(ジョイン) |
| 分類 | 関係演算(選択・射影と並ぶ3大操作の1つ) |
| 主な種類 | 内部結合(INNER JOIN)、外部結合(OUTER JOIN)、自然結合、直積 |
| SQLでの書き方 | FROM句でJOIN句を使用、またはWHERE句で結合条件を指定 |
解説
正規化によってテーブルを分割すると、データの重複は減りますが、必要な情報が複数のテーブルに散らばります。
そこで「分けたテーブルを必要に応じてつなぎ直す」ための操作として結合が使われます。
内部結合(INNER JOIN)
内部結合は、両方のテーブルに共通の値が存在する行だけを取り出してつなげる操作です。
片方にしか存在しない行は結果に含まれません。
内部結合のイメージ
社員テーブル
| 社員ID | 名前 | 部署ID |
|---|---|---|
| 001 | 田中 | D1 |
| 002 | 鈴木 | D2 |
| 003 | 佐藤 | D4 |
部署テーブル
| 部署ID | 部署名 |
|---|---|
| D1 | 営業部 |
| D2 | 開発部 |
| D3 | 総務部 |
↓ 部署IDで内部結合
結果
| 社員ID | 名前 | 部署ID | 部署名 |
|---|---|---|---|
| 001 | 田中 | D1 | 営業部 |
| 002 | 鈴木 | D2 | 開発部 |
※ D4(佐藤)は部署テーブルに存在しない → 除外
※ D3(総務部)は社員テーブルに存在しない → 除外
SQLでは2通りの書き方があります。
/* 書き方① INNER JOIN句 */
SELECT 社員.名前, 部署.部署名
FROM 社員 INNER JOIN 部署
ON 社員.部署ID = 部署.部署ID;
/* 書き方② WHERE句(旧来の書き方) */
SELECT 社員.名前, 部署.部署名
FROM 社員, 部署
WHERE 社員.部署ID = 部署.部署ID;
外部結合(OUTER JOIN)
外部結合は、基準となるテーブル側の行をすべて残し、もう一方のテーブルで一致しない行にはNULLを補って結果に含めます。
「どちら側を基準にするか」で3種類に分かれます。
| 種類 | 基準 | 動作 |
|---|---|---|
| LEFT OUTER JOIN | 左のテーブル | 左テーブルの全行を残す。右テーブルに一致がなければNULL |
| RIGHT OUTER JOIN | 右のテーブル | 右テーブルの全行を残す。左テーブルに一致がなければNULL |
| FULL OUTER JOIN | 両方 | 両テーブルの全行を残す。一致がない側にはNULL |
左外部結合(LEFT OUTER JOIN)のイメージ
社員テーブル(基準)
| 社員ID | 名前 | 部署ID |
|---|---|---|
| 001 | 田中 | D1 |
| 002 | 鈴木 | D2 |
| 003 | 佐藤 | D4 |
部署テーブル
| 部署ID | 部署名 |
|---|---|
| D1 | 営業部 |
| D2 | 開発部 |
| D3 | 総務部 |
↓ 部署IDで左外部結合
結果
| 社員ID | 名前 | 部署ID | 部署名 |
|---|---|---|---|
| 001 | 田中 | D1 | 営業部 |
| 002 | 鈴木 | D2 | 開発部 |
| 003 | 佐藤 | D4 | NULL |
※ 佐藤(D4)は部署テーブルに一致なし → 部署名がNULLで残る
※ D3(総務部)は社員テーブルにない → 結果に含まれない
自然結合と直積
内部結合・外部結合のほかに、関係代数で登場する用語として「自然結合」と「直積」があります。
| 用語 | 意味 |
|---|---|
| 自然結合 | 共通の属性名が一致する行同士を自動的に結合し、重複する列を1つにまとめる操作。INNER JOINと結果は同じだが、結合列の重複が消える点が異なる |
| 直積 | 2つの表の全行をすべて組み合わせる操作。行数は「表Aの行数 × 表Bの行数」になる。条件を付けずにFROM句にテーブルを並べると直積になる |
関係演算3つの比較
関係データベースの基本操作は「選択」「射影」「結合」の3つです。
それぞれの操作対象を整理しておくと、選択肢を素早く切り分けられます。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 結合の核心を3行で
・2つの表を共通列の値で横につなげる関係演算
・内部結合は「両方に一致する行だけ」、外部結合は「基準側の全行を残してNULLで補う」
・選択(行の抽出)・射影(列の抽出)と混同しないことが得点の鍵
試験ではこう出る!
結合はIP・FE・APのいずれでも繰り返し出題されている定番テーマです。出題パターンは大きく3つに分かれます。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| IP R5 問100 |
関係データベースにおける結合操作の説明を選ぶ問題 | ・「フィールドの値で関連付けした表を作る」が正解 ・選択・射影・共通の説明がひっかけ |
| FE R2免除 問28 |
WHERE句でのテーブル結合(内部結合)のSQL実行結果を選ぶ問題 | ・WHERE句による結合 = 内部結合 ・両方に一致する行だけが結果に含まれる |
| FE H30秋 午前 問28 |
自然結合後に選択と射影を行い結果を求める問題 | ・自然結合+選択+射影の組合せ ・関係代数の用語を正確に区別できるかが鍵 |
| AP H30春 午前 問27 |
関係Rと関係Sから関係Xを求める関係演算を選ぶ問題 | ・結合・差・直積・和の4演算を正しく区別 ・結合の選択肢が正解ではなく和が正解(ひっかけ) |
📝 IPA試験での出題パターン
パターン1:「結合操作の説明を選べ」(IP頻出)
選択・射影・結合・共通(積集合)の説明文が並び、結合に該当するものを選ぶ形式。「2つの表をフィールドの値で関連付ける」が結合のキーワード。
パターン2:「SQL文の実行結果を答えよ」(FE頻出)
FROM句に2つの表を置き、WHERE句で結合条件を指定したSELECT文の結果を求める形式。内部結合の仕組みを理解していれば解ける。
パターン3:「関係代数の演算を選べ」(FE・AP頻出)
2つの関係から結果の関係を得るために使った演算の組合せを問う形式。自然結合+選択+射影の組合せパターンが定番。
ここだけは確実に押さえてください。「選択=行」「射影=列」「結合=表と表をつなぐ」――この3語の対応さえ覚えれば、大半の問題は解けます。外部結合のLEFT/RIGHTの違いまで問われるのはFE午後レベルなので、IP受験者は深追い不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. 関係データベースにおける「結合」の説明として、最も適切なものはどれでしょうか?
- A. 表から、指定した条件を満たす行(タプル)だけを抜き出して新しい表を作る操作である。
- B. 表から、特定の列(属性)だけを取り出して新しい表を作る操作である。
- C. 2つの表を、共通する列の値をもとに横方向に組み合わせて新しい表を作る操作である。
正解と解説を見る
正解:C
解説:
結合(JOIN)は、2つの表が共通して持つ列の値を照合し、一致する行同士を横につなげて1つの表にまとめる関係演算です。
選択肢Aは「選択(Selection)」の説明です。選択は行を条件で絞り込む操作であり、表同士をつなげる操作ではありません。選択肢Bは「射影(Projection)」の説明です。射影は特定の列を取り出す操作であり、行の照合やテーブル間の結合は行いません。
よくある質問(FAQ)
Q. INNER JOINとWHERE句による結合は、結果が異なることはありますか?
内部結合の場合、結果は同じです。ただし外部結合はJOIN句でしか書けません。WHERE句に結合条件を書く書き方は旧来のSQL構文で、現在はJOIN句で明示的に書くのが標準的なスタイルです。IPA試験ではどちらの書き方も出題されるため、両方読めるようにしておく必要があります。
Q. 外部結合でNULLが入る列は、計算や集計に影響しますか?
影響します。NULLはSUM・AVG・COUNTなどの集約関数で特殊な扱いを受けます。SUMやAVGではNULLの行は計算対象から除外され、COUNT(*)以外のCOUNTもNULLをカウントしません。外部結合の結果をそのまま集計すると意図しない数値になる場合があるため、実務ではCOALESCE関数でNULLを0などに置換してから集計するのが一般的です。
Q. 3つ以上のテーブルを結合することはできますか?
できます。JOINを連鎖させることで何テーブルでも結合できます。例えば「社員 JOIN 部署 ON … JOIN 役職 ON …」のように書きます。IPA試験の午前問題では2テーブルの結合が中心ですが、FEやAPの午後問題では3テーブル以上の結合を含むSQLが出題されることがあります。
Q. 「直積」は実務で使うことがありますか?
意図的に直積を使う場面はほぼありません。直積は全行×全行の組合せを生成するため、行数が爆発的に増えてパフォーマンスが大幅に劣化します。ただし、FROM句にテーブルをカンマ区切りで並べてWHERE句を書き忘れると、意図せず直積になってしまう事故は実務でも起こり得ます。試験では関係代数の演算を区別させる問題で選択肢として登場します。