令和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.性別としているため構文エラーになります。また、アと同様に複数行を返す問題もあります。