平成22年度 秋期 情報セキュリティスペシャリスト試験 午前Ⅱ 問21
データベース
差集合に関する問題
和両立である表 R(ID,NAME),S(NO,NAMAE)がある。差集合 R-S を求める SELECT 文とするために,a に入れるべき適切な字句はどれか。ここで,下線部は主キーを表す。また,NAME と NAMAE は NULL 不可とする。
R(ID〔下線〕,NAME) / S(NO〔下線〕,NAMAE)
SELECT * FROM R WHERE [ a ]
(SELECT * FROM S WHERE S.NO = R.ID AND S.NAMAE = R.NAME)- アEXISTS
- イNOT EXISTS
- ウNOT IN
- エR.ID NOT IN
答えと解説を見る
✓ これが正解イNOT EXISTS
解説
S に同じ行が存在しない R の行を、NOT EXISTS で選びます。
差集合 R-S は、R の行のうち、S に同じ内容の行が無いものの集まりです。設問の副問合せは、外側で見ている R の1行ごとに、ID と NO、NAME と NAMAE がともに一致する S の行を探します。外側の行の値を使って内側の問合せを実行する、相関副問合せの形です。NOT EXISTS は、副問合せの結果が1行も無いときに真になります。そのため、S に同じ行を持たない R の行だけが残り、差集合が得られます。見分けの軸は、副問合せの結果が有るときと無いときのどちらで行を残すかです。
ほかの選択肢はなぜ違うのか
- アEXISTS:EXISTS を置くと、条件に合う S の行が見つかった R の行が選ばれます。結果に並ぶのは R と S の両方に含まれる行で、求まるのは共通集合です。差集合とは逆に、除きたい行の方を拾ってしまいます。
- ウNOT IN:NOT IN は、その前に比べる列を書き、その値が副問合せの結果に含まれないかを調べる述語です。比べる列を書かずに NOT IN だけを置いた文は、SQL の文法として成り立ちません。
- エR.ID NOT IN:この副問合せは SELECT * で2列を返すので、1列の R.ID と比べる形にはできません。仮に ID だけを比べたとしても、NAME の違いが見落とされ、行全体の差を求めたことにはなりません。
出典:平成22年度 秋期 情報セキュリティスペシャリスト試験 午前Ⅱ 問21
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)