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


“社員” 表から, 男女それぞれの最年長社員を除く全ての社員を取り出す SQL 文とするために, a に入る問合せはどれか。ここで, "社員” 表の構造は次のとおりであり, 下線は主キーを表す。
社員(社員番号,社員名,性別,生年月日)
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 解説】

要点まとめ

  • 結論:男女別の最年長社員の生年月日を取得するには、性別ごとに最小の生年月日を求める必要があります。
  • 根拠:最年長社員は生年月日が最も古い(最小)ため、性別ごとにMIN関数で抽出します。
  • 差がつくポイント:性別ごとの最小生年月日を正しく参照し、比較条件に組み込むことが重要です。

正解の理由

選択肢ウは、S1(外側の社員表)とS2(内側の社員表)を性別で結びつけ、S2の性別ごとの最小生年月日(最年長)を取得しています。これにより、S1.生年月日 > (a)の条件で「最年長社員の生年月日より後」の社員、つまり最年長社員を除いた社員を正しく抽出できます。

よくある誤解

性別ごとの最小生年月日を求める際に、GROUP BY句を使わずに全体の最小値を取ったり、性別の条件を正しく結合しないケースが多いです。

解法ステップ

  1. 最年長社員は生年月日が最も古い(最小)であることを理解する。
  2. 男女別に最小の生年月日を求めるため、GROUP BY 性別を使う。
  3. 外側の社員表S1と内側の集約クエリS2を性別で結合する。
  4. S1.生年月日 > (a)の条件で最年長社員を除外する。
  5. 正しいSQL文を選択肢から判断する。

選択肢別の誤答解説

  • ア:GROUP BY S2.性別は正しいが、S2のエイリアスが外側で使われていないため文法的に不完全。
  • イ:WHERE句の条件が複雑で誤っており、性別の比較や生年月日の条件が正しくない。
  • エ:GROUP BY S2.性別とあるが、S2のエイリアスが定義されておらず文法エラー。
  • ウ:S1.性別 = S2.性別で性別を結合し、MIN(生年月日)で最年長を取得しているため正解。

補足コラム

SQLで「最年長社員を除く」など条件付きで集約関数を使う場合、サブクエリで性別ごとの最小値を取得し、外側のクエリで比較する方法が一般的です。GROUP BYとエイリアスの使い方に注意しましょう。

FAQ

Q: なぜMIN(生年月日)を使うのですか?
A: 生年月日が最も古い社員が最年長なので、最小値を取得するためです。
Q: 性別ごとに最年長を除くにはどうすればいいですか?
A: 性別でグループ化し、各グループの最小生年月日を取得して比較条件に使います。

関連キーワード: SQL, サブクエリ, 集約関数, GROUP BY, 生年月日, 性別条件, 最年長社員
← 前の問題へ次の問題へ →

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