平成23年特別試験問題 午前Ⅱ 問5

"社員番号"と"氏名"を列としてもつR表とS表に対して,差(R-S)を求めるSQL文はどれか。ここで,R表とS表の主キーは"社員番号"であり,"氏名"は"社員番号"に関数従属する。

  • 05a.gif
  • 05i.gif
  • 05u.gif
  • 05e.gif
正解 問題へ
分野:テクノロジ系
中分類:データベース
小分類:データ操作
解説
関係演算の"差"は、関係Rに含まれる行(タプル)のうち、関係Sに含まれる行を取り除いた集合を返す演算です。
  • 結合条件に"="ではなく"<>"を使用すると連結キーが異なる値同士で結合を行う非等値結合になり、R表の1行に対して社員番号列の値が異なるS表の1つ以上の行が結合されます。
    結果セットはR表の全ての社員番号列の値と、その値と別の社員番号をもつS表の氏名の組合せになるため差演算ではありません。
  • UNION句は、SELECT文の結果セット同士の和演算を行います。R表、S表のそれぞれから社員番号、氏名を抜き出した結果セットをUNIONで統合しているため、R表とS表の和を求めるSQL文です。
  • 正しい。主問合せ側の表はR表になるため、R表の1行ごとに副問合せが実行されます。副問合せのSELECT文は、その副問合せを実行している行の社員番号列の値がS表に存在すればその社員番号を返し、存在しなければNULLを返します。
    WHERE句ではNOT EXISTS句で「この結果セットが存在しないこと」を抽出条件としています。WHERE句が真を返すのは副問合せがNULLを返す行、つまりR表のうちS表に存在する社員番号をもたない行になります。このため「ウ」のSQL文からは差(R-S)が得られます。
  • 主問合せ側の表はS表になるため、S表の1行ごとに副問合せが実行されます。副問合せのSELECT文は、その副問合せを実行している行の社員番号列の値がR表に存在すればその社員番号を返し、存在しなければNULLを返します。
    WHERE句ではNOT IN句で「この結果セットに社員番号が含まれないこと」を抽出条件としています。WHERE句が真を返すのは副問合せがNULLを返す行、つまりS表のうちR表に存在する社員番号をもたない行になります。このため「エ」のSQL文からは差(S-R)が得られます。

Pagetop