COUNT() 函數 (SQL COUNT() Function)

COUNT() 是一個聚合函數 (Aggregate Function),用於計算符合條件的記錄數量。它是 SQL 中最常用的聚合函數之一,常搭配 GROUP BY 進行分組統計。

COUNT() 語法 (Syntax)

SELECT COUNT(column_name) FROM table_name [WHERE condition];

COUNT() 的三種形式

形式說明
COUNT(*)計算所有記錄數,包含 NULL 值
COUNT(column_name)計算指定欄位中非 NULL 值的記錄數
COUNT(DISTINCT column_name)計算指定欄位中不重複且非 NULL 的值的數量

COUNT() 用法範例 (Example)

orders 資料表:

O_IdPriceCustomer
11000張一
22000王二
3500李三
41300張一
51800王二

範例 1:COUNT(column_name) - 計算特定條件的記錄數

查詢「張一」總共有幾筆訂單:

SELECT COUNT(Customer) AS OrderCount
FROM orders
WHERE Customer = '張一';

結果:

OrderCount
2

範例 2:COUNT(*) - 計算資料表總記錄數

查詢 orders 資料表中有多少筆訂單:

SELECT COUNT(*) AS TotalOrders
FROM orders;

結果:

TotalOrders
5

範例 3:COUNT(DISTINCT column_name) - 計算不重複的值

查詢有多少位不同的顧客:

SELECT COUNT(DISTINCT Customer) AS UniqueCustomers
FROM orders;

結果:

UniqueCustomers
3

COUNT(*) vs COUNT(column_name)

這兩種形式的主要差異在於對 NULL 值的處理:

假設有以下資料:

O_IdPriceCustomer
11000張一
2NULL王二
3500NULL
SELECT COUNT(*) AS CountAll,           -- 結果:3 (計算所有記錄)
       COUNT(Price) AS CountPrice,     -- 結果:2 (排除 Price 為 NULL)
       COUNT(Customer) AS CountCustomer -- 結果:2 (排除 Customer 為 NULL)
FROM orders;

COUNT() 搭配 GROUP BY

COUNT() 常與 GROUP BY 一起使用,對每個群組分別計數:

SELECT Customer, COUNT(*) AS OrderCount
FROM orders
GROUP BY Customer;

結果:

CustomerOrderCount
張一2
王二2
李三1

COUNT() 搭配 HAVING

使用 HAVING 篩選分組後的計數結果:

SELECT Customer, COUNT(*) AS OrderCount
FROM orders
GROUP BY Customer
HAVING COUNT(*) > 1;

結果:

CustomerOrderCount
張一2
王二2

COUNT() 搭配 CASE

使用 CASE 進行條件計數:

SELECT
    COUNT(CASE WHEN Price >= 1000 THEN 1 END) AS HighValue,
    COUNT(CASE WHEN Price < 1000 THEN 1 END) AS LowValue
FROM orders;

結果:

HighValueLowValue
41

COUNT() 在子查詢中使用

SELECT Customer
FROM orders
GROUP BY Customer
HAVING COUNT(*) = (
    SELECT MAX(cnt) FROM (
        SELECT COUNT(*) AS cnt FROM orders GROUP BY Customer
    ) AS counts
);

這個查詢找出訂單數量最多的顧客。

COUNT() 的效能考量

  1. COUNT(*) 通常是最快的,因為資料庫可以使用索引或內部優化。
  2. COUNT(column_name) 需要檢查每個值是否為 NULL。
  3. COUNT(DISTINCT column_name) 需要額外的去重操作,效能較低。

💡 提示: 如果只是要計算總記錄數,使用 COUNT(*) 而非 COUNT(column_name)

相關主題