この概念が出た関連問題

この試験の対策ガイド

基本情報技術者試験 対策ガイド

合格率・勉強法・参考書の選び方をまとめています

見る →
答えと解説を見る(先に解くのがおすすめ)

正解は ウ

解説

SQL の集計とグループ化に関する問題です。「学生ごとに全科目の平均点を算出し、平均が80点以上の学生」を求めるには、2つの要素が必要です。第一に、学生ごとの集計を行うために GROUP BY 学生番号 でグループ化すること。第二に、グループ化後の集計値(AVG(点数))に対する条件を HAVING 句で指定することです。したがって空欄 a には「学生番号 HAVING AVG(点数) >= 80」が入り、ウが正解です。ここで最重要の知識は WHERE と HAVING の使い分けです。WHERE はグループ化の前に個々の行を絞り込む条件であり、AVG や SUM などの集計関数を書くことはできません。一方 HAVING はグループ化の後にグループ(集計結果)を絞り込む条件であり、集計関数を使えます。本問のように「平均が80以上」という集計値への条件は、必ず HAVING に書く必要があります。SELECT 文の評価順序(FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY)を理解しておくと、この使い分けが自然に身につきます。

なぜ他の選択肢は違うのか

選択肢 ア
HAVING AVG(点数) >= 80 という集計条件の書き方は正しいのですが、GROUP BY 科目 では科目ごとのグループ化になってしまいます。これでは「数学の平均」「英語の平均」のように科目単位の平均点が計算され、SELECT 句の学生番号とも整合しません。「学生ごとに」という要件はグループ化のキーが学生番号であることを意味します。
選択肢 イ
GROUP BY 科目 のグループ化キーが誤りであることに加えて、WHERE 句の位置も文法違反です。WHERE はグループ化の前に行を絞り込む句なので、GROUP BY の後ろに書くことはできません。また仮に書けたとしても、点数 >= 80 は個々の行の点数への条件であり、「平均が80以上」という集計値への条件とは意味が異なります。
選択肢 エ
GROUP BY 学生番号 のグループ化キーは正しいのですが、その後ろに WHERE 句を置くことは SQL の文法上できません(WHERE は FROM の直後、GROUP BY の前に置く句です)。さらに、点数 >= 80 は1行1行の点数を80点以上に絞る条件なので、もし WHERE として先に適用すると「80点以上の科目だけの平均」が計算されてしまい、「全科目の平均が80以上」という要件と結果が変わってしまいます。

解くときのポイント

WHERE は行の絞り込み(集計関数不可・GROUP BY の前)、HAVING はグループの絞り込み(集計関数可・GROUP BY の後)。「平均が〜以上」と来たら HAVING AVG(...) で確定。