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

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

