基本情報技術者試験「GROUP BYとHAVING」の問題
次の「給与」表に対し SQL文 `SELECT 部署, AVG(給与) FROM 給与 GROUP BY 部署 HAVING AVG(給与) >= 40` を実行したとき、結果に現れる部署はどれか。
| 部署 | 給与 |
|---|---|
| 営業 | 30 |
| 営業 | 50 |
| 開発 | 40 |
| 開発 | 60 |
| 開発 | 50 |
| 総務 | 20 |
ア営業のみ
イ開発と総務
ウ営業と開発の2部署
エ3部署すべて
正解
ウ.営業と開発の2部署
部署ごとの平均給与は営業=(30+50)/2=40、開発=(40+60+50)/3=50、総務=20/1=20。HAVING AVG(給与)>=40を満たすのは営業(40)と開発(50)の2部署であり正しい。
?選択肢ごとの解説
ア ×営業のみは開発(平均50)を見落とした誤りで、開発も条件40以上を満たす。
イ ×開発と総務は総務(平均20)を誤って含めており、20は40未満なので条件を満たさない。
ウ ○部署ごとの平均給与は営業=(30+50)/2=40、開発=(40+60+50)/3=50、総務=20/1=20。HAVING AVG(給与)>=40を満たすのは営業(40)と開発(50)の2部署であり正しい。
エ ×3部署すべては総務(平均20)まで含めた誤りで、HAVING条件で総務は除外される。
✎くわしく
GROUP BY で部署ごとにグループ化し、各グループの AVG を計算してから HAVING で集計結果を条件で絞り込む。WHERE が行単位の絞り込みであるのに対し、HAVING はグループ(集計値)単位の絞り込みである点が核心である。
✓本番での押さえどころ
試験のコツ
GROUP BY 問題は『グループごとに平均を電卓計算→HAVING条件と比較』の二段階で解く。HAVING は集約値に対する条件である点を意識する。
覚え方
WHERE は『行をふるい分け』、HAVING は『集計後のグループをふるい分け』。HAVING は集約のあとに来る、と順序で覚える。
よくある誤り
境界値の平均40を『より大』と誤解して営業を除外する、または総務を平均値ではなく合計や行数で判断して含める誤りが多い。
データベースの他の問題
この問題を、AIの8-ways解説つきで。
無料ではじめる →基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。
ukamiru 過去問 · 基本情報技術者試験 · fe-a3-0242