ホーム > データベーススペシャリスト試験 > 2011年
データベーススペシャリスト試験 2011年 午前2 問11
“社員”表から, 男女それぞれの最年長社員を除くすべての社員を取り出す 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.性別
)
これにより、男女別に最年長の生年月日を基準にして、それ以外の社員のみ抽出されます。
まとめ表
まとめ
本問題は相関サブクエリを用いて、各社員の性別ごとの最年長者を特定し、それより後に生まれた社員のみを抽出するというパターンの理解を問う問題です。
選択肢ウのSQL文が要件を満たしているため、正解となります。
選択肢ウのSQL文が要件を満たしているため、正解となります。