データベーススペシャリスト 2024年 午前2 問10
問題文
“従業員”表から、男女それぞれの最年長従業員を除く全ての従業員を取り出すSQL文とするために、aに入れる字句はどれか。ここで、“従業員”表の構造は次のとおりであり、実線の下線は主キーを表す。
従業員(従業員番号、従業員名、性別、生年月日)
〔SQL文〕
SELECT 従業員番号、従業員名 FROM 従業員 AS S1
WHERE 生年月日 > (a)
選択肢
ア:
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文の作成【午前2 解説】
要点まとめ
- 結論:男女それぞれの最年長従業員を除くには、性別ごとの最小生年月日を基準に比較する必要があります。
- 根拠:最年長者は生年月日が最も古い(最小)ため、性別ごとに最小生年月日を取得し、それより後の生年月日の従業員を抽出します。
- 差がつくポイント:性別ごとの最小値を正しく参照し、WHERE句で性別が一致する条件を付けることが重要です。
正解の理由
選択肢ウは「SELECT MIN(生年月日) FROM 従業員 AS S2 WHERE S1.性別 = S2.性別」となっており、S1の性別と一致するS2の生年月日の最小値(最年長者の生年月日)を取得しています。
これにより、男女別の最年長者の生年月日を正確に比較でき、WHERE句の「生年月日 > (a)」で最年長者を除いた全従業員を抽出できます。
これにより、男女別の最年長者の生年月日を正確に比較でき、WHERE句の「生年月日 > (a)」で最年長者を除いた全従業員を抽出できます。
よくある誤解
- GROUP BYを使うだけで最年長者を除けると思い込み、性別の条件をWHERE句に入れない。
- 生年月日の比較条件を誤って「>」ではなく「<」にしてしまう。
解法ステップ
- 最年長者は生年月日が最も古い(最小)ことを理解する。
- 男女別に最小の生年月日を取得する必要があるため、性別ごとにグループ化する。
- WHERE句でS1(外側の従業員)とS2(内側の従業員)の性別を一致させる条件を入れる。
- 生年月日がその最小値より後の従業員を抽出する条件を設定する。
- SQL文の(a)部分に該当する字句を選択肢から選ぶ。
選択肢別の誤答解説
- ア: GROUP BYで性別ごとの最小生年月日を取得しているが、WHERE句で性別の一致を指定していないため、正しく比較できない。
- イ: WHERE句の条件が「S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別」となり、論理が不適切で正しい最年長者の抽出ができない。
- ウ: 性別が一致するS2の最小生年月日を取得し、正しく最年長者を除外できるため正解。
- エ: GROUP BY句でS2が未定義のため文法エラー。
補足コラム
SQLでグループごとの最小値や最大値を取得する際は、サブクエリ内で対象のグループ条件をWHERE句やJOIN句で正しく指定することが重要です。
また、最年長者を除外する場合は「生年月日 > 最小生年月日」という条件で抽出するのが基本的な考え方です。
また、最年長者を除外する場合は「生年月日 > 最小生年月日」という条件で抽出するのが基本的な考え方です。
FAQ
Q: なぜGROUP BYだけでは不十分なのですか?
A: GROUP BYはグループごとの集計を行いますが、外側の行と正しく対応させるためには性別の一致条件をWHERE句などで指定する必要があります。
A: GROUP BYはグループごとの集計を行いますが、外側の行と正しく対応させるためには性別の一致条件をWHERE句などで指定する必要があります。
Q: 生年月日が同じ最年長者が複数いる場合はどうなりますか?
A: 生年月日が最小の従業員全員が除外されます。条件は「生年月日 > 最小生年月日」なので、同じ生年月日の人は除外対象です。
A: 生年月日が最小の従業員全員が除外されます。条件は「生年月日 > 最小生年月日」なので、同じ生年月日の人は除外対象です。
関連キーワード: SQL, サブクエリ、GROUP BY, 最年長者抽出、生年月日比較、性別条件、WHERE句、集約関数、MIN関数

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

