応用情報技術者 2013年 秋期 午前2 問31
問題文
地域別に分かれている同じ構造の三つの商品表、“東京商品”、“名古屋商品”、“大阪商品”がある。次の SQL文と同等の結果が得られる関係代数式はどれか。ここで、三つの商品表の主キーは“商品番号”である。
SELECT * FROM 大阪商品
WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 東京商品)
UNION
SELECT * FROM 名古屋商品
WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 東京商品)
選択肢
ア:(大阪商品 ∩ 名古屋商品) - 東京商品
イ:(大阪商品 ∪ 名古屋商品) - 東京商品(正解)
ウ:東京商品 - (大阪商品 ∩ 名古屋商品)
エ:東京商品 - (大阪商品 ∪ 名古屋商品)
地域別商品表のSQLと関係代数【午前2 解説】
要点まとめ
- 結論:SQL文は「大阪商品と名古屋商品のうち、東京商品にない商品番号を抽出」しているため、関係代数では「(大阪商品 ∪ 名古屋商品) - 東京商品」が正解です。
- 根拠:NOT IN句は「東京商品に存在しない商品番号」を意味し、UNIONは両方の集合を合わせるため、和集合から東京商品を引く操作に対応します。
- 差がつくポイント:集合演算の意味を正確に理解し、NOT INの否定条件を「差集合」で表現できるかが重要です。
正解の理由
選択肢イの「(大阪商品 ∪ 名古屋商品) - 東京商品」は、まず大阪商品と名古屋商品を和集合でまとめ、その中から東京商品に含まれる商品番号を除外しています。これはSQLの「NOT IN (東京商品)」を両方のテーブルに適用し、結果をUNIONで結合する処理と完全に一致します。
よくある誤解
「NOT IN」を「差集合」と理解せずに「積集合」や「東京商品から引く」と誤解しやすいです。UNIONの意味を和集合と混同しないことが重要です。
解法ステップ
- SQL文の構造を理解する:大阪商品と名古屋商品から東京商品にない商品番号を抽出し、それらをUNIONで結合。
- 「NOT IN (東京商品)」は「東京商品に含まれない集合」を意味するため、差集合で表現可能。
- 大阪商品と名古屋商品を和集合でまとめる。
- その和集合から東京商品を差し引く操作が関係代数式での表現。
- 選択肢の中から「(大阪商品 ∪ 名古屋商品) - 東京商品」を選ぶ。
選択肢別の誤答解説
- ア: (大阪商品 ∩ 名古屋商品) - 東京商品
→ 大阪商品と名古屋商品の共通部分のみを対象にしており、UNIONの意味と異なる。 - イ: (大阪商品 ∪ 名古屋商品) - 東京商品
→ 正解。和集合から東京商品を除外し、SQLの意味と一致。 - ウ: 東京商品 - (大阪商品 ∩ 名古屋商品)
→ 東京商品から共通部分を引いており、SQLのNOT INの意味と逆。 - エ: 東京商品 - (大阪商品 ∪ 名古屋商品)
→ 東京商品から和集合を引くため、SQLの条件と逆の結果になる。
補足コラム
関係代数の集合演算はSQLの集合演算と密接に関連しています。特にNOT INは差集合(セット差)で表現でき、UNIONは和集合、INTERSECTは積集合に対応します。主キーが同じ場合、集合演算の結果が明確になるため、問題文の主キー情報は重要です。
FAQ
Q: NOT INとNOT EXISTSの違いは何ですか?
A: NOT INは指定した集合に含まれない値を抽出し、NULLが含まれると結果が変わる場合があります。NOT EXISTSはサブクエリの存在有無で判定し、NULLの影響を受けにくいです。
A: NOT INは指定した集合に含まれない値を抽出し、NULLが含まれると結果が変わる場合があります。NOT EXISTSはサブクエリの存在有無で判定し、NULLの影響を受けにくいです。
Q: UNIONとUNION ALLの違いは?
A: UNIONは重複行を排除して結合しますが、UNION ALLは重複を排除せず全ての行を結合します。問題文のSQLはUNIONなので重複排除が前提です。
A: UNIONは重複行を排除して結合しますが、UNION ALLは重複を排除せず全ての行を結合します。問題文のSQLはUNIONなので重複排除が前提です。
関連キーワード: 関係代数、集合演算、SQL, NOT IN, UNION, 差集合

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

