ホーム > データベーススペシャリスト試験 > 2022年
データベーススペシャリスト試験 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関数, データ抽出