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

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

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

〔SQL文〕

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

解答・解説

正解: ウ. SELECT MIN(生年月日) FROM 社員 AS S2
WHERE S1.性別 = S2.性別

この問題は、SQLにおける 相関副問合せ(相関サブクエリ) の理解を問うものです。

外側のクエリ(主問合せ)では、WHERE 生年月日 > ( a ) という条件が指定されています。> などの比較演算子を用いた条件式では、右辺のサブクエリは必ず 単一の値(スカラ値) を返す必要があります。また、最年長は生年月日が最も古い(小さい)値となるため、MIN(生年月日) で取得します。

本問の目的は「男女それぞれの最年長社員を除く」ことなので、評価中の社員(外側のクエリの S1)の性別に対応する最年長の生年月日を取得し、それより生年月日が新しい(大きい)社員を抽出します。

各選択肢の解説

  • ア:誤り。GROUP BY S2.性別 を使用すると、サブクエリは男女別の MIN(生年月日) を返すため、2行(複数行)の結果を返す可能性があります。単一の値を期待する > 演算子の右辺に複数行を返すサブクエリを記述すると実行時エラーになります。
  • イ:誤り。WHERE 句の条件が S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別 となっており、「評価中の社員より年上の社員」または「同じ性別の社員」全体の最小生年月日を取得してしまい、論理的に男女別の最年長の生年月日を正しく取得できません。
  • ウ:正解。外側のクエリの現在の行 S1 と同じ性別を持つ社員の中から最小の生年月日(=最年長)を取得する 相関副問合せ となっています。サブクエリは必ず単一の値を返し、正しく「同じ性別の最年長の生年月日」と比較することができます。
  • エ:誤り。FROM 社員 と記述されており、エイリアス S2 が定義されていないにもかかわらず、GROUP BY S2.性別 としているため構文エラーになります。また、アと同様に複数行を返す問題もあります。

Spineチーム