1. MySQL COUNT 函式概述
在 MySQL 中,COUNT
函式是一個非常實用的工具,用來取得符合指定欄位或條件的資料筆數。透過這個函式,可以輕鬆計算資料庫中某些特定紀錄的數量。例如,可以計算全部紀錄的數量,或是根據特定條件來計算符合的紀錄數。
COUNT()
函式的基本語法
基本的 COUNT
用法如下:
SELECT COUNT(*) FROM table_name;
這個查詢會計算指定資料表中的所有紀錄數。如果只想計算特定欄位的資料數,可以這樣寫:
SELECT COUNT(column_name) FROM table_name;
在這種情況下,如果指定的欄位中包含 NULL
值,那些 NULL
將會被忽略,不會被計算在內。
忽略 NULL 值的範例
例如,如果 age
欄位儲存使用者年齡,並且其中包含 NULL
值,可以使用以下查詢來排除 NULL
:
SELECT COUNT(age) FROM users WHERE age IS NOT NULL;
這個查詢只會計算 age
欄位中非 NULL
的值。

2. COUNT 搭配 DISTINCT 的用法
在資料庫中,經常會出現相同的值被重複儲存的情況。這時可以將 DISTINCT
與 COUNT
結合使用,來取得不重複的唯一值數量。DISTINCT
會從結果集中排除重複的資料後再進行計算。
COUNT
搭配 DISTINCT
的範例
以下查詢會計算 name
欄位中不重複的名稱數量:
SELECT COUNT(DISTINCT name) FROM users;
例如,即使 users
資料表中有多筆 “taro”,也只會被計算一次。
3. 使用 WHERE 條件的計數
COUNT
函式可以與 WHERE
條件結合,只計算符合特定條件的紀錄數。這在需要取得符合某些條件的資料時非常有用。
指定條件的計數範例
以下查詢會計算年齡大於等於 25 歲的使用者數量:
SELECT COUNT(*) FROM users WHERE age >= 25;
這個查詢會回傳 users
資料表中,age
欄位大於等於 25 的筆數。
COUNT
的進階應用
同樣可以結合多個條件來計算。例如,要計算 age
大於等於 25 且 gender
為 ‘Male’ 的使用者數:
SELECT COUNT(*) FROM users WHERE age >= 25 AND gender = 'Male';
這個查詢會回傳符合多個條件的資料數。

4. 使用 GROUP BY 進行分組計數
透過 GROUP BY
可以依據特定欄位進行分組,並對每個群組分別計算筆數。這在需要統計例如各部門人數時非常實用。
GROUP BY
與 COUNT
的範例
以下查詢會計算每個部門的人數:
SELECT department, COUNT(*) FROM employees GROUP BY department;
結果會回傳各部門的人數,GROUP BY
會依 department
欄位分組,再對每組資料計算筆數。
5. 使用 IF 條件的計數
COUNT
可以搭配 IF
條件來進行更靈活的計算。例如,根據不同條件來設定計數方式:
IF
條件計數範例
以下查詢會計算薪資超過 50,000 的員工數:
SELECT COUNT(IF(salary > 50000, 1, NULL)) FROM employees;
這個查詢只會計算 salary
大於 50,000 的紀錄。IF
條件會在符合時回傳 1,不符合時回傳 NULL
。
6. COUNT 函式的實務應用
COUNT
在日常的資料庫管理中非常常見,例如用於統計使用者數或銷售紀錄數,來確保資料正確性。
應用範例1:計算使用者註冊數
網站管理者通常需要知道目前的註冊用戶數,可以使用以下查詢:
SELECT COUNT(*) FROM users;
這會回傳 users
資料表中的總筆數,也就是目前的註冊人數。
應用範例2:計算銷售資料
若要知道某商品的銷售次數,可以使用以下查詢:
SELECT COUNT(*) FROM sales WHERE product_id = 123;
這個查詢會計算 product_id
為 123 的銷售紀錄數。

7. COUNT 函式常見問題與排解
在使用 COUNT
時,可能會遇到處理 NULL
或重複資料的問題。為避免這些狀況,需要了解一些解決方法。
NULL 資料的問題與解決方式
當使用 COUNT(column_name)
時,NULL
值不會被計算。如果要計算所有紀錄,建議使用 COUNT(*)
。若要排除 NULL
,可以加上 IS NOT NULL
條件:
SELECT COUNT(column_name) FROM table_name WHERE column_name IS NOT NULL;