データベーススペシャリスト平成26年春期 午前Ⅱ 問10

問10

"社員"表から,男女それぞれの最年長社員を除く全ての社員を取り出すSQL文とするために,aに入る問合せはどれか。ここで,"社員"表は次の構造とし,下線部は主キーを表す。

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

〔SQL文〕
SELECT 社員番号, 社員名 FROM 社員 AS S1
  WHERE 生年月日 > (a)
  • 10a.png/image-size:360×29
  • 10i.png/image-size:360×46
  • 10u.png/image-size:360×30
  • 10e.png/image-size:360×29
  • [出題歴]
  • データベース R2秋期 問10
  • データベース R4秋期 問12
  • データベース R6秋期 問10
  • データベース H19春期 問35
  • データベース H23特別 問11
  • データベース H30春期 問10

分類

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

正解

解説

生年月日はその値が小さいほど早く生まれたことを示します。そのため、各性別で最も年上の社員を除いたデータを抽出するには、男性であれば男性の最年長社員、女性であれば女性の最年長社員の生年月日よりも生年月日の値が大きい行が選択対象となります。つまり、副問合せでは、主問合せで処理中の行の性別が"男"なら"最年長の男性社員の生年月日"が、"女"なら"最年長の女性社員の生年月日"が返されるようになっている必要があります。

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

Pagetop