データベーススペシャリスト令和4年秋期 午前U 問12

午前U 問12

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

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

〔SQL文〕
SELECT 社員番号, 社員名 FROM 社員 AS S1
  WHERE 生年月日 > (a)
  • [出題歴]
  • データベース R2秋期 問10
  • データベース H19春期 問35
  • データベース H23特別 問11
  • データベース H26春期 問10
  • データベース H30春期 問10

分類

テクノロジ系 » データベース » データ操作

正解

解説

生年月日は、その値が大きいほど早く生まれたことになるので、男女それぞれの最年長社員を除くを社員の行を選択するためには、生年月日の値が男であれば男の最年長社員の生年月日よりも、女であれば女の最年長社員の生年月日よりも、大きい行だけを抽出することになります。つまり、aの副問合せは、主問合せで処理中の行の性別が"男"であれば"男"の社員のうち最年長社員の生年月日が、主問合せで処理中の行の性別が"女"であれば"女"の最年長社員の生年月日が返るようになっている必要があります。

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

Pagetop