“社員” 表から男女それぞれの最年長社員を除く全ての社員を取り出す SQL 文【午前2 解説】
要点まとめ
- 結論:男女別の最年長社員の生年月日を取得するには、性別ごとに最小の生年月日を求める必要があります。
- 根拠:最年長社員は生年月日が最も古い(最小)ため、性別ごとにMIN関数で抽出します。
- 差がつくポイント:性別ごとの最小生年月日を正しく参照し、比較条件に組み込むことが重要です。
正解の理由
選択肢ウは、
S1
(外側の社員表)と
S2
(内側の社員表)を性別で結びつけ、
S2
の性別ごとの最小生年月日(最年長)を取得しています。これにより、
S1.生年月日 > (a)
の条件で「最年長社員の生年月日より後」の社員、つまり最年長社員を除いた社員を正しく抽出できます。
よくある誤解
性別ごとの最小生年月日を求める際に、
GROUP BY
句を使わずに全体の最小値を取ったり、性別の条件を正しく結合しないケースが多いです。
解法ステップ
- 最年長社員は生年月日が最も古い(最小)であることを理解する。
- 男女別に最小の生年月日を求めるため、
GROUP BY 性別
を使う。
- 外側の社員表
S1
と内側の集約クエリS2
を性別で結合する。
S1.生年月日 > (a)
の条件で最年長社員を除外する。
- 正しいSQL文を選択肢から判断する。
選択肢別の誤答解説
- ア:
GROUP BY S2.性別
は正しいが、S2
のエイリアスが外側で使われていないため文法的に不完全。
- イ:
WHERE
句の条件が複雑で誤っており、性別の比較や生年月日の条件が正しくない。
- エ:
GROUP BY S2.性別
とあるが、S2
のエイリアスが定義されておらず文法エラー。
- ウ:
S1.性別 = S2.性別
で性別を結合し、MIN(生年月日)
で最年長を取得しているため正解。
補足コラム
SQLで「最年長社員を除く」など条件付きで集約関数を使う場合、サブクエリで性別ごとの最小値を取得し、外側のクエリで比較する方法が一般的です。
GROUP BY
とエイリアスの使い方に注意しましょう。
FAQ
Q: なぜ
MIN(生年月日)
を使うのですか?
A: 生年月日が最も古い社員が最年長なので、最小値を取得するためです。
Q: 性別ごとに最年長を除くにはどうすればいいですか?
A: 性別でグループ化し、各グループの最小生年月日を取得して比較条件に使います。
関連キーワード: SQL, サブクエリ、集約関数、GROUP BY, 生年月日、性別条件、最年長社員