“得点”表から,学生ごとに全科目の点数の平均を算出し,平均が80点以上の学生の学生番号とその平均点を求める。
aに入れる適切な字句はどれか。
ここで,(主キー)を付けた項目は主キーを表す。
得点(学生番号(主キー),科目(主キー),点数)
[SQL文]
SELECT 学生番号, AVG(点数)
FROM 得点
GROUP BY [a]
科目 HAVING AVG(点数) >= 80 科目 WHERE 点数 >= 80 学生番号 HAVING AVG(点数) >= 80 学生番号 WHERE 点数 >= 80 購入状況を確認しています… 正答 3
解説 正解は3です。
学生ごとの平均点を求めるには、学生番号でグループ化してAVG関数で集計します。
集計結果に条件を付けるには、WHERE句ではなくHAVING句を使います。
SQL文の処理順は、FROM、WHERE、GROUP BY、HAVING、SELECTの順です。
【選択肢別解説】
1:× 科目でグループ化すると、科目ごとの平均点が求まります。
学生ごとの平均ではないので誤りです。
2:× 科目でグループ化している点が誤りです。
さらに、WHERE句はGROUP BY句の後ろには書けないので、構文としても成り立ちません。
3:○ 学生番号でグループ化して学生ごとの平均点を求め、HAVING AVG(点数)>=80で平均80点以上のグループだけを残します。
問題の要求どおりです。
4:× WHERE句はGROUP BY句より前に書く必要があるので、構文として誤りです。
また、WHERE 点数>=80とすると、80点未満の科目を除外してから平均することになり、要求と異なります。
【ポイント】
WHERE句はグループ化の前に行(レコード)を絞り込み、HAVING句はグループ化の後にグループを絞り込みます。
AVGやSUMなどの集約関数を条件に使うときはHAVING句を使うと覚えましょう。