データベーススペシャリスト試験 2011年 午前207


地域別に分かれている同じ構造の三つの商品表, “東京商品”, “名古屋商品”, “大阪商品”がある。次の SQL 文と同等の結果が得られる関係代数式はどれか。ここで, 三つの商品表の主キーは“商品番号” である。また, X-Y は X からYの要素を除いた差集合を表す。
SELECT * FROM 大阪商品
  WHERE 商品番号 NOT IN(SELECT 商品番号 FROM 東京商品)
UNION
 
SELECT * FROM 名古屋商品
  WHERE 商品番号 NOT IN(SELECT 商品番号 FROM 東京商品)
大阪商品 ∩ 名古屋商品) - 東京商品
(大阪商品 U 名古屋商品) - 東京商品(正解)
東京商品 - (大阪商品 ∩ 名古屋商品)
東京商品 - (大阪商品 U 名古屋商品)

解説

地域別商品表のSQLと関係代数の同値式【午前2 解説】

要点まとめ

  • 結論:SQL文は「大阪商品と名古屋商品の和集合から東京商品にある商品を除く」操作であり、関係代数では (大阪商品 ∪ 名古屋商品) - 東京商品 に相当します。
  • 根拠:SQLのNOT IN句は「対象に含まれないもの」を抽出し、UNIONは和集合を表すため、両者の和集合から東京商品を差し引く形になります。
  • 差がつくポイント:差集合の方向性と集合演算の意味を正確に理解し、和集合と積集合を混同しないことが重要です。

正解の理由

SQL文は「大阪商品にあって東京商品にない商品」と「名古屋商品にあって東京商品にない商品」をそれぞれ抽出し、その結果をUNIONで結合しています。
これは関係代数で表すと、まず大阪商品と名古屋商品の和集合を取り、そこから東京商品に含まれる商品を除く操作と同じです。
したがって、正解はイの (大阪商品 ∪ 名古屋商品) - 東京商品 となります。

よくある誤解

差集合の順序を逆に考えたり、和集合ではなく積集合を使ってしまう誤りが多いです。
また、NOT INの意味を「含まれるもの」と誤解するケースもあります。

解法ステップ

  1. SQL文の内側のSELECT文「東京商品にある商品番号」を理解する。
  2. 外側のSELECT文で「大阪商品」「名古屋商品」から東京商品にない商品を抽出していることを確認。
  3. それぞれの結果をUNIONで結合しているので、和集合であることを把握。
  4. 関係代数で表現すると「大阪商品と名古屋商品の和集合から東京商品を差し引く」操作になる。
  5. 選択肢の中から (大阪商品 ∪ 名古屋商品) - 東京商品 を選ぶ。

選択肢別の誤答解説ステップ

  • ア: (大阪商品 ∩ 名古屋商品) - 東京商品
    → 大阪商品と名古屋商品の共通部分のみを対象にしており、和集合とは異なる。
  • イ: (大阪商品 ∪ 名古屋商品) - 東京商品
    → 正解。和集合から東京商品を除く操作でSQL文と同等。
  • ウ: 東京商品 - (大阪商品 ∩ 名古屋商品)
    → 東京商品から大阪・名古屋商品の共通部分を除いており、SQLの意味と逆。
  • エ: 東京商品 - (大阪商品 ∪ 名古屋商品)
    → 東京商品から大阪・名古屋商品の和集合を除いており、SQLの意味と逆。

補足コラム

関係代数の基本演算には和集合(∪)、積集合(∩)、差集合(−)があり、SQLのUNIONは和集合、INTERSECTは積集合、EXCEPTは差集合に対応します。
NOT IN句は差集合の考え方と密接に関連しているため、集合演算の理解がSQLの理解にも役立ちます。

FAQ

Q: なぜNOT INは差集合と同じ意味になるのですか?
A: NOT INは「指定した集合に含まれない要素」を抽出するため、元の集合から指定集合を除く差集合の操作と同じ意味になります。
Q: UNIONとINTERSECTの違いは何ですか?
A: UNIONは複数の集合の要素をすべて含む和集合、INTERSECTは複数の集合に共通する要素のみを含む積集合です。

関連キーワード: 関係代数, 差集合, 和集合, SQL, NOT IN, UNION, 主キー, 集合演算
← 前の問題へ次の問題へ →

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