Group関数・Group by句・Having句

 


📊 Group関数・Group by句・Having句

🍚 そもそもGroup関数って何?

Group関数は、「まとめて計算してくれる関数」のことです。たとえば:

支出(円)
太郎100
次郎200
太郎300
この表があったとします。これに対して:
sql
SELECT SUM(支出) FROM 家計簿;

と書くと、全員の合計支出(100 + 200 + 300 = 600) を出してくれます。
これが SUM() という**Group関数(集約関数)**の働きです。

他にもあるGroup関数たち:

関数名何をする?
SUM()合計を出す
AVG()平均を出す
MAX()最大値を出す
MIN()最小値を出す
COUNT()件数を数える

👥 Group by句って何?(グループ分けして計算)

Group関数が「まとめて計算」だとすると、
Group by句は「誰ごとにまとめるか」を指定する文です。

例:人ごとの支出合計を出したい!

sql
SELECT 人, SUM(支出) FROM 家計簿 GROUP BY 人;

このSQLの意味:

「人ごとにグループを作って、支出を合計してね!」

合計支出
太郎400
次郎200
💡 ポイント:

Group関数と一緒に使うのが GROUP BY です!


🎯 Having句って何?(グループに条件をつける)

WHERE句と何が違うの?」って疑問、ありますよね。
答えはカンタン。HAVING は「グループに対する条件」です。

例:合計支出が300円以上の人だけを出す

sql
SELECT 人, SUM(支出) FROM 家計簿 GROUP BYHAVING SUM(支出) >= 300;
合計支出
太郎400
💡 WHERE行単位での条件

💡 HAVINGグループ単位での条件


🚨 ポイント

ポイント内容
GROUP BY に指定していない列は SELECT に書けないSELECT 人, 年齢, SUM(支出) ←ダメ(年齢はGROUP BYしてない)
GROUP BY より前に WHERE を書くWHEREGROUP BYHAVING の順番が正しい
HAVING で使う条件は GROUP BY した列 or Group関数に限るHAVING 年齢 = 20 ←NG(年齢でグループ化してない)
COUNT(*) vs COUNT(列名) の違いCOUNT(*) はNULLもカウント、COUNT(列名) はNULLを除外
NULLの扱いSUM(NULL)はNULLになるが、グループ化はNULLも1グループになる

💡 実務での使いどころ

  • 売上レポートで「店ごとの売上合計」を出す

  • 社員ごとの「平均残業時間」を出す

  • 商品カテゴリごとの「購入数が100件以上のカテゴリ」を抽出する(HAVING


✍️ まとめ:これだけ覚えておけばOK!

要素意味
Group関数複数の行を1つにまとめて計算
Group by句「誰ごとにまとめるか」を指定する
Having句グループ化したあとに条件をつける

🧠 おまけ:覚え方(超雑だけど覚える)

  • Group関数 →「全員分の合計や平均、数を計算したい!」

  • Group by →「あ、でも人ごとに分けて計算したい!」

  • Having →「で、その中で条件に合うやつだけ出して!」



前の記事:Oracleデータ移行

次の記事:テーブル結合