Skip to content
所有文章 ‹ Part 04 of 09 · 一個操作,三種引擎
工程 · 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 核心裡看它的定位。

↑↓ 移動 ↵ 開啟 esc 關閉