問題
“中間テスト”表からクラスごと,教科ごとの平均点を求め,クラス名,教科名の昇順に表示するSQL文中のaに入れるべき字句はどれか。 中間テスト(クラス名,教科名,学生番号,名前,点数) 〔SQL文〕 SELECT クラス名, 教科名, AVG(点数) AS 平均点 FROM 中間テスト [ a ]
キーボード:1〜4で選択・Enterで次へ
答え合わせ
- A
- B
- C
- D
自信の3択
えらぶと、この端末に記録します(登録はいりません)
解説
答えは b です。
「クラスごと、教科ごとの平均点」を出したいので、まずクラスと教科でグループ分けします。これがSQLでは `GROUP BY クラス名, 教科名`。
次に「クラス名、教科名の昇順で表示」したいので `ORDER BY クラス名, 教科名`。
👉 覚え方:GROUP BY=仲間集めて平均/ORDER BY=並べ替え。問題文の「ごと」がGROUP BY、「昇順」がORDER BYのサイン。
ほかの選択肢:a は並べ替えキーに平均点を使っている/c はGROUP BYに学生番号まで入っていて細かすぎる/d はGROUP BYに平均点を入れていて、教科ごとにまとめていない。
なぜこれが正解か
正解は b。「クラスごと・教科ごとの平均点」を求めるには、グループ化キーがクラス名と教科名の組合せである必要がある。これにより`AVG(点数)`がクラス×教科の交差点で集計される。さらに「クラス名・教科名の昇順表示」は `ORDER BY クラス名, 教科名`(ASCはデフォルト省略可)。
各選択肢の解説
- a:GROUP BYは正しいが、ORDER BYに `AVG(点数)` を入れてしまい昇順キーが教科名でなく平均点になる。
- c:GROUP BYに学生番号まで含めると「学生ごと」になり、本来の集計単位(クラス×教科)にならない。
- d:GROUP BY に教科名がなく,集計結果である平均点をグループ化のキーにしているため,教科ごとの平均点にならない(AVG の結果はグループ化した後に求まる値で,GROUP BY のキーにはできない)。
覚え方・ひっかけ注意
「GROUP BYのキー=集計の粒度」。問題文の「ごと」を全てGROUP BYに並べる。ORDER BY は表示順、GROUP BY は集計単位で役割が違う。集約関数(AVG/SUM/COUNT等)を使ったSELECTでは、GROUP BYに指定していない非集約列をSELECTに書くとエラーになる(標準SQL準拠)点も頻出ひっかけ。
理論的背景
SQLの集約クエリは関係代数の拡張演算「グループ化+集約」で表現できる: γ_クラス名,教科名;AVG(点数)(中間テスト)。実行時はオプティマイザが①ソートベースの集約(GROUP BYキーでソート後に連続走査)か②ハッシュベースの集約(ハッシュ表でグループ化)かを選択する。インデックスがGROUP BY列に張られていればソート省略でき高速。
句の論理的評価順序は SQL92 で FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY と規定され、これがエイリアス利用可否の根拠となる(SELECTで定義したエイリアスは ORDER BY では使えるが HAVING では使えない、など)。
実務での使われ方
GROUP BYは集計レポート・BI・ダッシュボードの基盤。OLAPではROLLUP / CUBE / GROUPING SETS拡張でクラス別小計・教科別小計・全体合計を一発で求められる(例: `GROUP BY ROLLUP(クラス名, 教科名)`)。ウィンドウ関数(`OVER(PARTITION BY ...)`)と組み合わせると行を保ったまま集計値を付加できる。
試験での位置づけ
FE午前のデータベース分野で必出。①GROUP BYと集約関数の組合せ、②HAVING句との違い(HAVING=集計後の絞込み、WHERE=集計前の絞込み)、③ORDER BY との混同、が三大論点。AP・DBスペシャリストではウィンドウ関数・CTE(WITH句)・再帰クエリまで範囲。
選択肢の発展補足
GROUP BYの粒度を誤ると「集計単位の粒度違い」というデータマートの典型バグになる。たとえば本問で学生番号を含めると「クラス×教科×学生」単位の平均(つまり個別点数そのもの)になり意味を失う。逆に「教科名のみ」でグループ化すれば全クラス横断の教科別平均となる。「何ごとに集計したいか」を主語で確認するのがバグ防止の鉄則。
出典と作り方
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成25年度 春期 問28/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビ独自の3段階の解説(初級・標準・上級)です。

