戦国IT

情報処理技術者試験の過去問対策サイト

データベーススペシャリスト試験 2011年 午前211


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

要点まとめ

  • 結論:男女別の最年長社員(生年月日が最小)を除くには、性別ごとに最小の生年月日を取得し、それより後の社員を選ぶ必要があります。
  • 根拠:最年長社員は性別ごとに生年月日が最小のレコードであり、その生年月日を基準に除外条件を設定します。
  • 差がつくポイント:副問合せ内で性別ごとに最小生年月日を正しく取得し、外側のクエリで性別を参照して比較できるかが重要です。

正解の理由

正解はです。
ウの副問合せは「SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別」となっており、外側のクエリのS1の性別と一致するS2の性別ごとに最小の生年月日(最年長)を取得します。
これにより、外側のWHERE句「生年月日 > (a)」は、各性別の最年長社員の生年月日より後の社員を抽出し、最年長社員を除外できます。

よくある誤解

  • 性別ごとの最小生年月日を取得せず、全社員の最小生年月日だけを取得してしまう。
  • 副問合せ内で外側のテーブルの条件を正しく参照できていない。

解法ステップ

  1. 最年長社員は性別ごとに生年月日が最小の社員であることを理解する。
  2. 性別ごとに最小の生年月日を取得する副問合せを考える。
  3. 外側のクエリで「生年月日 > 最年長の生年月日」として除外条件を設定する。
  4. 副問合せ内で外側のテーブルの性別を参照し、性別ごとに最小生年月日を取得する形にする。
  5. 選択肢の中からこの条件を満たすSQLを選ぶ。

選択肢別の誤答解説

  • ア: 性別ごとに最小生年月日を取得しているが、副問合せが複数行を返すため比較できずエラーになる。
  • イ: WHERE句の条件が不適切で、外側のS1の生年月日とS2の生年月日を正しく比較できていない。
  • ウ: 性別ごとに最小生年月日を取得し、外側の性別と一致させて正しく最年長社員を除外できる。
  • エ: GROUP BYで性別ごとに最小生年月日を取得しようとしているが、S2が定義されておらず文法エラー。

補足コラム

SQLで「性別ごとに最小値を取得し、その値を基準に外側のクエリで条件を設定する」場合、相関副問合せを使うことが多いです。
相関副問合せは外側のテーブルの値を参照しながら副問合せを実行するため、性別ごとの最小生年月日を正確に取得できます。
また、GROUP BYで複数行を返す副問合せは単一値比較に使えないため注意が必要です。

FAQ

Q: なぜGROUP BYで複数行を返す副問合せは使えないのですか?
A: WHERE句の比較演算子は単一の値と比較するため、複数行を返す副問合せはエラーになります。
Q: 相関副問合せとは何ですか?
A: 外側のクエリの値を参照しながら実行される副問合せで、行ごとに異なる結果を返せます。
Q: 最年長社員を除く条件を別の方法で書けますか?
A: 性別ごとに最年長社員の社員番号を取得し、NOT IN句で除外する方法もあります。

関連キーワード: SQL, 副問合せ, 相関副問合せ, GROUP BY, 最年長社員, 生年月日, 性別条件, WHERE句, データベースクエリ
← 前の問題へ次の問題へ →

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