データベーススペシャリスト試験 2020年 午前210


“社員”表から, 男女それぞれの最年長社員を除く全ての社員を取り出す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 解説】

要点まとめ

  • 結論:男女別の最年長社員の生年月日を取得し、それより若い社員を抽出するには「ウ」の句が適切です。
  • 根拠:性別ごとに最小の生年月日(最年長)を求め、その値と比較することで最年長社員を除外できます。
  • 差がつくポイント:サブクエリ内で性別を正しく条件指定し、グループ化と比較を適切に行うことが重要です。

正解の理由

選択肢「ウ」はサブクエリで「S1.性別 = S2.性別」と条件を付けて、性別ごとに最小の生年月日を取得しています。
これにより、男女それぞれの最年長社員の生年月日が得られ、メインクエリのWHERE句で「生年月日 > (a)」とすることで、最年長社員を除いた社員を抽出できます。
他の選択肢は性別の条件が不適切、またはGROUP BYの使い方が誤っており、正しく最年長社員を除外できません。

よくある誤解

  • 「GROUP BY」を使えば自動的に正しい結果が得られると思い込み、性別条件を無視することがあります。
  • サブクエリ内でメインクエリのエイリアスを正しく参照しないため、意図した比較ができないことがあります。

解法ステップ

  1. 男女別に最年長社員の生年月日を求める必要があると理解する。
  2. 性別ごとに最小の生年月日を取得するサブクエリを考える。
  3. メインクエリのWHERE句で「生年月日 > 最年長の生年月日」と比較し、最年長社員を除外する。
  4. 性別の条件をサブクエリ内で正しく指定し、メインクエリのエイリアスを使って参照する。
  5. 選択肢の中から条件が正しく記述されているものを選ぶ。

選択肢別の誤答解説

  • ア: GROUP BYで性別ごとに最小生年月日を取得しているが、サブクエリが単独で完結しており、メインクエリの性別条件がないため正しく比較できない。
  • イ: WHERE句の条件が「S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別」となっており、論理が不適切で正しい最年長社員の抽出ができない。
  • ウ: 性別を条件に最小生年月日を取得しており、メインクエリのWHERE句で正しく比較できるため正解。
  • エ: GROUP BY句で「S2.性別」としているが、FROM句にS2がないため文法エラーとなる。

補足コラム

SQLで「最年長社員を除く」などの条件を扱う場合、サブクエリでグループ化し条件を絞る方法が基本です。
また、メインクエリとサブクエリ間でエイリアスを正しく使い、参照関係を明確にすることが重要です。
生年月日などの日時型データの比較は大小関係が直感的なので、条件式に活用しやすいです。

FAQ

Q: なぜ「生年月日 > 最小生年月日」で最年長社員を除けるのですか?
A: 生年月日が小さいほど年齢が高い(古い)ため、最小の生年月日は最年長社員の生年月日を示し、それより大きい値は年下の社員を意味します。
Q: GROUP BYなしで性別ごとの最小値を取得できますか?
A: いいえ。性別ごとに集計する場合はGROUP BYが必須です。GROUP BYなしでは全体の最小値しか取得できません。

関連キーワード: SQL, サブクエリ, GROUP BY, 生年月日比較, 性別条件, 最年長社員除外, WHERE句, エイリアス
← 前の問題へ次の問題へ →

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