基本情報技術者 2019年 春期 午前(科目A) 問27
問題文
“中間テスト”表からクラスごと、教科ごとの平均点を求め、クラス名、教科名の昇順に表示するSQL文中のaに入れる字句はどれか。
中間テスト(クラス名, 教科名, 学生番号, 名前, 点数)
〔SQL文〕
SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
[ a ]
選択肢
ア:GROUP BY クラス名, 教科名 ORDER BY クラス名, AVG(点数)
イ:GROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名(正解)
ウ:GROUP BY クラス名, 教科名, 学生番号 ORDER BY クラス名, 教科名, 平均点
エ:GROUP BY クラス名, 平均点 ORDER BY クラス名, 教科名
🔒 解説は解答すると表示されます
GROUP BY と ORDER BY の組合せ【午前解説】
正解の理由
問題は「クラスごと、教科ごとの平均点を求め、クラス名・教科名の昇順に表示する」ことです。SELECT 句にある非集約の列(クラス名、教科名)は GROUP BY に列挙する必要があり、平均点は AVG(点数) という集計関数で計算します。並べ替え順はクラス名→教科名の昇順なので ORDER BY にも同じ列を指定します。したがって、"GROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名" が要件を満たします。
解法ステップ
- SELECT 句を確認する: クラス名, 教科名, AVG(点数) AS 平均点 が選ばれている。
- 非集約列を特定する: クラス名と教科名が非集約列なので GROUP BY に入れる。
- 並べ替え要件を確認する: クラス名、教科名の昇順で表示するので ORDER BY に同じ列を指定する。
- SQL を組み立てる:
SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
GROUP BY クラス名, 教科名
ORDER BY クラス名, 教科名;
- 実行・確認: 出力がクラス→教科ごとの平均点で昇順になっていることを確認する。
選択肢別の誤答解説
- ア: GROUP BY クラス名, 教科名 ORDER BY クラス名, AVG(点数)
→ ORDER BY に AVG(点数) を指定すると教科名順ではなく平均点順に並ぶため、問題の「教科名の昇順」に合致しません。 - イ: GROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名
→ 正解。SELECT の非集約列を GROUP BY に含め、並べ替えも求められたクラス名・教科名の昇順になっています。 - ウ: GROUP BY クラス名, 教科名, 学生番号 ORDER BY クラス名, 教科名, 平均点
→ 学生番号を GROUP BY に含めると個々の学生単位でグループ化され、クラス・教科ごとの平均ではなく個人ごとの平均(ほぼ点数自身)になり目的を満たしません。 - エ: GROUP BY クラス名, 平均点 ORDER BY クラス名, 教科名
→ GROUP BY に集計結果(平均点の別名)を入れるのは論理的に不適切であり、多くの DB ではエラーになるか期待したグルーピングができません。加えて、GROUP BY に教科名が含まれていないため教科ごとの集計になりません。
よくある誤解
- 非集約列を GROUP BY に入れ忘れる: SELECT に集約以外の列があれば必ず GROUP BY に含める必要があるというルールを見落としがちです。
- GROUP BY に学生番号を入れると正しく見えるが、個人単位で集計されてしまい目的と逆になります。
- ORDER BY に AVG(点数) を使うと「教科名で昇順」に並ばず平均点順になるため、要件と違う結果を招きます。
補足コラム
- SQL の標準ルールでは、SELECT に出す非集約カラムはすべて GROUP BY に含める必要があります。MySQL の一部設定など例外的な挙動を示す DB もありますが、試験では標準的なルールに従う解答が求められます。
- ORDER BY では列名・式・集計関数・列番号(例: ORDER BY 1,2)などが使えますが、可読性や移植性を考えると列名で明示するのが安全です。
- パフォーマンス面では、集計対象の大きさによってはインデックスの有無や実行計画が影響しますが、問題の趣旨は構文理解なのでまずは正しい GROUP BY/ORDER BY を押さえてください。
FAQ
Q1: ORDER BY に別名(AS で付けた平均点)を使えますか?
A1: 多くの DB では可能ですが、挙動が異なる場合もあるため、要求が「教科名の昇順」であれば教科名を直接指定するのが確実です。
A1: 多くの DB では可能ですが、挙動が異なる場合もあるため、要求が「教科名の昇順」であれば教科名を直接指定するのが確実です。
Q2: GROUP BY に集計関数を入れられますか?
A2: 集計関数自体を GROUP BY に入れるのは意味が無く、多くの場合エラーになります。GROUP BY には集計のキーとなる列を指定します。
A2: 集計関数自体を GROUP BY に入れるのは意味が無く、多くの場合エラーになります。GROUP BY には集計のキーとなる列を指定します。
Q3: ORDER BY のデフォルトは昇順ですか?
A3: はい。ORDER BY 列名 は ASC(昇順)と同義です。降順にしたければ DESC を付けます。
A3: はい。ORDER BY 列名 は ASC(昇順)と同義です。降順にしたければ DESC を付けます。
関連キーワード: SQL、GROUP BY、ORDER BY、AVG、集計関数、並べ替え、SQL構文、集計処理、クエリ設計

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

