戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2016年 秋期 午前(科目A)28


問題文

関係代数の演算のうち、関係R, Sの直積(RXS)に対応するSELECT文はどれか。ここで、関係R, Sを表R, Sに対応させ、表R及びSにそれぞれ行の重複はないものとする。

選択肢

SELECT * FROM R, S(正解)
SELECT * FROM R EXCEPT SELECT * FROM S
SELECT * FROM R UNION SELECT * FROM S
SELECT FROM R INTERSECT SELECT * FROM S

関係代数の直積 (R×S) に対応する SELECT 文はどれか【午前2 解説】

要点まとめ

  • 結論: 関係RとSの直積は全ての組合せを返すため SQL では SELECT * FROM R, S が対応し、正解は です。
  • 根拠: SQL の「FROM R, S」は R と S のカルテシアン積(CROSS JOIN)を生成し、関係代数の直積と意味が一致します。
  • 差がつくポイント: UNION/INTERSECT/EXCEPT は集合演算で列数や型の互換性が必要で、直積とは全く別の操作です。

正解の理由

関係代数の直積 R × S は「R の各タプルと S の各タプルのすべての組合せ」を生成する演算です。SQL では FROM に複数の表を並べる(古典的な記法)か明示的に CROSS JOIN を使うことでカルテシアン積を得られます。よって SELECT * FROM R, S は R×S に対応します。問題文で「表 R, S にそれぞれ行の重複はない」とあるため、集合としての直積の意味合いと SQL の結果が一致します。

よくある誤解

  • 「FROM R, S は結合(JOIN)と同じ」という誤解: WHERE 条件を付けなければ単なるカルテシアン積で、結合条件を付けて初めて意味のある結合になる。
  • 「UNION や INTERSECT も直積の一種」: これらは集合の和・共通部分であり、列の組合せを生成する直積とは本質的に異なります。
  • 「SQL は常に重複を排除する」: SELECT * FROM R, S は重複を排除しない。問題では重複なしという条件が与えられている点に注意。

解法ステップ

  1. 問題文から対象演算が「直積 (×)」であることを確認する。
  2. 関係代数の直積の定義を思い出す(全組合せを生成)。
  3. SQL の構文でカルテシアン積を生成する記法を列挙する(FROM R, S または FROM R CROSS JOIN S)。
  4. 選択肢を比較し、集合演算(UNION/INTERSECT/EXCEPT)と区別して正解を決定する。

選択肢別の誤答解説

  • ア: SELECT * FROM R, S
    正解。FROM に複数の表を並べる記法はカルテシアン積(CROSS JOIN)を表し、関係代数の直積に対応します。
  • イ: SELECT * FROM R EXCEPT SELECT * FROM S
    誤り。EXCEPT は差集合(R \ S)を取る集合演算で、直積の意味とは異なります。列数・型の互換性が前提です。
  • ウ: SELECT * FROM R UNION SELECT * FROM S
    誤り。UNION は両表の和集合で重複を排除(標準 SQL)する操作であり、タプルの組合せを作る直積ではありません。
  • エ: SELECT FROM R INTERSECT SELECT FROM S
    誤りかつ構文上も不正確。INTERSECT は共通部分を返す集合演算ですが、書き方は通常 SELECT * FROM R INTERSECT SELECT * FROM S のように列指定が必要です。直積とは無関係です。

補足コラム

  • FROM R, S は古い記法ですが、意味は FROM R CROSS JOIN S と同じです。可読性と明示性の観点からは CROSS JOIN を使うことを推奨します。
  • SQL と関係代数の違い:関係代数は集合として重複を扱わない理論ですが、SQL はリレーショナル実装として重複を許すため、集合的振る舞いを完全に再現するには SELECT DISTINCT を併用する場合があります。問題文の「行の重複はない」条件はこの点を補完しています。
  • DBMS によっては EXCEPT の代わりに MINUS を使う (例: Oracle) 等の方言差があります。
例(動作イメージ):
-- R = {(a1),(a2)}, S = {(b1),(b2)}
SELECT * FROM R, S;
-- 結果: (a1,b1), (a1,b2), (a2,b1), (a2,b2)

FAQ

Q1: FROM R, S と INNER JOIN の違いは何ですか?
A1: FROM R, S は条件なしのカルテシアン積を生成します。INNER JOIN は通常 ON または USING で結合条件を指定し、条件に合う組合せのみを返します。条件を追加すれば結果は同じになることもありますが、意味が異なります。
Q2: SQL で直積の結果から重複を取り除きたいときは?
A2: SELECT DISTINCT を使います。SELECT DISTINCT * FROM R, S により重複行が除去され、集合的意味に近づけます。
Q3: UNION ALL と UNION の違いは?
A3: UNION は重複を除去して和集合を返します。UNION ALL は重複をそのまま残す高速版です。どちらも直積とは別操作です。

関連キーワード: 関係代数、直積、カルテシアン積、CROSS JOIN、SELECT文、UNION、INTERSECT、EXCEPT、DISTINCT、JOIN、SQL 構文、RDBMS
← 前の問題へ次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について