PostgreSQLのSUM・AVG完全解説|集約関数とGROUP BYの計算時の注意点を初心者向けにやさしく説明
生徒
「PostgreSQLでSUMとかAVGって聞いたんですが、何をするものなんですか?」
先生
「SUMは合計、AVGは平均を計算するための命令です。たとえば家計簿で、今月の出費の合計や、1日あたりの平均支出を出すようなイメージですね。」
生徒
「計算するだけなら簡単そうですが、注意点があるんですか?」
先生
「あります。数字じゃないデータが混ざっていたり、何も入っていない値があると、思った結果にならないことがあるんです。そこを一つずつ説明していきます。」
1. PostgreSQLのSUMとAVGとは何か
PostgreSQLのSUMとAVGは、集約関数(しゅうやくかんすう)と呼ばれる種類のSQLです。集約関数とは、たくさんのデータを一つにまとめて計算するための命令です。
SUMは「合計」を出します。AVGは「平均」を出します。電卓で足し算や割り算をする代わりに、データベースが自動で計算してくれると考えると分かりやすいです。
2. サンプルテーブルで考えてみよう
まずは、売上を管理するテーブルを例に考えてみます。数字は売上金額を表しています。
id | name | price
---+------------+-------
1 | りんご | 100
2 | みかん | 80
3 | バナナ | 120
4 | ぶどう | 200
このような表がデータベースに保存されているとします。紙の表を想像しながら読み進めてください。
3. SUMで合計を計算するときの基本
SUMを使うと、price列の合計金額を一気に計算できます。
SELECT SUM(price)
FROM items;
sum
-----
500
100円、80円、120円、200円をすべて足して、500円という結果になります。人が計算するとミスしがちですが、SQLなら一瞬です。
4. AVGで平均を出すときの注意点
AVGは平均を計算しますが、ここで一つ注意があります。平均は「合計 ÷ 件数」で計算されます。
SELECT AVG(price)
FROM items;
avg
-----
125
合計500円を4件で割って、125円になります。ここまではとても分かりやすいですね。
5. NULLがある場合のSUMとAVGの動き
データベースには、まだ値が入っていない状態を表すNULL(ヌル)という特別な値があります。空白とは違い、「何も決まっていない」という意味です。
id | name | price
---+------------+-------
1 | りんご | 100
2 | みかん | NULL
3 | バナナ | 120
4 | ぶどう | 200
この場合でもSUMとAVGを実行してみます。
SELECT SUM(price), AVG(price)
FROM items;
sum | avg
----+-----
420 | 140
NULLは計算から自動的に除外されます。みかんの価格は無視され、3件で計算される点が重要です。
6. 数字以外の列を使うとエラーになる理由
SUMやAVGは数字を計算する命令です。文字が入った列に対して使うと、計算できずにエラーになります。
SELECT SUM(name)
FROM items;
これは、文字を足し算できないのと同じです。家計簿で「りんご+みかん」と書いても金額にならないのと同じだと覚えてください。
7. GROUP BYと一緒に使うときの注意点
GROUP BYは、データをグループごとに分けて計算するための命令です。カテゴリ別の合計などを出すときに使います。
id | category | price
---+----------+-------
1 | 果物 | 100
2 | 果物 | 80
3 | 野菜 | 150
4 | 野菜 | 200
SELECT category, SUM(price)
FROM items
GROUP BY category;
category | sum
---------+-----
果物 | 180
野菜 | 350
GROUP BYを使う場合、SELECTに書ける列にはルールがあります。計算しない列は、必ずGROUP BYに書く必要があります。
8. 小数点と整数のAVGに注意しよう
AVGの結果は小数になることがあります。PostgreSQLでは、列の型によって結果が変わることがあります。
SELECT AVG(age)
FROM users;
年齢のように整数でも、平均は小数になる可能性があります。小数が出るのは間違いではなく、正しい計算結果です。
9. SUMとAVGを安全に使うための考え方
SUMやAVGを使うときは、「どんなデータが入っているか」を必ず意識することが大切です。NULLがあるか、数字だけか、グループ分けが必要かを事前に確認しましょう。
これは、料理を作る前に材料を確認するのと同じです。中身を知らずに計算すると、思った結果にならない原因になります。