基本情報技術者 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 は重複を排除しない。問題では重複なしという条件が与えられている点に注意。
解法ステップ
- 問題文から対象演算が「直積 (×)」であることを確認する。
- 関係代数の直積の定義を思い出す(全組合せを生成)。
- SQL の構文でカルテシアン積を生成する記法を列挙する(FROM R, S または FROM R CROSS JOIN S)。
- 選択肢を比較し、集合演算(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 で結合条件を指定し、条件に合う組合せのみを返します。条件を追加すれば結果は同じになることもありますが、意味が異なります。
A1: FROM R, S は条件なしのカルテシアン積を生成します。INNER JOIN は通常 ON または USING で結合条件を指定し、条件に合う組合せのみを返します。条件を追加すれば結果は同じになることもありますが、意味が異なります。
Q2: SQL で直積の結果から重複を取り除きたいときは?
A2: SELECT DISTINCT を使います。SELECT DISTINCT * FROM R, S により重複行が除去され、集合的意味に近づけます。
A2: SELECT DISTINCT を使います。SELECT DISTINCT * FROM R, S により重複行が除去され、集合的意味に近づけます。
Q3: UNION ALL と UNION の違いは?
A3: UNION は重複を除去して和集合を返します。UNION ALL は重複をそのまま残す高速版です。どちらも直積とは別操作です。
A3: UNION は重複を除去して和集合を返します。UNION ALL は重複をそのまま残す高速版です。どちらも直積とは別操作です。
関連キーワード: 関係代数、直積、カルテシアン積、CROSS JOIN、SELECT文、UNION、INTERSECT、EXCEPT、DISTINCT、JOIN、SQL 構文、RDBMS

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

