ホーム > データベーススペシャリスト試験 > 2014年
データベーススペシャリスト試験 2014年 午前2 問10
“社員” 表から, 男女それぞれの最年長社員を除く全ての社員を取り出す SQL 文とするために, a に入る問合せはどれか。ここで, "社員” 表の構造は次のとおりであり, 下線は主キーを表す。
社員(社員番号,社員名,性別,生年月日)
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 解説】
要点まとめ
- 結論:男女別の最年長社員の生年月日を取得するには、性別ごとに最小の生年月日を求める必要があります。
- 根拠:最年長社員は生年月日が最も古い(最小)ため、性別ごとに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: なぜ
A: 生年月日が最も古い社員が最年長なので、最小値を取得するためです。
MIN(生年月日)
を使うのですか?A: 生年月日が最も古い社員が最年長なので、最小値を取得するためです。
Q: 性別ごとに最年長を除くにはどうすればいいですか?
A: 性別でグループ化し、各グループの最小生年月日を取得して比較条件に使います。
A: 性別でグループ化し、各グループの最小生年月日を取得して比較条件に使います。
関連キーワード: SQL, サブクエリ, 集約関数, GROUP BY, 生年月日, 性別条件, 最年長社員