聚合函式... 這些傢伙在資料分析界根本就是魔法師啦!它們能把幾百萬行的資料變成精簡又一目了然的結果。有了它們,我們可以計算、找最小最大值、算平均,還能做一堆其他操作。現在就讓我們一步步來搞懂吧。
聚合函式 —— 這是 SQL 裡專門針對一群資料列做運算,然後回傳一個單一結果的特殊函式。打個比方,就像你把你早上喝咖啡的所有統計數據都收集起來,比如:你一週喝了幾杯、加沒加糖、連續幾天加了奶精之類的。
聚合函式能解決的問題舉例:
- 計算資料表裡的總筆數。
- 找出數值欄位的最小值或最大值。
- 加總某個欄位的所有值。
- 計算欄位的平均值。
- 挑出唯一值。
這些東西「底層」怎麼運作?
SQL 會在 SELECT 查詢資料後才執行聚合函式。比如你寫 SUM() 或 AVG(),SQL 會先把資料抓出來,然後只針對選中的資料列做運算。
PostgreSQL 裡的主要聚合函式
來點實戰,看看我們的 TOP5 英雄:
COUNT()— 計算資料列數量。SUM()— 加總數值欄位。AVG()— 算平均值。MIN()— 找最小值。MAX()— 找最大值。
聚合函式的使用範例
- 用
COUNT()計算資料列
COUNT() 這個函式可以算出資料表的總筆數,或是某個欄位裡非空值的數量。
舉例:假設我們有一個 students 資料表,裡面存著學生的資訊:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto Art | 20 | 85 |
| 2 | Maria Chi | 22 | 90 |
| 3 | Alex Lin | 21 | 78 |
| 4 | Anna Song | 23 | NULL |
來算算總共有幾個學生:
SELECT
COUNT(*) AS total_students
FROM students;
結果:
| total_students |
|---|
| 4 |
現在來算有填 grade 的學生數:
SELECT
COUNT(grade) AS students_with_grades
FROM students;
結果:
| students_with_grades |
|---|
| 3 |
為什麼會這樣?因為 COUNT(column) 會忽略 NULL 值。
- 用
SUM()加總
SUM() 這個函式就是用來把數值欄位的所有值加起來。
舉例:來看看我們學生總共拿了多少分。
SELECT
SUM(grade) AS total_grades
FROM students;
結果:
| total_grades |
|---|
| 253 |
注意:如果欄位裡有 NULL,加總時會直接忽略掉。
- 用
AVG()算平均值
AVG() 這個函式會把欄位裡所有數值算平均。
舉例:來算學生的平均分數。
SELECT
AVG(grade) AS average_grade
FROM students;
結果:
| average_grade |
|---|
| 84.33 |
你應該有發現,NULL 也一樣會被忽略。
- 用
MIN()和MAX()找最小最大值
有時候我們要找最小或最大的值,這時就用 MIN() 跟 MAX()。
舉例:找出年紀最小和最大的學生。
SELECT
MIN(age) AS youngest_student,
MAX(age) AS oldest_student
FROM students;
結果:
| youngest_student | oldest_student |
|---|---|
| 20 | 23 |
這些函式我們之後還會再深入聊,敬請期待!
NULL 初體驗
關於 NULL 之後會有專門一堂課,不過先簡單說一下,NULL 就是沒有值。啥都沒有,空空的,真的就是個「無」啦!
假設我們有一個 students 資料表,裡面存著學生的資訊:
| id | name | age | grade | hobbie |
|---|---|---|---|---|
| 1 | Otto Art | 20 | 85 | |
| 2 | Maria Chi | 22 | 90 | 跳舞 |
| 3 | Alex Lin | 21 | 78 | |
| 4 | Anna Song | 23 |
名字和年齡一定有,但分數和興趣可能會沒有。如果資料表的某格完全沒填東西,就會說它 包含 NULL。NULL 不是數字也不是字串,它是一個特殊的代碼,代表啥都沒有。
GO TO FULL VERSION