戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

データベーススペシャリスト試験 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 情報処理技術者試験対策アプリ

プライバシーポリシー利用規約開発者について