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_Id | Price | Customer |
|---|---|---|
| 1 | 1000 | 張一 |
| 2 | 2000 | 王二 |
| 3 | 500 | 李三 |
| 4 | 1300 | 張一 |
| 5 | 1800 | 王二 |
範例 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_Id | Price | Customer |
|---|---|---|
| 1 | 1000 | 張一 |
| 2 | NULL | 王二 |
| 3 | 500 | NULL |
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;
結果:
| Customer | OrderCount |
|---|---|
| 張一 | 2 |
| 王二 | 2 |
| 李三 | 1 |
COUNT() 搭配 HAVING
使用 HAVING 篩選分組後的計數結果:
SELECT Customer, COUNT(*) AS OrderCount
FROM orders
GROUP BY Customer
HAVING COUNT(*) > 1;
結果:
| Customer | OrderCount |
|---|---|
| 張一 | 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;
結果:
| HighValue | LowValue |
|---|---|
| 4 | 1 |
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() 的效能考量
COUNT(*)通常是最快的,因為資料庫可以使用索引或內部優化。COUNT(column_name)需要檢查每個值是否為 NULL。COUNT(DISTINCT column_name)需要額外的去重操作,效能較低。
💡 提示: 如果只是要計算總記錄數,使用
COUNT(*)而非COUNT(column_name)。