データベーススペシャリスト 2012年 午前2 問10
問題文
次の関係R, S, T, Uにおいて、関係代数表現R×S÷T-Uの演算結果はどれか。ここで、×は直積、÷は商、-は差の演算を表す。


選択肢
ア:(正解)
イ:
ウ:
エ:
🔒 解説は解答すると表示されます
関係代数の商演算【午前2解説】
正解の理由
商演算 ÷ は「被除数の残る属性(ここではB,C)の組が、除数TのすべてのA値に対して被除数に存在するかを検査して抽出する」操作です。まず R×S は属性 (A,B,C) の直積で、R の各 (A,B) と S の各 C の組み合わせ全てを作ります。除数 T の A 値集合は {1,3} なので、(B,C) が商の結果に含まれるためには、A=1 と A=3 の両方について (A,B,C) が R×S に存在する必要があります。この条件を満たすのは (a,x) と (a,y) の二つです。最後に差演算 - U により、U に含まれる (a,x) が取り除かれ、残るのは (a,y) だけです。したがって選択肢 ア の (B=a, C=y) が正しい結果です。
解法ステップ
- R×S を作成して属性 (A,B,C) の全組を列挙する。
結果例:(1,a,x),(1,a,y),(2,b,x),(2,b,y),(3,a,x),(3,a,y),(3,b,x),(3,b,y),(4,a,x),(4,a,y) - 除数 T の A 値集合を取る:。。
- (B,C) ごとに、すべての について (A,B,C) が存在するか検査する。
- (a,x): (1,a,x) と (3,a,x) が存在 → 合格
- (a,y): (1,a,y) と (3,a,y) が存在 → 合格
- (b,x)/(b,y): A=1 の組が存在しない → 不合格
- 商の結果 {(a,x),(a,y)} から U={(a,x),(c,z)} を差し引くと {(a,y)} が残る。
- これが最終結果で、選択肢 ア に一致する。
選択肢別の誤答解説
- ア:正解。上の手順で得られる (B=a,C=y) のみが残るため妥当。
- イ:誤り。選ばれている (b,x) は A=1 のとき (1,b,x) が存在しないため、商の段階で除外される。
- ウ:誤り。表記に「y−x」のような集合演算子混同や重複行があるが、商の定義に従うと (b,*) は条件を満たさないため出現しない。また (a,y−x) のような表現は意味が不明瞭。
- エ:誤り。U に含まれない (−c,−z) のような負のタプル表記は無意味で、実際の差演算は U に存在する正のタプルだけを除外する。
よくある誤解
- 「÷ は除外操作」と誤解する
- ÷ は被除数のうち除数のすべての値に対応する残り属性の組を選ぶ操作であり、単に何かを除く操作ではありません。挙動は「全員に対応しているかの検査」に近いです。
- 属性の扱いを間違える
- 商の結果は被除数から除数の属性を差し引いた属性集合上のタプルになる(ここでは B,C)。除数側の属性で結果が決まるわけではありません。
- 差演算 - を忘れがち
- 商の結果を出したら、最後に U と差を取る手順を必ず行って最終結果を得る必要があります。
補足コラム
商演算は関係代数でやや直感がつかみにくいですが、実務では「ある条件の値集合すべてに対して存在する組合せ」を求める場面で使います。一般的な実装方法としては、(B,C) ごとに除数の要素数と一致する A の出現数を数えるグルーピングで表現できます(重複取り扱いに注意)。
SQL による表現例(R×S を R と S を結合したものと仮定):
-- 除数 T の要素数を取得
SELECT COUNT(*) INTO cnt FROM T;
-- (B,C) でグルーピングし、T に含まれる A の数が cnt と等しいものを取得
SELECT B, C
FROM (
SELECT R.A, R.B, S.C
FROM R JOIN S ON 1=1
) AS RS
WHERE A IN (SELECT A FROM T)
GROUP BY B, C
HAVING COUNT(DISTINCT A) = cnt
EXCEPT
SELECT B, C FROM U;
FAQ
Q1: 商演算の結果に A が含まれないのはなぜか?
A1: 商は被除数から除数の属性を取り除いた残りの属性集合上のタプルを返します。除数側の属性は「全ての値についての存在条件」を規定するために使われ、結果の属性には含まれません。
A1: 商は被除数から除数の属性を取り除いた残りの属性集合上のタプルを返します。除数側の属性は「全ての値についての存在条件」を規定するために使われ、結果の属性には含まれません。
Q2: 除数が空集合だったらどうなる?
A2: 除数が空だと「すべての A∈T を満たす」という条件は恒真(公理的に真)になるため、被除数の残る属性の全組が商の結果になります。その後に差 U を適用します。
A2: 除数が空だと「すべての A∈T を満たす」という条件は恒真(公理的に真)になるため、被除数の残る属性の全組が商の結果になります。その後に差 U を適用します。
Q3: 商を GROUP BY で実装するときの注意点は?
A3: 除数の要素数と一致するかを確認する際、A の重複をどう扱うか(DISTINCT)が重要です。除数に重複がない前提なら COUNT(DISTINCT A) を使うのが安全です。
A3: 除数の要素数と一致するかを確認する際、A の重複をどう扱うか(DISTINCT)が重要です。除数に重複がない前提なら COUNT(DISTINCT A) を使うのが安全です。
関連キーワード: 関係代数、商演算、直積、差集合、投影、グルーピング、SQL除算、NOT EXISTS、集合演算

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

