令和4年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問12
テクノロジ/データベース“社員”表から,男女それぞれの最年長社員を除く全ての社員を取り出す SQL 文とするために,a に入れる字句はどれか。ここで,“社員”表の構造は次のとおりであり,実線の下線は主キーを表す。 社員(社員番号, 社員名, 性別, 生年月日) ※社員番号が主キー 〔SQL 文〕 SELECT 社員番号, 社員名 FROM 社員 AS S1 WHERE 生年月日 > ([ a ])
出典:令和4年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問12
- アSELECT MIN(生年月日) FROM 社員 AS S2 GROUP BY S2.性別
- イSELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別
- ウSELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別
- エSELECT MIN(生年月日) FROM 社員 GROUP BY S2.性別
正解:ウ
解説
最年長社員とは生年月日が最も古い(値が最小)社員のことです。設問のSQL文は,各社員S1について,同じ性別の社員グループの中での最小の生年月日(=最年長者の生年月日)よりも自分の生年月日が大きい(=自分より年下である)社員だけを抽出しようとしています。したがって副問合せでは,S1と同じ性別の社員に絞り込んだ上でMIN(生年月日)を求める必要があります。
選択肢ごとの解説
- ア誤り。GROUP BY S2.性別だけでは性別ごとの最小生年月日が複数行返ってしまい,比較演算子の右辺に単一の値を要求するスカラー副問合せとして機能しません。
- イ誤り。OR条件でS1.性別=S2.性別を加えても全性別の生年月日が比較対象に混在してしまい,性別ごとに正しく最年長者を絞り込むことができません。
- ウ正しい。WHERE句でS1.性別=S2.性別と条件を付けることで,S1と同じ性別の社員に限定した中での最小の生年月日(その性別の最年長者の生年月日)を求めることができます。
- エ誤り。FROM句で社員に別名S2を付けていないため,SELECT句やGROUP BY句でS2を参照するとエラーになり,構文として成立しません。