🔖

【SQL】COUNT(*) と COUNT(column) の違いとは?NULLを含む集計の注意点を解説

に公開

はじめに

SQLでデータを集計する際には、COUNTAVG などの集計関数を使うことが一般的です。

ただし、NULLが含まれる場合には、思わぬ結果になることもあるため注意が必要です。

特に COUNT(*)COUNT(column) の違いや、AVG(column) の計算方法は、
つまずきやすいポイントのひとつです。

本記事では、NULLと集計関数の関係を整理します。

COUNT(*)COUNT(column) の違い

書き方 カウントされる条件
COUNT(*) NULLを含むすべての行
COUNT(column) columnがNULLでない行だけ

users テーブルに対する実行例

id name email
1 山田 太郎 taro@example.com
2 佐藤 花子 hanako@example.com
3 鈴木 次郎 NULL
4 高橋 明子 akiko@example.com
5 伊藤 三郎 NULL
6 渡辺 由美 yumi@example.com

このデータに対して、次のクエリを実行します。

SELECT COUNT(*) AS total, COUNT(email) AS email_count
FROM users;

クエリ結果

total email_count
6 4

全体で6件、そのうち emailNULL でない行が4件ある、ということがわかります。

このように、COUNT(*) は全行を数えるのに対し、
COUNT(email)NULL 以外の値だけを数える点に注意が必要です。

AVG(column)NULLは無視される

AVG(column)COUNT(column) と同様、NULLは計算対象外になります

SELECT AVG(score) FROM exams;
  • scoreNULL の行は 平均値の計算に含まれません
  • NULL を除いたスコアの合計 ÷ 件数 で算出されます

exams テーブルに対する実行例

id student_name score
1 山田 太郎 80
2 佐藤 花子 90
3 鈴木 次郎 NULL
4 高橋 明子 70
5 伊藤 三郎 NULL
6 渡辺 由美 60

このデータに対して、次のクエリを実行します。

SELECT AVG(score) AS average_score FROM exams;

クエリ結果

average_score
75.0

上の例では、NULL でないスコアが 80, 90, 70, 60 の4件あります。
そのため AVG(score) は (80 + 90 + 70 + 60) ÷ 4 = 75.0 になります。

NULLを含めて集計したい場合

もしNULLも含めて平均値を計算したい場合は、
COALESCECASE WHENを使ってNULLを特定の値(例:0)に置き換えます。

COALESCEを使った場合

-- `NULL`を0として扱って平均値を計算
SELECT AVG(COALESCE(score, 0)) AS average_with_null
FROM exams;

CASE WHENを使った場合

-- `NULL`を0として扱って平均値を計算
SELECT AVG(
  CASE 
    WHEN score IS NULL THEN 0 
    ELSE score 
  END
) AS average_with_null
FROM exams;

比較結果:

average_with_null
50.0

→ 4件のスコア(80 + 90 + 70 + 60)と、2件の NULL(0として扱う)を合計し、6で割った結果です。

このように、NULLを特定の値に置き換えることで、
集計結果をカスタマイズすることも可能です。

ただし、NULLを0に置き換えるかどうかはケースバイケースなので、用途に応じて判断しましょう。

おわりに

COUNTAVGは、NULLの扱い方によって結果が変わるため、注意が必要です。

特に COUNT(*)COUNT(column) の違いは、混同されやすいポイントのひとつです。

本記事が正確な集計処理の理解に役立てば幸いです。

Discussion