基本情報技術者 2012年 春期 午前(科目A) 問31
問題文
表Rに対する次のSQL文の操作はどの関係演算か。
〔SQL文〕
SELECT A1, A3, A5 FROM R

選択肢
ア:結合
イ:差
ウ:射影(正解)
エ:直積
🔒 解説は解答すると表示されます
関係データベースの射影操作【午前解説】
正解の理由
SELECT句で指定しているのはテーブルRの属性(列)A1,A3,A5だけであり、行を絞る条件(WHERE)や複数表の組合せ(JOIN, 直積)、集合差を示す構文は使われていません。関係代数における「射影(projection)」は特定の属性集合だけを取り出す演算であり、本問のSQL文はまさにこれに対応します。形式的には と表せます。
解法ステップ
- SQL文の構成要素を確認する:SELECT に列名、FROM に単一表 R、WHERE 等の条件は無し。
- SQLの各構成要素を関係演算に対応付ける:SELECT → 射影、WHERE → 選択、FROM 複数表 → 直積/結合。
- 本文は列の指定のみなので「射影(projection)」と判断する。形式的表記は 。
- 重複の扱い(試験問題で問われる場合)を付記:SQLは DISTINCT 指定なしで重複を残す点を念頭に置く。
選択肢別の誤答解説
- ア: 結合 — 誤り。結合は複数の表を組み合わせる操作で、FROM に複数表またはJOIN句が必要ですが本問にはありません。
- イ: 差 — 誤り。差(集合差)は A EXCEPT B のように二つの集合(表)間の操作であり、本SQLは単一表に対する列抽出です。
- ウ: 射影 — 正解。指定した属性だけを取り出す操作で関係代数の射影 に対応します。
- エ: 直積 — 誤り。直積は複数表の全組合せを作る操作で FROM に複数表が必要ですが、ここでは単一表Rのみです。
よくある誤解
- SELECT = 射影 と単純に考えても、SQLは既定で重複行を残すため「関係代数の射影は常に同じ結果」とは限らない点を見落としやすい。
- WHERE句が無い場合でも「選択(selection)」と混同して行(タプル)を削る操作だと誤認する受験者がいる。SELECTは列の選択が主目的。
- FROM に複数表が無いときは結合や直積の可能性がないが、問題文をよく確認せず結合を選ぶミスが多い。
補足コラム
- SQLと関係代数の差:関係代数の射影は集合の性質に従い重複を取り除きますが、SQLのSELECTは既定で重複行を保持します。重複を排除するには SELECT DISTINCT を使います。
- 属性の順序:SQLではSELECT句に書いた順に列が返りますが、関係代数の集合としての射影は属性集合を扱うため「順序」は本質的ではありません。実装上の出力順は問題になることがあります。
- 例(SQL):
-- 重複を残す(SQLの通常挙動)
SELECT A1, A3, A5 FROM R;
-- 関係代数の射影に近づける(重複を除去)
SELECT DISTINCT A1, A3, A5 FROM R;
FAQ
Q1: SELECT * は何の関係演算に対応しますか?
A1: SELECT * はすべての属性を返すだけで、関係代数上は恒等操作(射影で全属性を指定した場合)に相当します。
A1: SELECT * はすべての属性を返すだけで、関係代数上は恒等操作(射影で全属性を指定した場合)に相当します。
Q2: WHERE があれば射影ではなく選択ですか?
A2: WHERE がある場合、行の絞り込み(選択:σ)と列の抽出(射影:π)が組み合わさることが多いです。どちらが本問の主操作かは文脈で判断しますが、本問は列抽出のみです。
A2: WHERE がある場合、行の絞り込み(選択:σ)と列の抽出(射影:π)が組み合わさることが多いです。どちらが本問の主操作かは文脈で判断しますが、本問は列抽出のみです。
Q3: SQLのSELECT DISTINCT は関係代数の射影と同等ですか?
A3: 実務上は近いですが、関係代数は集合として扱うため厳密には一致します。SQLの実装依存の振る舞い(NULL の扱い等)に注意が必要です。
A3: 実務上は近いですが、関係代数は集合として扱うため厳密には一致します。SQLの実装依存の振る舞い(NULL の扱い等)に注意が必要です。
関連キーワード: 射影、SELECT、DISTINCT、関係代数、列選択、選択(WHERE)、結合、直積、集合差、リレーショナルモデル

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

