情報処理試験を勉強していると、「和集合と積集合って何が違うの?」「直積ってどういう意味?」と混乱しがちです。この記事では、関係データベースにおける集合演算(和・差・積・直積)の4種類を、ベン図とSQL対応表を使って整理します。
対象試験と出題頻度
集合演算は、基本情報技術者・応用情報技術者で出題されるテーマです。
関係データベースのデータ操作問題として定番化しており、「関係演算(選択・射影・結合)」との区別を正確に把握しているかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
集合演算(Set Operations)とは、一言で言うと
「2つの表(関係)を”行の集合”として捉え、足し算・引き算・共通部分の抽出・全組み合わせの生成を行う4種類のデータ操作」
のことです。
イメージとしては、「2つの名簿の合体・比較」です。
例えば「A部署の社員名簿」と「B部署の社員名簿」があるとき、
2つを合体する(和)
Aにしかいない人を出す(差)
両方にいる人を出す(積)
AとBの全員同士を1対1で組み合わせる(直積)
この4パターンが集合演算です。
📊 集合演算の基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Set Operations |
| 種類 | 和(UNION)、差(EXCEPT)、積(INTERSECT)、直積(CROSS JOIN) |
| 操作対象 | 関係データベースの表(行の集合) |
| 前提条件 | 和・差・積は「和両立」が必要(列の数と型が同じ)。直積は不要 |
| 対になる概念 | 関係演算(選択・射影・結合・商) |
解説
関係データベースでは、テーブルを「行の集合」として扱います。
数学の集合論で言うところの和集合・差集合・積集合・直積集合の考え方を、そのままテーブル操作に持ち込んだのが集合演算です。
ここだけは確実に押さえてください。
和・差・積の3つを実行するには、2つの表が「和両立(Union Compatible)」でなければなりません。和両立とは、列の数(次数)が同じで、対応する列のデータ型が一致している状態を指します。直積だけは列構成が異なっていても実行できます。
4つの集合演算をベン図で理解する
以下の図では、表R(青)と表S(オレンジ)の2つの表を想定し、それぞれの演算結果を色付き領域で示します。
📊 集合演算 ベン図一覧
和(R ∪ S)
両方の行をすべて含む(重複除去)
差(R − S)
Rにあり Sにない行だけ
積(R ∩ S)
両方に共通する行だけ
直積(R × S)
Rの各行 × Sの各行 = 全組み合わせ(3×3=9行)
具体例で確認する
表R(3行)と表S(3行)を使って、各演算の結果がどうなるかを確認します。
元データ
表R
| 社員ID | 名前 |
|---|---|
| 001 | 田中 |
| 002 | 鈴木 |
| 003 | 佐藤 |
表S
| 社員ID | 名前 |
|---|---|
| 002 | 鈴木 |
| 003 | 佐藤 |
| 004 | 高橋 |
📊 各演算の結果
| 演算 | 記号 | 結果に含まれる行 | 行数 |
|---|---|---|---|
| 和 | R ∪ S | 田中, 鈴木, 佐藤, 高橋 | 4 |
| 差 | R − S | 田中 | 1 |
| 積 | R ∩ S | 鈴木, 佐藤 | 2 |
| 直積 | R × S | Rの3行 × Sの3行 = 全9通りの組み合わせ | 9 |
SQLとの対応
各演算はSQLのキーワードと1対1で対応しています。
| 演算 | 数学記号 | SQL構文 | 和両立 |
|---|---|---|---|
| 和 | R ∪ S | SELECT * FROM R UNION SELECT * FROM S |
必要 |
| 差 | R − S | SELECT * FROM R EXCEPT SELECT * FROM S |
必要 |
| 積 | R ∩ S | SELECT * FROM R INTERSECT SELECT * FROM S |
必要 |
| 直積 | R × S | SELECT * FROM R, S |
不要 |
集合演算と関係演算の違い
データベースの演算体系は「集合演算」と「関係演算」の2系統に分かれます。混同しやすいので、役割の違いを整理しておきます。
集合演算 vs 関係演算
集合演算
対象:2つの表
操作:行の集合を足す・引く・重ねる
種類:和・差・積・直積
関係演算
対象:1つまたは2つの表
操作:行や列を条件で抜き出す・つなぐ
種類:選択・射影・結合・商
では、これらの知識が試験でどのように出題されるか見ていきましょう。
詳細解説:直積の行数の求め方(折りたたみ)
直積の結果行数は「表Rの行数 × 表Sの行数」で求まります。列数は「表Rの列数 + 表Sの列数」です。先ほどの例で言えば、Rが3行2列・Sが3行2列のとき、直積の結果は 3 × 3 = 9行、2 + 2 = 4列 の表になります。
SQLで SELECT * FROM R, S のように結合条件を書かずに2つの表を並べると直積になります。実務では意図せず直積が発生するとデータ量が爆発するため注意が必要ですが、試験では「直積のSQL表現を選べ」という形式で問われます。
💡 集合演算の核心を3行で
・和(∪)=合体、差(−)=引き算、積(∩)=共通、直積(×)=全組み合わせ
・和・差・積は「和両立(列数・型が同じ)」が前提条件。直積は不要
・SQLではUNION / EXCEPT / INTERSECT / FROM R, S が対応する
試験ではこう出る!
集合演算は、FE・APの午前(科目A)で定期的に出題されます。「数学記号とSQL構文の対応」および「差集合の演算結果を表で選ばせる」形式が中心です。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H28秋 午前 問28 |
関係R, Sの直積(R×S)に対応するSELECT文を選ぶ問題 | ・SELECT * FROM R, S が直積に対応・UNION=和、EXCEPT=差、INTERSECT=積がひっかけ |
| FE H23秋 午前 問32 |
R−(R−S) と同じ結果の関係演算を選ぶ問題 | ・正解は R∩S(積) ・ベン図を描けば一発で判別可能 |
| AP R4秋 午前 問27 |
“従業員”表に対して”異動”表による差集合演算の結果を選ぶ問題 | ・差の方向(R−SとS−Rは結果が異なる)がひっかけ ・共通行を除いた残りが正解 |
| AP H25秋 午前 問31 |
3つの商品表に対するSQL文と同等の関係式を選ぶ問題 | ・NOT INとUNIONの組み合わせが差集合と和集合の合成に対応 ・複数の集合演算を組み合わせる応用パターン |
📝 IPA試験での出題パターン
パターン1:「数学記号とSQLの対応を選べ」
直積・和・差・積のうち1つを取り上げ、対応するSELECT文を4択で選ばせる形式。FE H28秋 問28が典型例。UNION / EXCEPT / INTERSECT / FROM R, S の4つの対応さえ暗記しておけば即答できる。
パターン2:「演算結果の表を選べ」
2つの表と演算の種類が示され、結果の表を4択で選ばせる形式。AP R4秋 問27が典型例。差集合は「どちらからどちらを引くか」で結果が変わるため、方向の見極めが正答のカギ。
パターン3:「集合演算の組み合わせ式を解読させる」
R−(R−S) のように演算を入れ子にした式が与えられ、等価な式を選ばせる形式。ベン図を描いて塗りつぶせば確実に解ける。試験ではここまででOKです。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. 関係代数の演算のうち、関係R, Sの直積(R×S)に対応するSQL文として、最も適切なものはどれでしょうか?
- A. SELECT * FROM R UNION SELECT * FROM S
- B. SELECT * FROM R EXCEPT SELECT * FROM S
- C. SELECT * FROM R, S
正解と解説を見る
正解:C
解説:
直積は、2つの表に含まれる行のすべての組み合わせからなる表を返す演算です。SQLでは結合条件を指定せずにFROM句に複数の表を並べると、直積の結果が返されます。
選択肢Aの UNION は和集合演算に対応するSQL構文です。2つの表の行を合体し、重複を除去した結果を返します。選択肢Bの EXCEPT は差集合演算に対応するSQL構文です。Rに含まれSに含まれない行だけを返します。
よくある質問(FAQ)
Q. UNION と UNION ALL の違いは何ですか?
UNION は重複行を自動的に除去した結果を返しますが、UNION ALL は重複行もそのまま残して返します。数学的な和集合に対応するのは UNION のほうです。IPA試験ではほとんどの場合 UNION(重複除去あり)が前提になるため、UNION ALL との違いを深追いする必要はありません。
Q. 差集合は R−S と S−R で結果が変わりますか?
変わります。R−S は「Rにあり Sにない行」、S−R は「Sにあり Rにない行」を返すため、結果はまったく別物です。AP R4秋 午前問27では、この方向の違いがひっかけ選択肢として使われました。問題文の「〇〇表に対して△△表による差集合」という語順を正確に読み取ることが重要です。
Q. 直積と結合(JOIN)は何が違いますか?
直積は「条件なしですべての行を掛け合わせる」演算で、結合(JOIN)は「特定の条件に一致する行だけを組み合わせる」演算です。実際のSQLでは、直積を作ってからWHERE句で条件を絞ると結合と同じ結果になります。ただし、直積は行数が爆発的に増えるため、実務では結合条件を明示するのが基本です。
Q. 「和両立」の条件を満たさないとどうなりますか?
DBMSがエラーを返し、演算を実行できません。例えば列数が異なる2つの表に対してUNIONを実行すると、構文エラーになります。和両立の条件は「列の数が同じ」かつ「対応する列のデータ型が互換」の2つです。列名が違っていても型が合っていれば実行可能です。