平成23年度 特別 午前Ⅱ 問11
データ操作
aに入る副問合せ
“社員”表から,男女それぞれの最年長社員を除くすべての社員を取り出す 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.性別
答えと解説を見る
✓ これが正解ウSELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別
解説
外側の行と同じ性別の中で最も早い生年月日と比べる相関副問合せです。
男女それぞれの最年長者を除くには、外側の社員 S1 ごとに、S1 と同じ性別の社員の中で最も早い生年月日を求め、それより後に生まれた社員だけを残します。副問合せで同じ“社員”表に別名 S2 を付け、S1.性別 = S2.性別 で同じ性別に絞って MIN(生年月日) をとれば、その値は外側の行の性別ごとに決まる一つの値になります。生年月日がそれより大きい、つまり遅い社員だけが残るので、男女それぞれの最年長者が除かれます。外側の列を副問合せの中で参照するのが相関副問合せで、行ごとに比べる相手が変わる場面ではこの形を使う、と押さえておくと見分けられます。
ほかの選択肢はなぜ違うのか
- アSELECT MIN(生年月日) FRO…:GROUP BY で性別ごとに分けると、男性の最小値と女性の最小値の2行が返ります。比較演算子の右側には一つの値が必要なので、そのままでは比べられず、外側の性別との対応も付きません。
- イSELECT MIN(生年月日) FRO…:条件が OR なので、S1 より早く生まれた別の性別の社員まで集計に入ります。比べる値は多くの行で全社員の最も早い生年月日になり、除かれるのは全体の最年長者だけで、もう一方の性別の最年長者は残ります。
- エSELECT MIN(生年月日) FRO…:副問合せの FROM に別名 S2 を付けていないのに、GROUP BY で S2.性別 を参照しています。さらに性別ごとの複数の行が返る形なので、外側の生年月日と一つの値として比べることもできません。
この問題の用語
- OR数学の手法を使って、いくつかの案から最も有利なものを選ぶ考え方です。期待される費用や利益を計算して比べるときに使います。
出典:平成23年度 特別 データベーススペシャリスト試験 午前Ⅱ 問11
同じ用語が出る問題
- 令和6年度 秋期 午前Ⅱ 問10:副問合せに関する問題(OR)
- 令和5年度 秋期 午前Ⅱ 問10:COALESCEに関する問題(OR)
- 平成30年度 春期 午前Ⅱ 問15:インデックスを比較した説明(OR)
- 平成27年度 春期 午前Ⅱ 問15:インデックスを比較した説明(OR)
- 平成25年度 春期 午前Ⅱ 問15:インデックスを比較した説明(OR)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)