集約・GROUP BY(HAVING・ROLLUP)とは?同じ仲間をまとめて合計や平均を出すSQL

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

集約・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と集約)

📝 オリジナル問題 1 GROUP BYと集約

GROUP BYと集約関数に関する次の記述のうち、正しいものはどれか。

  1. GROUP BYは画面を必ずいくつにも複数に分割するための設定のことだとされているものである
  2. GROUP BYは同じ仲間ごとにまとめて、合計や平均などを集計するためのしくみである
  3. GROUP BYはデータを必ず暗号化して保存するための命令のことだとされているものである
  4. GROUP BYは音を鳴らして知らせるための機能のことだとされているものである
データスラ
データスラ 解答・解説

解答は 2 だよー。

GROUP BYは、同じ仲間ごとにまとめて、合計や平均などを集計するためのしくみなのー。クラスごとの平均点を出す感じだよー。

選択肢1の「複数に分割」、選択肢3の「暗号化」、選択肢4の「音を鳴らす」はどれも誤りなのー。

選択肢判定理由
1画面を分割する設定ではない
2仲間ごとにまとめて集計する
3暗号化の命令ではない
4音を鳴らす機能ではない

オリジナル問題2(WHEREとHAVING)

📝 オリジナル問題 2 WHEREとHAVINGの違い

WHEREとHAVINGに関する次の記述のうち、正しいものはどれか。

  1. WHEREは集計する前の行をしぼり、HAVINGは集計したあとの結果をしぼるという違いがある
  2. WHEREとHAVINGはまったく同じで、しぼるタイミングにも違いはないものだとされているものだ
  3. WHEREは集計したあと、HAVINGは集計する前にしぼるものだとされているものである
  4. WHEREもHAVINGも画面の色をそろえるための設定のことだとされているものである
データスラ
データスラ 解答・解説

解答は 1 だよー。

WHEREは集計する前の行をしぼり、HAVINGは集計したあとの結果をしぼるのー。「平均点が80以上のクラスだけ」はHAVING(集計後の条件)だよー。

選択肢2の「まったく同じ」、選択肢3の「WHEREとHAVINGが逆」、選択肢4の「色をそろえる」はどれも誤りなのー。

選択肢判定理由
1WHEREは集計前・HAVINGは集計後
2しぼるタイミングが違う
3集計前と後が逆
4色をそろえる設定ではない

オリジナル問題3(ROLLUP)

📝 オリジナル問題 3 ROLLUP

ROLLUPに関する次の記述のうち、正しいものはどれか。

  1. ROLLUPはデータを必ず1か所だけ削除するための命令のことだとされているものである
  2. ROLLUPは画面を必ず3回続けて点滅させるための設定のことだとされているものである
  3. ROLLUPは音量を自動で大きく上げるための機能のことだとされているものである
  4. ROLLUPはグループごとの小計と、全体の合計をまとめて出すためのしくみである
データスラ
データスラ 解答・解説

解答は 4 だよー。

ROLLUPは、グループごとの小計と、全体の合計をまとめて出すためのしくみなのー。集計表の下に「小計」「合計」の行が付くイメージだよー。

選択肢1の「削除する命令」、選択肢2の「3回点滅」、選択肢3の「音量を上げる」はどれも誤りなのー。

選択肢判定理由
1削除する命令ではない
2点滅の設定ではない
3音量を上げる機能ではない
4小計と全体の合計をまとめて出す

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る