COUNT() 這個函數是 SQL 裡面最熱門、最實用的聚合函數之一。它的主要任務就是計算查詢結果裡有幾行。如果 COUNT() 是 SQL 世界的超級英雄,那它的超能力就是能夠超快回答像這樣的問題:
- 公司裡有多少員工?
- 每個學院有多少學生?
- 上個月賣了多少商品?
COUNT() 的語法超簡單:
COUNT(欄位)
這裡的 欄位 就是你要計算的那個欄位名稱。不過其實還有其他用法,等等我們會在課程裡一起看。
我們先從最基本的 COUNT() 用法開始吧。
用法 1:用 COUNT(*) 計算所有行
如果你想要計算資料表裡的每一行,不管裡面有沒有資料,就用 COUNT(*)。星號的意思就是「所有欄位」。
舉個例子:我們有一個 students 資料表,內容如下:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
執行這個查詢:
SELECT COUNT(*)
FROM students;
結果:
| count |
|---|
| 4 |
COUNT(*) 不會管某些欄位是不是 NULL,它就是單純計算資料表裡有幾行。
用法 2:用 COUNT(column) 計算有值的行
那如果你只想計算某個欄位不是 NULL 的行呢?這時候就用 COUNT(column)。
舉例:來算一下有填名字的學生有幾個。
SELECT COUNT(name)
FROM students;
結果:
| count |
|---|
| 3 |
有沒有發現差別?資料表有 4 行,但有一行的 name 欄位是 NULL。COUNT(column) 只會算那些欄位不是 NULL 的行。
COUNT(*) 跟 COUNT(column) 的比較
所以這兩種用法到底差在哪?COUNT(*) 跟 COUNT(column) 的差異如下:
COUNT(*)會計算資料表裡 所有行,不管有沒有NULL。COUNT(column)只會算指定欄位 不是 NULL 的行。
舉個例子:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
查詢:
-- 會算所有行
SELECT COUNT(*) FROM students; -- 4 -- TOTAL (所有行)
-- 只算名字不是 NULL 的行
SELECT COUNT(name) FROM students; -- 3 -- 算有名字的行
-- 只算年齡不是 NULL 的行
SELECT COUNT(age) FROM students; -- 3 -- 算有年齡的行
用法 3:用 COUNT(DISTINCT column) 計算唯一值
有時候你只想知道某個欄位裡有幾個不一樣的值。比如說,想知道學生的年齡有幾種。這時就用 COUNT(DISTINCT column)。
舉例:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
結果:
| count |
|---|
| 3 |
注意,這裡 DISTINCT 不只會忽略重複值,也會忽略 NULL。
如果你想把 DISTINCT 跟 COUNT(*) 一起用,會出錯:DISTINCT 只能用在指定欄位上。
COUNT() 在實際問題裡的用法範例
範例 1. 計算學生人數
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
結果:
| total_students |
|---|
| 4 |
範例 2. 計算有年齡資料的學生
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
結果:
| students_with_age |
|---|
| 3 |
範例 3. 計算不同年齡數量
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
結果:
| unique_ages |
|---|
| 2 |
用 COUNT() 時常見的錯誤
以為 COUNT(column) 會算所有行,即使有 NULL。
其實不是這樣:COUNT(column) 會忽略指定欄位是 NULL 的行。
用 COUNT(*) 來算唯一值。
這樣不對,要用 COUNT(DISTINCT column) 才對。
計算有篩選條件的資料時忘記加條件。
例如:
SELECT COUNT(*) FROM students WHERE age > 20;
這樣你只會拿到年齡大於 20 歲的學生數,WHERE 會先把資料篩掉再計算。
這些小細節很容易讓查詢出現邏輯錯誤,大家要多注意喔!
GO TO FULL VERSION