Skip to content
All writing Part 04 of 09 · [object Object]
Engineering · 1 min read

count(*) vs count(欄位):差別就在 NULL

count(*) 會算進含 NULL 的每一列;count(欄位) 只算非 NULL。兩者的差正是缺值的數量——外加用 CASE WHEN 一次數多個條件的技巧。

count() 在 ClickHouse 和 Spark 都能用,是標準的 SQL 命令,用來算 row 數。真正每次卡住的,是它到底算不算 NULL。

count(expr)count(DISTINCT expr)

  • COUNT(*)COUNT(1)
    • * → 所有欄位(whitelist)
    • 包含 NULL
  • COUNT(col)
    • 只算 col 不是 NULL 的 row

兩者的差,就是該欄位缺值的數量,這也是「有多少 sign-up 沒填 email」最直接的算法。

用 CASE WHEN 一次數多個條件

SELECT
    COUNT(CASE WHEN salary > 100000 THEN 1 ELSE NULL END) AS high_earners,
    COUNT(CASE WHEN salary <= 100000 THEN 1 ELSE NULL END) AS standard_earners
FROM employees;
  • 訣竅:COUNT(col) 只在非 NULL 時 +1,所以把不想算的分支寫成 NULL

參考來源

Related: 回到跨引擎資料庫查詢總覽,或在可攜式 SQL 核心裡看它的定位。

Tags #sql #databases
// connect

Be brave | Be wise | Be grateful

21 BreakinCode

// elsewhere
LinkedInMedium (lang: en)Youtube
wh:~$William Hung· © 2026 Taipei · GMT+8 · Available for collaboration