集約・GROUP BYとは(全体像)
GROUP BYは、同じ値の行を仲間としてまとめ、その仲間ごとに合計や平均を出すしくみ。集計に使うのが集約関数(SUM=合計・AVG=平均・COUNT=件数・MAX/MIN=最大最小)だよー。
身近にたとえると、クラスごとの平均点を出す感じ。生徒の点数(行)をクラスでまとめて、クラスごとに平均を計算するのー。
押さえるのは、WHEREとHAVINGの違いと、ROLLUPで小計を出せることだよー。
詳しく:WHEREとHAVINGの違いとROLLUPだけ覚えれば戦える
ここが記事の心臓部。まず集約とフィルタの関係を見ていこーね。
集約とフィルタ
| 項目 | 内容 |
|---|---|
| 集約関数 | SUM(合計)・AVG(平均)・COUNT(件数)・MAX/MIN |
| GROUP BY | 同じ仲間ごとにまとめて集計する |
| WHERE | 集計する前の行をしぼる |
| HAVING | 集計したあとの結果をしぼる |
ここで一番のひっかけが「WHEREとHAVINGは同じ」という誤解。WHEREは「集計する前」に行をしぼり、HAVINGは「集計したあと」の結果をしぼる。たとえば「平均点が80以上のクラスだけ」はHAVING(集計後の条件)だよー。
もう1つの要点がROLLUP。
ROLLUP(小計と合計)
| 項目 | 内容 |
|---|---|
| ROLLUP | グループごとの小計と、全体の合計をまとめて出す |
| 使い道 | 「店舗ごとの小計+全店の合計」を一度に集計 |
ROLLUPは、グループごとの小計と全体の合計を、まとめて出してくれるしくみだよー。集計表の下に「小計」「合計」の行が付くイメージなのー。
なお、件数を数えるCOUNTで重複をのぞきたいときは、DISTINCTを組み合わせると正確に数えられるよー。
わかりやすく言い換えると
要するに、クラスごとの平均点でイメージするとラクだよー。
①GROUP BY … クラスでまとめて、クラスごとの平均を出す
②WHEREとHAVING … WHEREは集計前に行をしぼる、HAVINGは集計後の結果をしぼる
③ROLLUP … クラスごとの小計と、全体の合計をまとめて出す
つまり、「WHEREは集計前・HAVINGは集計後」「ROLLUPは小計+合計」、この2点が試験の急所なのー。
試験のツボ
🔴 一番出る:集約関数とGROUP BY
①集約関数はSUM(合計)・AVG(平均)・COUNT(件数)・MAX/MIN
②GROUP BYで同じ仲間ごとにまとめて集計する
🔴 次に出る:WHEREとHAVINGの違い
①WHEREは集計する前の行をしぼる
②HAVINGは集計したあとの結果をしぼる
🟡 押さえると安定:ROLLUPとDISTINCT
①ROLLUPはグループごとの小計と全体の合計をまとめて出す
②COUNTで重複をのぞきたいときはDISTINCTを組み合わせる
よくある間違い
①「WHEREとHAVINGはまったく同じである」→ ✗ WHEREは集計する前の行を、HAVINGは集計したあとの結果をしぼる。
②「ROLLUPはデータを削除するための命令である」→ ✗ ROLLUPはグループごとの小計と全体の合計をまとめて出すしくみ。
③「COUNTはいつも重複をのぞいて数える」→ ✗ 重複をのぞきたいときはDISTINCTを組み合わせる必要がある。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(GROUP BYと集約)
GROUP BYと集約関数に関する次の記述のうち、正しいものはどれか。
- GROUP BYは画面を必ずいくつにも複数に分割するための設定のことだとされているものである
- GROUP BYは同じ仲間ごとにまとめて、合計や平均などを集計するためのしくみである
- GROUP BYはデータを必ず暗号化して保存するための命令のことだとされているものである
- GROUP BYは音を鳴らして知らせるための機能のことだとされているものである
解答は 2 だよー。
GROUP BYは、同じ仲間ごとにまとめて、合計や平均などを集計するためのしくみなのー。クラスごとの平均点を出す感じだよー。
選択肢1の「複数に分割」、選択肢3の「暗号化」、選択肢4の「音を鳴らす」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 画面を分割する設定ではない |
| 2 | ✓ | 仲間ごとにまとめて集計する |
| 3 | ✗ | 暗号化の命令ではない |
| 4 | ✗ | 音を鳴らす機能ではない |
オリジナル問題2(WHEREとHAVING)
WHEREとHAVINGに関する次の記述のうち、正しいものはどれか。
- WHEREは集計する前の行をしぼり、HAVINGは集計したあとの結果をしぼるという違いがある
- WHEREとHAVINGはまったく同じで、しぼるタイミングにも違いはないものだとされているものだ
- WHEREは集計したあと、HAVINGは集計する前にしぼるものだとされているものである
- WHEREもHAVINGも画面の色をそろえるための設定のことだとされているものである
解答は 1 だよー。
WHEREは集計する前の行をしぼり、HAVINGは集計したあとの結果をしぼるのー。「平均点が80以上のクラスだけ」はHAVING(集計後の条件)だよー。
選択肢2の「まったく同じ」、選択肢3の「WHEREとHAVINGが逆」、選択肢4の「色をそろえる」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | WHEREは集計前・HAVINGは集計後 |
| 2 | ✗ | しぼるタイミングが違う |
| 3 | ✗ | 集計前と後が逆 |
| 4 | ✗ | 色をそろえる設定ではない |
オリジナル問題3(ROLLUP)
ROLLUPに関する次の記述のうち、正しいものはどれか。
- ROLLUPはデータを必ず1か所だけ削除するための命令のことだとされているものである
- ROLLUPは画面を必ず3回続けて点滅させるための設定のことだとされているものである
- ROLLUPは音量を自動で大きく上げるための機能のことだとされているものである
- ROLLUPはグループごとの小計と、全体の合計をまとめて出すためのしくみである
解答は 4 だよー。
ROLLUPは、グループごとの小計と、全体の合計をまとめて出すためのしくみなのー。集計表の下に「小計」「合計」の行が付くイメージだよー。
選択肢1の「削除する命令」、選択肢2の「3回点滅」、選択肢3の「音量を上げる」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 削除する命令ではない |
| 2 | ✗ | 点滅の設定ではない |
| 3 | ✗ | 音量を上げる機能ではない |
| 4 | ✓ | 小計と全体の合計をまとめて出す |
まとめ
押さえどころ
- 🔴 集約関数とGROUP BY = SUM・AVG・COUNT・MAX/MINで集計。GROUP BYで仲間ごとにまとめる。
- 🔴 WHEREとHAVINGの違い = WHEREは集計する前の行、HAVINGは集計したあとの結果をしぼる。
- 🟡 ROLLUPとDISTINCT = ROLLUPは小計と全体の合計をまとめて出す。COUNTの重複除外はDISTINCT。
次に学ぶ
執筆: SikakuQuest編集部