令和6年秋期試験問題 午前Ⅱ 問10

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

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

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

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

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

この問題の出題歴


Pagetop