令和元年度 秋期 午前 問26
データベース
GROUP BYに関する問題
“得点”表から,学生ごとに全科目の点数の平均を算出し,平均が80点以上の学生の学生番号とその平均点を求める。aに入れる適切な字句はどれか。ここで,実線の下線は主キーを表す。
得点(学生番号, 科目, 点数)
〔SQL文〕
SELECT 学生番号, AVG(点数) FROM 得点 GROUP BY a
- ア科目 HAVING AVG(点数) >= 80
- イ科目 WHERE 点数 >= 80
- ウ学生番号 HAVING AVG(点数) >= 80
- エ学生番号 WHERE 点数 >= 80
答えと解説を見る
✓ これが正解ウ学生番号 HAVING AVG(点数) >= 80
解説
学生番号でまとめてから、平均の値で絞り込む書き方です。
求めたいのは学生ごとの平均なので、まとめる単位は学生番号です。表は学生番号と科目の組で一行が決まっているため、科目でまとめると別の集計になります。GROUP BY に学生番号を置くと、一人につき一行の集計結果ができます。次に、その集計結果に対して条件を掛けます。ここで使えるのは HAVING で、まとめた後の値を条件にできます。もう一つの絞り込みは、まとめる前の一行ずつに対して働きます。平均はまとめて初めて計算できる値なので、前の段では使えません。つまり、まとめる単位が学生番号であることと、条件を後の段に置くことの二つが同時に満たされている必要があります。どの段で絞るのかを意識すると、この形の問いは迷いません。どの行がどの組にまとまるかを紙に描くと、二段の違いが見えます。
ほかの選択肢はなぜ違うのか
- ア科目 HAVING AVG(点数) >=…:まとめる単位を科目にしています。それでは科目ごとの平均になり、学生ごとの成績を見ることができません。条件を置く段は正しいので、単位の取り違えだけが誤りです。一人の学生の点数が、複数の組に散ってしまいます。
- イ科目 WHERE 点数 >= 80:まとめる単位が科目であるうえ、条件も前の段に置いています。二か所が食い違っているので、求める結果からは最も遠い形です。前の段の条件は、一行ずつの点数にしか効きません。しかも WHERE は GROUP BY より前にしか書けないので、この並びでは文として成り立ちません。
- エ学生番号 WHERE 点数 >= 80:まとめる単位は正しく学生番号ですが、条件を前の段に置いています。WHERE は GROUP BY より前にしか書けないので、この並びでは文として成り立ちません。仮に前へ置いても、八十点以上の行だけを集めてから平均を取ることになります。低い点数が除かれてしまうので、本来の平均とは値が変わります。実際の成績より高く出ます。
出典:令和元年度 秋期 基本情報技術者試験 午前 問26
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)