CodeGym /課程 /SQL SELF /COUNT() 計算行數及其變體

COUNT() 計算行數及其變體

SQL SELF
等級 7 , 課堂 1
開放

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 欄位是 NULLCOUNT(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

如果你想把 DISTINCTCOUNT(*) 一起用,會出錯: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 會先把資料篩掉再計算。

這些小細節很容易讓查詢出現邏輯錯誤,大家要多注意喔!

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION