データベーススペシャリスト試験 2018年 午前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)」で最年長社員を除外できます。つまり、男女別の最年長社員を正確に除外できるSQL文となっています。

よくある誤解

性別ごとの最小生年月日を取得せず、全体の最小生年月日だけを使うと、男女どちらか一方の最年長社員しか除外できません。性別条件の指定漏れが多いミスです。

解法ステップ

  1. 最年長社員は生年月日が最も小さい社員であることを理解する。
  2. 男女別に最小の生年月日を求める必要があるため、性別ごとにグループ化することを考える。
  3. サブクエリで性別ごとの最小生年月日を取得し、メインクエリのWHERE句でそれより後の社員を抽出する。
  4. 性別条件をサブクエリ内で正しく指定し、対応する最小生年月日を取得するSQL文を作成する。

選択肢別の誤答解説

  • ア: 性別ごとに最小生年月日を取得しているが、サブクエリが複数行を返すためWHERE句の比較に使えずエラーになる。
  • イ: 条件式が複雑かつ誤っており、性別の比較が正しく機能しないため正しい結果が得られない。
  • ウ: 性別ごとの最小生年月日を正しく取得し、最年長社員を除外できるため正解。
  • エ: サブクエリ内で「S2」が定義されていないため文法エラーとなる。

補足コラム

SQLでグループごとの最小値を取得し、それを元に条件を付ける場合、サブクエリの使い方が重要です。特に「性別ごとに最小生年月日を取得し、それを比較する」場合は、サブクエリ内で外部クエリの値を参照する相関サブクエリが有効です。今回のように「WHERE 生年月日 > (サブクエリ)」の形で使う場合、サブクエリは単一の値を返す必要があり、性別条件を入れて単一値に絞ることがポイントです。

FAQ

Q: なぜ「GROUP BY」を使わずに性別条件を指定する方法が正解なのですか?
A: GROUP BYを使うと複数行が返るため、WHERE句の比較に使えません。性別条件を指定した相関サブクエリで単一値を返す方法が適切です。
Q: 最年長社員を除くとはどういう意味ですか?
A: 各性別で最も生年月日が小さい社員(最年長)を除外し、それ以外の社員を抽出することです。

関連キーワード: SQL, サブクエリ, 相関サブクエリ, 最年長社員, 性別グループ化, 生年月日比較, WHERE句, データベースクエリ
← 前の問題へ次の問題へ →

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