【しゅうやくかんすう】

集約関数(SUM/COUNT/AVG) とは?

最終更新:
💡 行をまとめて、合計・件数・平均を出そう

複数の行の値をまとめて、合計・件数・平均などを求めるSQLの関数。GROUP BYと組み合わせると、商品や部署などのグループごとに集計できる。

📌 このページのポイント
集約関数:行をまとめて計算集計する列100200NULL3行集約計算の結果SUM → 300AVG → 150COUNT(*) → 3COUNT(列) → 2AVG は、値がある 2行で平均GROUP BY ならグループごとに集計NULLは「0」と同じ値ではないよ
値100・200・NULLの3行を集計する例。NULLの扱いは集約関数ごとに異なります。
ひよこ ひよこ
集約関数って、どんな計算をする?
ペンギン先生 ペンギン先生
例えば値が100・200・NULLの3行なら、SUMは300、AVGは150だよ。SUMやAVGはNULLでない値で計算するので、平均の分母も2になる。NULLを0として平均するなら別の計算になるから、知りたい数字を先に決めよう。
ひよこ ひよこ
COUNT(*)とCOUNT(列)も、違う?
ペンギン先生 ペンギン先生
COUNT(*)は行を数えるので、この例は3。COUNT(列)はその列がNULLでない行を数えるので2だよ。「データが何行あるか」と「値が入っている行が何行あるか」を使い分けるんだ。集約関数のすべてがNULLを除くわけではなく、PostgreSQLのarray_aggなどはNULLも集めるよ。
ひよこ ひよこ
商品ごとの売上を出すなら?
ペンギン先生 ペンギン先生
GROUP BYで商品ごとに分けてSUMを使うと、商品ごとに一行の結果になるよ。WHEREは集計に入れる行、HAVINGは集計後のグループを絞るために使う。例えば「売上合計が一定以上の商品」は、合計に対するHAVINGの条件で選べるんだ。
ひよこ ひよこ
集計しない列も、自由に一緒に表示できる?
ペンギン先生 ペンギン先生
各グループで値が決まるようにする必要があるよ。MySQL 8.4はONLY_FULL_GROUP_BYが既定で有効で、GROUP BYの列や、それによって決まる列などを認める。「MySQLなら既定で何でも表示できる」は古い理解だね。対象の行がゼロのときも、COUNTは0でもSUMはNULLになるなど、結果の違いを確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「集約関数」って出てきたら「複数の行をまとめ、合計・件数・平均などを求めるSQLの関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「Aggregate Function」 = 集約する(Aggregate)関数(Function)
💬 Aggregateは「集めてまとめる」という意味。複数のデータを1つに集約するイメージ

参考資料

← 用語集にもどる