カテゴリ: PostgreSQL 更新日: 2026/03/17

PostgreSQL集約関数のNULL完全解説|GROUP BYでNULLはどう扱われるのか初心者向けに説明

PostgreSQLの集約でNULLがどう扱われるか解説
PostgreSQLの集約でNULLがどう扱われるか解説

先生と生徒の会話形式で理解しよう

生徒

「PostgreSQLで集約関数を使うとき、NULLってどうなるんですか?数字じゃないですよね?」

先生

「NULLは『値が入っていない状態』を表します。集約関数では、基本的に数に含めず無視されることが多いです。」

生徒

「無視されるってことは、計算に入らないってことですか?」

先生

「その通りです。紙の名簿で空欄の行を飛ばして数えるイメージで考えると分かりやすいですよ。」

1. SQLとは何か?

1. SQLとは何か?
1. SQLとは何か?

SQLは、データベースという「情報を表の形で整理して保存する箱」に対して命令を出すための言葉です。表は、行と列で構成され、紙の名簿や家計簿と同じ構造をしています。

PostgreSQLは、そのSQLを使って操作できるデータベースで、多くのWebサービスや業務システムで利用されています。

2. NULLとは何かをやさしく理解する

2. NULLとは何かをやさしく理解する
2. NULLとは何かをやさしく理解する

NULLとは、「ゼロ」や「空文字」とは違い、「まだ値が決まっていない」「情報が存在しない」という状態を表します。

たとえば、名簿で電話番号を書いていない人がいた場合、その欄は空白になります。この空白がNULLです。0や空の文字とは意味が違う点がとても重要です。

3. サンプルテーブルでNULLを確認しよう

3. サンプルテーブルでNULLを確認しよう
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の関係

4. COUNTとNULLの関係
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はどうなるのか

5. SUMやAVGで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の扱い

6. MAX・MINと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の関係

7. GROUP BYと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を意識して集約結果を読むコツ

8. NULLを意識して集約結果を読むコツ
8. NULLを意識して集約結果を読むコツ

集約関数はとても便利ですが、NULLの存在を意識しないと「思ったより数が少ない」「平均が違う」と感じることがあります。

表の中に空欄があるかどうかを確認し、NULLは計算から外れるという基本ルールを覚えておくことが大切です。

9. 初心者が混乱しやすいNULLの考え方

9. 初心者が混乱しやすいNULLの考え方
9. 初心者が混乱しやすいNULLの考え方

NULLは「何もない」状態なので、足したり比べたりできません。そのためPostgreSQLは、集約関数の中では安全のために無視します。

名簿やアンケートで未記入欄をどう扱うかを考えると、NULLの動きは自然なものだと理解できます。

カテゴリの一覧へ
新着記事
New1
MySQL
MySQLのLIMIT(OFFSET付き)の使い方を完全解説!SQL初心者でもわかるデータ取得件数の制御方法
New2
PostgreSQL
PostgreSQL集約関数のNULL完全解説|GROUP BYでNULLはどう扱われるのか初心者向けに説明
New3
MySQL
MySQLのLIMITの使い方を完全解説!初心者でも理解できるSQLの取得件数制御(ORDER BY・LIMIT入門)
New4
MySQL
【MySQL入門】LIMITとは何か?SELECT文で取得件数を制限する方法を初心者向けに徹底解説
人気記事
No.1
Java&Spring記事人気No1
PostgreSQL
PostgreSQLのUPDATE文の使い方(部分更新・条件更新)
No.2
Java&Spring記事人気No2
PostgreSQL
PostgreSQLでよく使うデータ型一覧(文字列・数値・日付)
No.3
Java&Spring記事人気No3
PostgreSQL
PostgreSQLでスキーマを分割するメリット
No.4
Java&Spring記事人気No4
PostgreSQL
PostgreSQLのGROUP BY完全入門!初心者でもわかる複数列での集計方法
No.5
Java&Spring記事人気No5
PostgreSQL
PostgreSQLのSERIALとIDENTITYの違いを解説
No.6
Java&Spring記事人気No6
PostgreSQL
PostgreSQLのORDER BYの基本(昇順・降順)
No.7
Java&Spring記事人気No7
PostgreSQL
PostgreSQLスキーマ作成・削除完全ガイド!初心者でもわかるデータベース設計の基礎
No.8
Java&Spring記事人気No8
PostgreSQL
PostgreSQLの主キー・外部キーを完全解説!初心者でもわかる設定方法と考え方