基本情報 平成25年度 秋期 問28:テクノロジ系に関する問題
“中間テスト"” 表からクラスごと, 教科ごとの平均点を求め. クラス名, 教科名の昇 順に表示する SQL 文中の a に入れるべき字旬はどれか。
- aGROUP BY クラス名, 教科名 ORDER BY クラス名, AVG(点数)
- bGROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名正答
- cGROUP BY クラス名, 教科名, 学生番号 ORDER BY クラス名, 教科名, 平均点 GROUP BY クラス名, 平均点 ORDER BY クラス名, 教科名
- dH ささ
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは b です。
「クラスごと、教科ごとの平均点」を出したいので、まずクラスと教科でグループ分けします。これがSQLでは `GROUP BY クラス名, 教科名`。
次に「クラス名、教科名の昇順で表示」したいので `ORDER BY クラス名, 教科名`。
👉 覚え方:GROUP BY=仲間集めて平均/ORDER BY=並べ替え。問題文の「ごと」がGROUP BY、「昇順」がORDER BYのサイン。
ほかの選択肢:a は並べ替えキーがおかしい/c はGROUP BYに学生番号まで入っていて細かすぎる/d はそもそも文字化け。
なぜこれが正解か
正解は b。「クラスごと・教科ごとの平均点」を求めるには、グループ化キーがクラス名と教科名の組合せである必要がある。これにより`AVG(点数)`がクラス×教科の交差点で集計される。さらに「クラス名・教科名の昇順表示」は `ORDER BY クラス名, 教科名`(ASCはデフォルト省略可)。
各選択肢の解説
- a:GROUP BYは正しいが、ORDER BYに `AVG(点数)` を入れてしまい昇順キーが教科名でなく平均点になる。
- c:GROUP BYに学生番号まで含めると「学生ごと」になり、本来の集計単位(クラス×教科)が崩れる。
- d:選択肢が文字化けしており検討不能。
覚え方・ひっかけ注意
「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/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。