SQL を学び始めると、集約関数(COUNT, SUM, AVG, MIN, MAX など)でつまずきがちなポイントに「NULL があるとどうなるの?」という疑問があります。今回は、代表的な集約関数が NULL をどう扱うかをサクッと整理します。
前提:NULLとは?
- SQL における NULL は「値が存在しない」または「値が不明である」ことを意味します
- 文字列や数値の「空っぽ」とは違います
- 比較演算子(=, <> など)で比較しても真偽が分からず、基本的に結果は NULL になります
例えば 1 + NULL の値は NULL です。なぜなら値がわからないもの(NULL)に 1 を足しても、結果は分からない(NULL)からです。
このように、NULL を含む計算は結果が直感的ではないことがあり、取り扱いには注意が必要です。
この記事では、特に集約関数で NULL を扱うとどうなるかを説明します。
テスト用テーブル
DB-Fiddle に今回使うクエリを記載しておきます。
CREATE TABLE items (
id INTEGER,
price INTEGER
);
INSERT INTO items (id, price) VALUES
(1, 100),
(2, 200),
(3, NULL);
NULL と各種集約関数
COUNT
SELECT
COUNT(*), -- 3
COUNT(price) -- 2
FROM items;
-
COUNT(*)
は 行数をそのまま数える → 結果は 3 -
COUNT(column名)
は NULL を含まないカラム値を数える → price の NULL は無視される → 結果は 2
SUM/AVG
SELECT
SUM(price), -- 300
AVG(price) -- 150
FROM items;
- SUM(price) は NULL を無視し、(100 + 200) = 300
- AVG(price) は (100 + 200) / 2 = 150
- NULL 行は計算の分母や分子に含まれない
MIN / MAX
SELECT
MIN(price), -- 100
MAX(price) -- 200
FROM items;
- MIN(price) は最小の実際の値 → 100
- MAX(price) は最大の実際の値 → 200
- どちらも NULL は候補から除外
NULL を含めたい場合は?
集約関数の多くは NULL を「ないもの」として扱います。
NULL を考慮した計算のためには COUNT や CASE 式、COALESCE 関数などを組み合わせて、明示的に処理する必要があります。
SELECT
COUNT(*), -- 行数
SUM(CASE WHEN price IS NULL THEN 1 ELSE 0 END), -- NULL の数
AVG(COALESCE(price, 0)) -- NULL を 0 とした平均値
FROM items;
まとめ
-
COUNT(*)
とCOUNT(column名)
は 「NULL を数えるか」が大きく違う - SUM, AVG, MIN, MAX は NULL の行を無視して計算
- NULL の行を扱いたいときは CASE や COALESCE を活用したり、IS NULL で明示的に処理を分ける
NULL の扱いをきちんと理解しておくと、集計結果の解釈ミスを減らせます。ぜひ日々のデータ分析や学習で役立ててください。
ここまで読んで頂きありがとうございました!