平成30年春期試験問題 午前Ⅱ 問10

"社員"表から,男女それぞれの最年長社員を除くすべての社員を取り出すSQL文とするために,aに入れる字句はどれか。ここで,"社員"表の構造は次のとおりであり、実線の下線は主キーを表す。

社員(社員番号,社員名,性別,生年月日)

〔SQL文〕
SELECT 社員番号, 社員名 FROM 社員 AS S1
  WHERE 生年月日 > (a)

  • 10a.png
  • 10i.png
  • 10u.png
  • 10e.png
正解 問題へ
分野:テクノロジ系
中分類:データベース
小分類:データ操作
解説
生年月日は、その値が小さいほど早く生まれたことになります。男女それぞれの最年長社員を除く社員の行を選択するためには、生年月日の値が、"男"であれば男性の最年長社員の生年月日よりも、"女"であれば女性の最年長社員の生年月日よりも、大きい行だけが選択されるようになっていなければなりません。つまり、aの副問合せでは、主問合せで処理中の行の性別が"男"であれば男性社員のうち最年長の人の生年月日が、主問合せで処理中の行の性別が"女"であれば女性社員のうち最年長の人の生年月日が返るようになっている必要があります。

ここでは以下の表を使用して、正しい結果が得られるかを選択肢ごとに検証していきます。
10_1.png
  • "社員"表を性別ごとにグルーピングして男女それぞれの最年長者の生年月日を返すSQL文です。結果セットが複数行になるため">"で比較するデータとしては不適切です。
    10_2.png
    ※もし複数の要素の「いずれかの値よりも大きい」や「全ての値よりも大きい」という条件を指定する場合は比較演算子に続けて「SOME」や「ALL」のキーワードを指定します。
  • 副問合せの中で主問合せのS1の値を使用するため相関副問合せになります。
    まず、
    WHERE S1.生年月日 > S2.生年月日
    OR S1.性別 = S2.性別
    の部分で主問合せの行ごとに「その行の生年月日より小さい」または「性別が同じ」という条件を満たすS2(社員表)の行が抽出され、その中で最も小さい生年月日の値が返されます。具体的に社員表の1,2行目に対する副問合せは以下の結果を返します。
    10_3.png
    この副問合せの結果は常に男女問わず最小の生年月日になるため不適切です。
  • 正しい。副問合せの中で主問合せのS1の値を使用するため相関副問合せになります。
    主問合せの行ごとに性別の値が等しいS2(社員表)の行が抽出され、その中で最も小さい生年月日の値が返されます。具体的に社員表の1,2行目に対する副問合せは以下の結果を返します。
    10_4.png
    以上の手順で主問合せ側の行の性別の値に応じて、副問合せはその性別の最も小さい生年月日を返します。後は主問合せのWHERE句で返された値よりも大きい生年月日をもつ行のみを抽出すれば、男女それぞれの最年長社員を除く全ての社員からなる結果セットが得られます。
  • 社員 AS S2 というようにエイリアスの指定がないにもかかわらず、突然GROUP BY句でS2を使用しているので構文的に正しくありません。

この問題の出題歴


Pagetop