基本情報 平成31年度 春期 問27:テクノロジ系に関する問題
“中間テスト”" 表からクラスごと, 教科ごとの平均点を求め. クラス名, 教科名の 昇順に表示する SQL 文中の a に入れる字句はどれか。
- aGROUP BY クラス名, 教科名 ORDER BY クラス名, AVG(点数)
- bGROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名正答
- cGROUP BY クラス名, 教科名, 学生番号 ORDER BY クラス名, 教科名, 平均点 GROUP BY クラス名, 平均点 ORDER BY クラス名, 教科名
- dH さっ
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは b です。
SQLでクラスごと・教科ごとの平均点を出すには:
1. GROUP BY クラス名, 教科名 で「クラス+教科」のグループに分ける
2. ORDER BY クラス名, 教科名 で見た目を並べ替える
「グループ分けの基準」と「並べ替えの基準」は同じものを使うのが基本。
👉 覚え方:GROUP BY=まとめる、ORDER BY=並べる。
ほかの選択肢:a/c は不要な学生番号や平均点で並べたり、ORDER BYの項目が変/d は文字化けで判定不可。
なぜこれが正解か
正解は b。「クラスごと・教科ごとの平均点」を求めるには `GROUP BY クラス名, 教科名` で2つのキーでグルーピングし、AVG(点数) で平均を計算する。表示順は「クラス名, 教科名の昇順」と指定されているため `ORDER BY クラス名, 教科名` が必要。
```sql
SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
GROUP BY クラス名, 教科名
ORDER BY クラス名, 教科名;
```
各選択肢の解説
- a:GROUP BYは正しいが、ORDER BYに `AVG(点数)` が入っていて並び順が問題要求(クラス名・教科名昇順)と一致しない。
- c:GROUP BYに学生番号を含めると個人別の細分化グループになり、クラス・教科の集計にならない。
- d:意味不明(OCR文字化け)で構文不正。
覚え方・ひっかけ注意
SQLの実行順序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。GROUP BYしたカラム以外をSELECTに書く場合は集約関数(AVG、SUM、COUNT等)で集約する必要がある(標準SQLの機能依存ルール)。これに違反するとMySQLでもONLY_FULL_GROUP_BYモードでエラー。
理論的背景
SQLの集約クエリは関係代数の射影+集約操作に対応。GROUP BYは指定列の組合せで関係を分割し、各分割に対して集約関数を適用する。集約関数は COUNT, SUM, AVG, MIN, MAX の基本5つに加え、SQL:2003以降は WINDOW関数(OVER句) で集約と詳細行を同時に扱える。
HAVING句との関係
GROUP BY後の集約結果に対する条件付けは HAVING句を使う(WHEREは集約前のフィルタ)。
```sql
SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
GROUP BY クラス名, 教科名
HAVING AVG(点数) >= 60 -- 平均60点以上のクラス×教科のみ
ORDER BY クラス名, 教科名;
```
実行順序の詳細
論理的処理順序:①FROM/JOIN ②WHERE ③GROUP BY ④HAVING ⑤WINDOW ⑥SELECT ⑦DISTINCT ⑧ORDER BY ⑨LIMIT/OFFSET。これによりGROUP BY後のSELECTで定義したエイリアス(`AVG(点数) AS 平均点`)はORDER BY句で参照可能だがHAVING句では使えない(ただしPostgreSQL等の拡張で許容される実装もある)。
実務での使われ方
- BIレポート:日次/月次/顧客別/商品別の集計はGROUP BY軸を増減して切替
- OLAPキューブ:ROLLUP、CUBE、GROUPING SETSで多次元小計
- ウィンドウ関数:ROW_NUMBER, RANK, LAG, LEAD, SUM() OVER (PARTITION BY...) で詳細行を保ちつつ集約
- マテリアライズドビュー:頻繁な集約クエリを事前計算してキャッシュ
試験での位置づけ
基本情報のデータベース分野で必出。応用情報・データベーススペシャリストではJOIN(INNER/LEFT/RIGHT/FULL OUTER/CROSS)、相関サブクエリ、CTE(WITH句)、再帰CTE、ウィンドウ関数まで踏み込む。
選択肢の発展補足
GROUP BYに含まれない列をSELECTに書くと関数従属性を満たさない限りエラー(標準SQL)。MySQLは緩い実装で許容してきたが、5.7以降ONLY_FULL_GROUP_BYがデフォルト。NULLは1つのグループに集約されるが、集約関数では`COUNT(*)`を除き無視されるなど挙動差に注意。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成31年度 春期 問27/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。