この概念が出た関連問題

この試験の対策ガイド

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

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

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

正解は イ

解説

SQLの集計とソートの構文を問う問題です。「クラスごと、教科ごとの平均点を求め」とあるので、GROUP BY でクラス名と教科名の2つの列を指定してグループ化し、グループごとに AVG(点数) を計算します。さらに「クラス名、教科名の昇順に表示する」とあるので、ORDER BY でクラス名、教科名を指定します(昇順は既定値なので ASC は省略可能)。したがって「GROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名」となるイが正解です。GROUP BY に指定する列は「何の単位で集計するか」を表し、SELECT 句に書ける列は原則として GROUP BY に指定した列と集計関数(AVG、SUM、COUNT など)に限られます。本問の SELECT 句は「クラス名, 教科名, AVG(点数)」なので、GROUP BY はクラス名と教科名の2列でなければ整合しません。この「SELECT句とGROUP BY句の整合」を確認するだけでも選択肢を絞り込めます。

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

選択肢 ア
GROUP BY クラス名, 教科名 までは正しいのですが、ORDER BY クラス名, AVG(点数) では「クラス名の昇順、その中で平均点の昇順」に並んでしまいます。問題文の要求は「クラス名、教科名の昇順」なので、第2ソートキーは教科名でなければなりません。ORDER BY のキーは問題文の表示要件と一字一句突き合わせて確認しましょう。
選択肢 ウ
GROUP BY クラス名, 教科名, 学生番号 とすると、学生番号まで含めた組合せでグループ化されるため、グループが学生1人単位まで細分化されてしまい、「クラスごと、教科ごとの平均」になりません(実質、個人の点数がそのまま出てしまいます)。集計の単位を決めるのは GROUP BY なので、要求された粒度(クラス×教科)より細かい列を加えてはいけません。
選択肢 エ
GROUP BY クラス名, 平均点 は構文的にも論理的にも成立しません。「平均点」は SELECT 句で AVG(点数) に付けた別名であり、集計の結果として得られる値です。集計結果を基準にグループ化することは順序的に矛盾しています(グループ化してから平均が計算されるため)。GROUP BY には元の表に存在する列を指定する、という原則を押さえましょう。

解くときのポイント

「〜ごとの集計」=GROUP BY にその列を列挙、「〜順に表示」=ORDER BY。SELECT句に書ける列は GROUP BY 列+集計関数のみ、という整合チェックで選択肢を絞れる。