“社員”表から男女それぞれの最年長社員を除く全ての社員を取り出すSQL文【午前2 解説】
要点まとめ
正解の理由
選択肢ウは、サブクエリで
SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別
とし、外側の行(S1)の性別と同じ性別の中で最小の生年月日を取得しています。
これにより、男女それぞれの最年長社員の生年月日を正確に取得し、
WHERE 生年月日 > (サブクエリ)
で最年長社員を除外した全社員を抽出できます。
他の選択肢は性別の条件が不適切、または構文エラーがあり、正しく最年長社員を除外できません。
よくある誤解
- 性別ごとの最小生年月日を取得する際に、
GROUP BY
を使わずに単純にMIN
だけで済ませると、性別ごとの区別ができません。
- サブクエリ内で外側のテーブルの列を正しく参照しないと、意図した比較ができません。
解法ステップ
- 男女別に最年長社員の生年月日(最小値)を求める必要があると理解する。
- サブクエリで
MIN(生年月日)
を取得し、性別ごとに絞り込む条件を付ける。
- 外側のテーブルの性別とサブクエリ内の性別を比較し、同じ性別の最小生年月日を取得する。
WHERE 生年月日 > (サブクエリ)
で最年長社員を除外し、それ以外の社員を抽出する。
- SQL文の構文と論理が正しいか確認する。
選択肢別の誤答解説
補足コラム
SQLで「性別ごとに最小値を取得し、その値を基準に抽出する」場合、サブクエリ内で外側のテーブルの列を参照する相関サブクエリを使うことが多いです。
また、
GROUP BY
を使う場合はサブクエリが複数行を返すため、
IN
や
JOIN
で処理する方法もありますが、今回の問題文の形式では相関サブクエリが適切です。
FAQ
Q: なぜ
GROUP BY
を使うとエラーになるのですか?
A:
GROUP BY
で複数行が返るため、
WHERE
句の比較対象として単一値が必要な場合にエラーになります。
Q: 相関サブクエリとは何ですか?
A: 外側のクエリの列を参照しながら実行されるサブクエリで、行ごとに異なる値を返すことができます。
関連キーワード: SQL, サブクエリ、相関サブクエリ、最年長社員、生年月日、性別条件、WHERE句、MIN関数、データ抽出