PostgreSQL集約関数のNULL完全解説|GROUP BYでNULLはどう扱われるのか初心者向けに説明
生徒
「PostgreSQLで集約関数を使うとき、NULLってどうなるんですか?数字じゃないですよね?」
先生
「NULLは『値が入っていない状態』を表します。集約関数では、基本的に数に含めず無視されることが多いです。」
生徒
「無視されるってことは、計算に入らないってことですか?」
先生
「その通りです。紙の名簿で空欄の行を飛ばして数えるイメージで考えると分かりやすいですよ。」
1. SQLとは何か?
SQLは、データベースという「情報を表の形で整理して保存する箱」に対して命令を出すための言葉です。表は、行と列で構成され、紙の名簿や家計簿と同じ構造をしています。
PostgreSQLは、そのSQLを使って操作できるデータベースで、多くのWebサービスや業務システムで利用されています。
2. NULLとは何かをやさしく理解する
NULLとは、「ゼロ」や「空文字」とは違い、「まだ値が決まっていない」「情報が存在しない」という状態を表します。
たとえば、名簿で電話番号を書いていない人がいた場合、その欄は空白になります。この空白がNULLです。0や空の文字とは意味が違う点がとても重要です。
3. サンプルテーブルでNULLを確認しよう
次の表では、年齢が未入力の人がいます。この状態がNULLです。
id | name | age | email
---+------------+------+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | NULL | ichiro@example.com
4 | 高橋次郎 | 30 | jiro@example.com
鈴木一郎さんの年齢がNULLになっています。これは「年齢が0」なのではなく、「年齢が分からない」という意味です。
4. COUNTとNULLの関係
集約関数のCOUNTは、NULLの扱いが分かりやすい例です。COUNT(*)は行の数を数え、COUNT(列名)はNULLを除外して数えます。
SELECT COUNT(*) FROM users;
count
-----
4
SELECT COUNT(age) FROM users;
count
-----
3
COUNT(age)では、ageがNULLの行は数えられていません。空欄の行を飛ばして数えている状態です。
5. SUMやAVGでNULLはどうなるのか
SUMやAVGでも、NULLは自動的に無視されます。計算できない値は、計算に入れないという考え方です。
SELECT SUM(age) FROM users;
sum
----
74
SELECT AVG(age) FROM users;
avg
-----
24.6667
NULLの年齢は合計や平均に含まれていません。紙のテスト結果で、欠席者を平均点の計算から外すのと同じ考え方です。
6. MAX・MINとNULLの扱い
MAXやMINでも、NULLは無視されます。最大値や最小値を探すとき、比較できない値は対象外になります。
SELECT MAX(age), MIN(age)
FROM users;
max | min
----+----
30 | 19
NULLがあっても、正しく最大値と最小値が取得できます。NULLが邪魔をすることはありません。
7. GROUP BYとNULLの関係
GROUP BYでグループ化する場合、NULLは「NULL同士」でひとつのグループとして扱われます。
SELECT age, COUNT(*)
FROM users
GROUP BY age;
age | count
-----+------
19 | 1
25 | 1
30 | 1
NULL | 1
年齢がNULLの行も、ひとつのグループとして集計されます。この動きは初心者がつまずきやすいポイントです。
8. NULLを意識して集約結果を読むコツ
集約関数はとても便利ですが、NULLの存在を意識しないと「思ったより数が少ない」「平均が違う」と感じることがあります。
表の中に空欄があるかどうかを確認し、NULLは計算から外れるという基本ルールを覚えておくことが大切です。
9. 初心者が混乱しやすいNULLの考え方
NULLは「何もない」状態なので、足したり比べたりできません。そのためPostgreSQLは、集約関数の中では安全のために無視します。
名簿やアンケートで未記入欄をどう扱うかを考えると、NULLの動きは自然なものだと理解できます。