基本情報技術者 2013年 春期 午前(科目A) 問28
問題文
“中間テスト”表からクラスごと、教科ごとの平均点を求め、クラス名、教科名の昇順に表示する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句でこれらを明示的に指定する必要があります。また、出力を「クラス名、教科名の昇順」にするには ORDER BY にクラス名、教科名の順で指定します。選択肢イの「GROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名」はこの条件を満たします。
SQL例(正しい形)
SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
GROUP BY クラス名, 教科名
ORDER BY クラス名, 教科名;
解法ステップ
- SELECT句を確認し、非集計の列(クラス名、教科名)を特定する。
- それら非集計列はGROUP BYに列挙する必要があると判断する。
- 出力の並び順(設問:「クラス名、教科名の昇順」)を満たすORDER BY句を指定する。
- 以上を満たす選択肢を選ぶ(イが該当)。
選択肢別の誤答解説
- ア: 「GROUP BY クラス名, 教科名 ORDER BY クラス名, AVG(点数)」
- GROUP BYは正しいが、ORDER BYがAVG(点数)になっており表示順が課題と異なるため不正解です。
- イ: 「GROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名」
- 正解。非集計列をGROUP BYに含め、出力を指定どおり昇順にしている点が適合します。
- ウ: 「GROUP BY クラス名, 教科名, 学生番号 ORDER BY クラス名, 教科名, 平均点」
- 学生番号をGROUP BYに含めるとグループが学生単位になり、クラス・教科ごとの平均が正しく算出されません(平均が学生ごとになってしまう)。
- エ: 「GROUP BY クラス名, 平均点 ORDER BY クラス名, 教科名」
- GROUP BYに集計結果(平均点)を直接含めるのは論理的に不適切で、また教科名をGROUP BYに含めていないためSELECTとの整合性が取れません。
よくある誤解
- 「ORDER BY AVG(点数) にすれば平均点順で見やすいから正しい」と誤解しがちですが、設問は表示順としてクラス名・教科名の昇順を要求しています。
- 「GROUP BY に学生番号を入れておけば個別にも集計できる」と考える人がいますが、学生番号を含めるとグループ化単位が学生ごとになり、クラス・教科ごとの平均になりません。
補足コラム
- SQLの基本ルール:SELECTにある非集計列はGROUP BYで列挙するか、集約関数で包む必要があります。これを満たしていないと多くのDBでエラーになります(または意図しない結果になります)。
- ORDER BYには列名、エイリアス、列番号、または式が使えますが、問題文の要件に合わせて指定することが重要です。デフォルトは昇順(ASC)です。
FAQ
Q1: ORDER BYに別名(ASで付けた平均点の別名)を使えますか?
A1: 多くのDBでは可能です。例えば ORDER BY 平均点 とすれば AVG(点数)でソートできますが、今回はクラス名・教科名で昇順にする必要があります。
A1: 多くのDBでは可能です。例えば ORDER BY 平均点 とすれば AVG(点数)でソートできますが、今回はクラス名・教科名で昇順にする必要があります。
Q2: GROUP BYに列番号(1,2など)を使えますか?
A2: 一部のDBで許容されますが、可読性や移植性の観点から列名やエイリアスを使うことを推奨します。
A2: 一部のDBで許容されますが、可読性や移植性の観点から列名やエイリアスを使うことを推奨します。
Q3: HAVINGは必要ですか?
A3: 今回は条件指定(例えば平均点がある値以上)をしていないため不要です。集約後に条件を付ける場合にHAVINGを使います。
A3: 今回は条件指定(例えば平均点がある値以上)をしていないため不要です。集約後に条件を付ける場合にHAVINGを使います。
関連キーワード: SQL、GROUP BY、ORDER BY、AVG、集計、クエリ、データベース、集約関数、ソート、グルーピング

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

