【しゅうやくかんすう】

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

💡 複数行のデータを「まとめて1つの値」にする関数たち
📌 このページのポイント
集約関数:複数行 → 1つの結果 商品 売上 りんご 100 バナナ 200 みかん 150 りんご 300 バナナ 250 SUM(売上) 1000 COUNT(*) 5 AVG(売上) 200 MAX(売上) 300 MIN(売上) 100 複数行のデータを1つの値に集約する関数
集約関数のイメージ
ひよこ ひよこ

集約関数って具体的にどう使うの?

ペンギン先生 ペンギン先生

例えば「SELECT COUNT(*) FROM users」で全ユーザー数、「SELECT SUM(price) FROM orders」で売上合計、「SELECT AVG(age) FROM users」で平均年齢が出せる。複数行のデータを1つの数値にまとめてくれるよ。

ひよこ ひよこ

COUNT(*)とCOUNT(カラム名)って違うの?

ペンギン先生 ペンギン先生

COUNT(*)はNULLを含む全行を数える。COUNT(email)だとemailがNULLの行は数えない。「ユーザーの総数」ならCOUNT(*)、「メールアドレスを登録しているユーザー数」ならCOUNT(email)、という使い分けをするよ。

ひよこ ひよこ

AVGを使うときにNULLがあるとどうなるの?

ペンギン先生 ペンギン先生

NULLの行は計算から除外される。例えば5人のうち2人のageがNULLなら、3人の平均が計算される。「NULLを0として計算してほしい」場合は「AVG(COALESCE(age, 0))」のように明示的にNULLを0に変換する必要がある。

ひよこ ひよこ

集約関数ってSELECTに普通のカラムと一緒に書けるの?

ペンギン先生 ペンギン先生

これが初心者がよくハマるポイント。「SELECT name, COUNT(*) FROM users」のように集約関数と普通のカラムを混ぜて書くとエラーになる(MySQLの一部設定を除く)。集約していないカラムGROUP BYに書くか、集約関数で囲む必要がある。MySQLデフォルトでエラーにならないことがあって、そのせいで意図しない結果が返ってくる場合もあるから、ONLY_FULL_GROUP_BYモードを有効にしておくのが安全なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
集約関数って出てきたら「複数行のデータをまとめて合計・件数・平均などの1つの値にする関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「Aggregate Function」 = 集約する(Aggregate)関数(Function)
💬 Aggregateは「集めてまとめる」という意味。複数のデータを1つに集約するイメージ
← 用語集にもどる