データベーススペシャリスト試験 2022年 午前212


“社員”表から, 男女それぞれの最年長社員を除く全ての社員を取り出す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だけで済ませると、性別ごとの区別ができません。
  • サブクエリ内で外側のテーブルの列を正しく参照しないと、意図した比較ができません。

解法ステップ

  1. 男女別に最年長社員の生年月日(最小値)を求める必要があると理解する。
  2. サブクエリでMIN(生年月日)を取得し、性別ごとに絞り込む条件を付ける。
  3. 外側のテーブルの性別とサブクエリ内の性別を比較し、同じ性別の最小生年月日を取得する。
  4. WHERE 生年月日 > (サブクエリ)で最年長社員を除外し、それ以外の社員を抽出する。
  5. SQL文の構文と論理が正しいか確認する。

選択肢別の誤答解説

  • ア: GROUP BY S2.性別で性別ごとの最小生年月日を取得しているが、サブクエリが複数行を返すため比較できずエラーになる。
  • イ: WHERE S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別は論理が不適切で、性別の条件が正しく機能せず誤った結果になる。
  • ウ: WHERE S1.性別 = S2.性別で外側の性別と一致する最小生年月日を取得し、正しく最年長社員を除外できる。
  • エ: GROUP BY S2.性別の部分でS2が定義されておらず構文エラー。テーブルエイリアスの誤り。

補足コラム

SQLで「性別ごとに最小値を取得し、その値を基準に抽出する」場合、サブクエリ内で外側のテーブルの列を参照する相関サブクエリを使うことが多いです。
また、GROUP BYを使う場合はサブクエリが複数行を返すため、INJOINで処理する方法もありますが、今回の問題文の形式では相関サブクエリが適切です。

FAQ

Q: なぜGROUP BYを使うとエラーになるのですか?
A: GROUP BYで複数行が返るため、WHERE句の比較対象として単一値が必要な場合にエラーになります。
Q: 相関サブクエリとは何ですか?
A: 外側のクエリの列を参照しながら実行されるサブクエリで、行ごとに異なる値を返すことができます。

関連キーワード: SQL, サブクエリ, 相関サブクエリ, 最年長社員, 生年月日, 性別条件, WHERE句, MIN関数, データ抽出
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ