0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQL 集約関数の NULL 取り扱いまとめ

Posted at

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 の扱いをきちんと理解しておくと、集計結果の解釈ミスを減らせます。ぜひ日々のデータ分析や学習で役立ててください。

ここまで読んで頂きありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?