情報処理試験を勉強していると、「GROUP BYって何をする句?HAVINGやWHEREとどう違うの?」と混乱しがちです。
この記事では、GROUP BY句の定義・仕組み・試験での出題パターンを、日常の例え話と図解で整理します。
対象試験と出題頻度
GROUP BY句は、基本情報技術者・応用情報技術者で出題されるテーマです。
SQLのSELECT文穴埋め問題として定番化しており、集約関数やHAVING句との組み合わせを正確に理解できるかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
GROUP BY句とは、一言で言うと
「SELECT文の中で、指定した列の値が同じ行をひとまとめにし、グループ単位で集計処理を行うための構文」
です。
イメージとしては、「クラス替え後の出席簿の並べ替え」です。
学校で「クラスごとの平均点を出して」と頼まれたら、まず出席簿をクラスごとに分け、それぞれのクラス内で点数を合計し人数で割ります。
GROUP BY句はまさにこの「クラスごとに分ける」操作を担当します。分けた後の「平均を出す」「件数を数える」といった計算は、集約関数(AVG、COUNTなど)の仕事です。
📊 GROUP BY句の基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | GROUP BY Clause |
| SQLでの分類 | DML(データ操作言語)のSELECT文内の句 |
| 記述位置 | WHERE句の後、HAVING句の前 |
| SELECT句の制約 | GROUP BY句で指定した列 or 集約関数 or 定数のみ記述可能 |
解説
データベースには大量のレコードが格納されていますが、実務でも試験でも「部署ごとの合計」「学生ごとの平均」のように、ある列の値が同じ行をまとめて集計したい場面が頻繁に登場します。
この「まとめ」を担うのがGROUP BY句です。
基本構文と処理の流れ
SELECT文の中でGROUP BY句を使う場合の記述順と、DBMSが実際に処理する順序を整理します。
FROM 表名
WHERE 条件式 — ① 行の絞り込み(グループ化前)
GROUP BY 列名 — ② グループ化
HAVING 条件式 — ③ グループの絞り込み(グループ化後)
ORDER BY 列名; — ④ 並び替え
ここで最も重要なルールがあります。
GROUP BY句を使った場合、SELECT句には「GROUP BY句で指定した列」「集約関数」「定数」しか書けません。指定していない列を直接書くと構文エラーになります。
図解:GROUP BY句の動作イメージ
具体的なデータで動きを確認します。「得点」表から、学生ごとの平均点を求める例です。
GROUP BY句の動作イメージ
① 元の「得点」表
| 学生番号 | 科目 | 点数 |
|---|---|---|
| S001 | 数学 | 80 |
| S001 | 英語 | 90 |
| S002 | 数学 | 70 |
| S002 | 英語 | 60 |
| S003 | 数学 | 95 |
| S003 | 英語 | 85 |
② GROUP BY 学生番号 で集約
| 学生番号 | AVG(点数) |
|---|---|
| S001 | 85 |
| S002 | 65 |
| S003 | 90 |
同じ学生番号の行がまとまり、
集約関数で1行に集計される
FROM 得点
GROUP BY 学生番号;
WHEREとHAVINGの役割の違い
ここだけは確実に押さえてください。
WHEREは「グループ化する前に個々の行を絞る」句、HAVINGは「グループ化した後にグループ単位で絞る」句です。この2つは実行タイミングが異なるため、使い分けを誤ると結果が変わります。
WHERE と HAVING の処理タイミング
❶ FROM
表を指定
❷ WHERE
行を絞る
⚠ 集約関数NG
❸ GROUP BY
ここでグループ化
境界❹ HAVING
グループを絞る
✔ 集約関数OK
❺ SELECT
列を取り出す → ORDER BY で並び替え
※ コードではSELECTを先頭に書くが、DBMSの内部処理はFROMから始まる
| 句 | 対象 | 集約関数の使用 | タイミング |
|---|---|---|---|
| WHERE | 個々の行 | 使えない | グループ化の前 |
| HAVING | グループ | 使える | グループ化の後 |
複数列でのグループ化
GROUP BY句には複数の列を指定できます。例えば「GROUP BY クラス名, 教科名」と書けば、クラスと教科の組み合わせごとにグループが作られます。
SELECT句に書ける列もその両方になります。
SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
GROUP BY クラス名, 教科名
ORDER BY クラス名, 教科名;
では、この構文が試験でどのように出題されるか見ていきましょう。
💡 GROUP BY句の核心を3行で
・指定した列の値が同じ行をまとめ、集約関数でグループ単位の集計を行う句
・SELECT句にはGROUP BYで指定した列・集約関数・定数のみ記述可能
・WHERE(行の絞り込み/グループ化前)とHAVING(グループの絞り込み/グループ化後)の区別が最重要
試験ではこう出る!
GROUP BY句は、FE・APの午前(科目A)でSELECT文の穴埋め問題として繰り返し出題されています。出題パターンは大きく2つに分かれます。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE R1秋 午前 問26 |
学生ごとの平均点を算出し80点以上を抽出するSQL文の穴埋め | ・GROUP BY+HAVINGの正しい組み合わせを選ぶ ・WHEREを使った選択肢がひっかけ ・グループ化対象列(学生番号 vs 科目)の判断 |
| AP H31春 午前 問28 |
2018年度の平均点数600点以上のクラスを抽出するSQL文を選ぶ | ・WHERE→GROUP BY→HAVINGの処理順 ・WHERE句での集約関数使用は不可 ・HAVINGにグループ化していない列を指定すると構文エラー |
| FE R7年1月 修了 問20 |
クラスごと・教科ごとの平均点を求めるSQL文の穴埋め | ・GROUP BYに複数列を指定する書き方 ・ORDER BYとの組み合わせ |
| AP H22春 午前 問33 |
表の並び替え結果を得るSQL文を選ぶ問題(GROUP BYとORDER BYの区別) | ・GROUP BYは集約であり並び替えではない ・SELECT句に指定できる列の制約 |
📝 IPA試験での出題パターン
パターン1:GROUP BY+HAVING の穴埋め(最頻出)
表の定義とSQL文が示され、GROUP BY句とHAVING句の空欄を埋める形式。ひっかけ選択肢は「HAVINGの代わりにWHEREを使う」「グループ化対象列を誤る」の2パターン。WHERE句の後にGROUP BY、そしてHAVINGという処理順を思い出せば即答できる。
パターン2:ORDER BY との混同を狙う問題
GROUP BY(集約)とORDER BY(並び替え)は目的が異なる。AP H22春 問33のように、表の並び順を変えるだけの操作にGROUP BYを使った選択肢が紛れ込む。SELECT句の制約(集約関数なしでは使えない列がある)を知っていれば、GROUP BYの選択肢を排除できる。
試験ではここまででOKです。HAVING句の中に複雑な副問合せが入るパターンはFE・APレベルではほぼ出ないため、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. 「得点」表から学生ごとの平均点を求め、平均が80点以上の学生を抽出するSQL文の空欄に入る字句として正しいものはどれか?
FROM 得点
[ ________ ]
- A. GROUP BY 科目 HAVING AVG(点数) >= 80
- B. GROUP BY 学生番号 WHERE AVG(点数) >= 80
- C. GROUP BY 学生番号 HAVING AVG(点数) >= 80
正解と解説を見る
正解:C
解説:
「学生ごと」の集計なのでGROUP BYに指定すべき列は「学生番号」です。さらに、グループ化した後の条件絞り込みにはHAVING句を使います。
選択肢Aは「GROUP BY 科目」となっており、科目ごとの平均を算出してしまいます。「学生ごと」という要件と一致しません。選択肢Bは「WHERE AVG(点数) >= 80」となっていますが、WHERE句の中で集約関数は使用できません。GROUP BYの後にWHEREを書くこと自体が構文エラーです。
よくある質問(FAQ)
Q. GROUP BY句を使わずに集約関数だけ書くとどうなりますか?
GROUP BY句なしで「SELECT AVG(点数) FROM 得点」のように書くと、表全体を1つのグループとみなして集計が行われます。結果は常に1行です。「テーブル全体の平均を1つだけ知りたい」場合はGROUP BYは不要で、「学生ごと」「クラスごと」のようにグループ分けが必要な場合にだけGROUP BY句を使います。
Q. GROUP BY句とDISTINCTの違いは何ですか?
DISTINCTは「重複行を除外して一意な行だけ返す」機能で、集計は行いません。例えば「SELECT DISTINCT 学生番号 FROM 得点」は学生番号の一覧を返すだけです。一方、GROUP BY句は重複行をまとめた上で集約関数による計算を行います。「重複排除だけ」ならDISTINCT、「集計が必要」ならGROUP BY句と使い分けます。
Q. 実務ではGROUP BY句はどんな場面で使いますか?
売上データを「月別・店舗別に集計する」、アクセスログを「ページごとの閲覧回数で集計する」など、業務レポートやダッシュボードの作成で日常的に使います。GROUP BY句はSQLの中でも最も使用頻度が高い構文の一つであり、データ分析業務では必須の知識です。
Q. GROUP BYとORDER BYを同時に使うとき、記述順はどちらが先ですか?
必ず「GROUP BY → HAVING → ORDER BY」の順で記述します。ORDER BYはSELECT文の最後に書く句であり、GROUP BYの前に書くと構文エラーになります。なお、ORDER BYで指定する列は、GROUP BYで指定した列または集約関数の結果に限られます。例えば「ORDER BY AVG(点数) DESC」のように、集計結果で並び替えることも可能です。