データベーススペシャリスト試験 2011年 午前2 問07
地域別に分かれている同じ構造の三つの商品表, “東京商品”, “名古屋商品”, “大阪商品”がある。次の 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の意味を「含まれるもの」と誤解するケースもあります。
また、NOT INの意味を「含まれるもの」と誤解するケースもあります。
解法ステップ
- SQL文の内側のSELECT文「東京商品にある商品番号」を理解する。
- 外側のSELECT文で「大阪商品」「名古屋商品」から東京商品にない商品を抽出していることを確認。
- それぞれの結果をUNIONで結合しているので、和集合であることを把握。
- 関係代数で表現すると「大阪商品と名古屋商品の和集合から東京商品を差し引く」操作になる。
- 選択肢の中から
(大阪商品 ∪ 名古屋商品) - 東京商品
を選ぶ。
選択肢別の誤答解説ステップ
- ア:
(大阪商品 ∩ 名古屋商品) - 東京商品
→ 大阪商品と名古屋商品の共通部分のみを対象にしており、和集合とは異なる。 - イ:
(大阪商品 ∪ 名古屋商品) - 東京商品
→ 正解。和集合から東京商品を除く操作でSQL文と同等。 - ウ:
東京商品 - (大阪商品 ∩ 名古屋商品)
→ 東京商品から大阪・名古屋商品の共通部分を除いており、SQLの意味と逆。 - エ:
東京商品 - (大阪商品 ∪ 名古屋商品)
→ 東京商品から大阪・名古屋商品の和集合を除いており、SQLの意味と逆。
補足コラム
関係代数の基本演算には和集合(∪)、積集合(∩)、差集合(−)があり、SQLのUNIONは和集合、INTERSECTは積集合、EXCEPTは差集合に対応します。
NOT IN句は差集合の考え方と密接に関連しているため、集合演算の理解がSQLの理解にも役立ちます。
NOT IN句は差集合の考え方と密接に関連しているため、集合演算の理解がSQLの理解にも役立ちます。
FAQ
Q: なぜNOT INは差集合と同じ意味になるのですか?
A: NOT INは「指定した集合に含まれない要素」を抽出するため、元の集合から指定集合を除く差集合の操作と同じ意味になります。
A: NOT INは「指定した集合に含まれない要素」を抽出するため、元の集合から指定集合を除く差集合の操作と同じ意味になります。
Q: UNIONとINTERSECTの違いは何ですか?
A: UNIONは複数の集合の要素をすべて含む和集合、INTERSECTは複数の集合に共通する要素のみを含む積集合です。
A: UNIONは複数の集合の要素をすべて含む和集合、INTERSECTは複数の集合に共通する要素のみを含む積集合です。
関連キーワード: 関係代数, 差集合, 和集合, SQL, NOT IN, UNION, 主キー, 集合演算