令和6年度 秋期 午前Ⅱ 問10
データ操作
副問合せに関する問題
“従業員”表から,男女それぞれの最年長従業員を除く全ての従業員を取り出す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.性別
答えと解説を見る
✓ これが正解ウSELECT MIN(生年月日) FROM 従業員 AS S2 WHERE S1.性別 = S2.性別
解説
同じ性別の中での最小の生年月日と比べる相関副問合せにします。
男女それぞれの最年長者を除くには、外側の各行 S1 について、その人と同じ性別の従業員の中で最も古い生年月日を求め、それより後に生まれた人だけを残せばよいのです。副問合せの WHERE に S1.性別 = S2.性別 を書くと、外側の行ごとに同じ性別の行だけが対象になり、MIN(生年月日) はその性別の最年長者の生年月日になります。生年月日がそれより大きい、つまり若い人だけが残るので、男女それぞれの最年長者が除かれます。外側の行の値を副問合せの中で使うこの形を相関副問合せと呼びます。見分ける軸は、副問合せが外側の行ごとに1つの値を返すかどうかです。
ほかの選択肢はなぜ違うのか
- アSELECT MIN(生年月日) FRO…:GROUP BY S2.性別 にすると、男女それぞれの最小値が1行ずつ、合わせて2行返ります。比較演算子の右側には1つの値が必要なので、2行を返す副問合せでは比較ができず、意図した結果になりません。
- イSELECT MIN(生年月日) FRO…:条件を OR でつなぐと、同じ性別の行に加えて、自分より年上の異性の行も最小値の対象になります。異性の最年長者のほうが年上だと、その生年月日が最小値になり、本来除くべき最年長者が残ってしまいます。
- エSELECT MIN(生年月日) FRO…:FROM 句で別名 S2 を付けていないのに S2.性別 を参照しているので、この副問合せは成り立ちません。仮に参照できても GROUP BY で男女2行が返るので、1つの値と比べる形にはなりません。
この問題の用語
- OR数学の手法を使って、いくつかの案から最も有利なものを選ぶ考え方です。期待される費用や利益を計算して比べるときに使います。
出典:令和6年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問10
同じ用語が出る問題
- 令和5年度 秋期 午前Ⅱ 問10:COALESCEに関する問題(OR)
- 令和4年度 秋期 午前Ⅱ 問12:相関副問合せに関する問題(OR)
- 平成30年度 春期 午前Ⅱ 問15:インデックスを比較した説明(OR)
- 平成27年度 春期 午前Ⅱ 問15:インデックスを比較した説明(OR)
- 平成25年度 春期 午前Ⅱ 問15:インデックスを比較した説明(OR)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)