ホーム > データベーススペシャリスト試験 > 2011年

データベーススペシャリスト試験 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文


問題の趣旨

  • 「社員」表には社員番号(主キー)、社員名、性別、生年月日があります。
  • 男女それぞれの最年長社員のみを除く社員を選択したい。
  • 最年長 = 最も生年月日が古い人(すなわち最小の生年月日)。
  • 最年長社員を除外するということは、「生年月日 > 最年長者の生年月日」とすることで実現可能。
  • 与えられたSQLの一部:
SELECT 社員番号, 社員名 FROM 社員 AS S1 
WHERE 生年月日 > (a)
  • (a) は副問合せで、これによって「男女別に最年長の生年月日」を特定する必要がある。

各選択肢の内容・問題点を検証

選択肢 ア

SELECT MIN(生年月日) FROM 社員 AS S2
GROUP BY S2.性別
  • これは男女別に最小の生年月日の一覧を返す。
  • しかし、WHERE 生年月日 > (a) にはサブクエリは1つの値を返す必要があるが、これは複数行返すためエラーまたは意図しない動作になる。
  • よってNG。

選択肢 イ

SELECT MIN(生年月日) FROM 社員 AS S2
WHERE S1.生年月日 > S2.生年月日 
OR S1.性別 = S2.性別
  • S1の行に依存する副問い合わせ(相関サブクエリ)だが、条件が意味不明。
  • S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別 は意味的に適切でない。
  • また、まず「性別」で分けて最年長者を特定したいのに、この条件では目的を満たせない。
  • よってNG。

選択肢 ウ

SELECT MIN(生年月日) FROM 社員 AS S2
WHERE S1.性別 = S2.性別
  • これは「S1から見た性別と同じ性別の社員群」から最小の生年月日を1つ返すサブクエリ。
  • 相関サブクエリになっていて、「各S1の行について、その性別の最も古い生年月日を取得」できる。
  • WHERE 生年月日 > (a) に代入すると、「S1の生年月日が自分の性別の最年長者の生年月日より後の人」という条件になる。
  • つまり、最年長者は生年月日が等しいため除外され、それ以外を抽出できる。
  • これが正解。

選択肢 エ

SELECT MIN(生年月日) FROM 社員
GROUP BY S2.性別
  • おかしな記述。FROM 社員にはS2の指定がないため参照できない。
  • グループ化も同様に不適切。
  • 文法エラーの可能性。
  • よってNG。

まとめ

目的は、「男女それぞれ最年長の生年月日」を特定すること。
  • 最年長 = 生年月日が最も古い = MIN(生年月日)
  • 男女で分けて最年長者を特定
  • 最年長者の生年月日より(大きい)生年月日の社員を取得する=最年長以外の社員を取得する。
この動作を行う相関サブクエリは選択肢ウです。

補足:完成したSQLイメージ

SELECT 社員番号, 社員名 
FROM 社員 AS S1
WHERE 生年月日 > (
    SELECT MIN(生年月日) 
    FROM 社員 AS S2
    WHERE S1.性別 = S2.性別
)
これにより、男女別に最年長の生年月日を基準にして、それ以外の社員のみ抽出されます。

まとめ表

選択肢説明結論
男女別で最小生年月日の集合を返す。1つの値ではない。不適切
条件が論理的に不適切で目的と合わない。不適切
各社員の性別で最小生年月日を取得。正しい。正解
文法上・論理上誤り。不適切

まとめ

本問題は相関サブクエリを用いて、各社員の性別ごとの最年長者を特定し、それより後に生まれた社員のみを抽出するというパターンの理解を問う問題です。
選択肢ウのSQL文が要件を満たしているため、正解となります。
← 前の問題へ次の問題へ →

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