如果你有算過考試的平均分數,或是像算部門的平均薪水,其實你早就懂什麼是算術平均值啦。這東西在學校也常常教。在 SQL 裡,只要你想在資料集裡算平均值,直接用 AVG() 這個函數就對了。
AVG() 這個函數是聚合函數,會幫你算數字欄位的算術平均。它會把你指定欄位的所有值加起來,然後除以這些值的數量。它完全不理會 NULL(這點其實還滿方便的,等等會說)。
AVG() 的語法
先來看最基本的語法:
SELECT AVG(欄位)
FROM 資料表;
注意:這裡的 欄位 指的是你想要算平均的數字欄位。
範例 1:員工平均薪水
假設我們有一個 employees 資料表,裡面有員工和他們的薪水:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | 60000 |
| 3 | Alex | 55000 |
| 4 | Anna | NULL |
| 5 | Dan | 52000 |
一個簡單的查詢來算平均薪水:
SELECT AVG(salary) AS average_salary
FROM employees;
結果:
| average_salary |
|---|
| 54250 |
這怎麼算的?
AVG()會把所有薪水加起來:50000 + 60000 + 55000 + 52000 = 217000。- 然後除以不是 NULL 的數量:217000 / 4 = 54250。
AVG() 跟 NULL 的小細節
你應該有發現,算平均薪水時,salary 欄位裡的 NULL 直接被忽略了。這就是 AVG() 的重點:它只算不是 NULL 的值。
來看個例子:
SELECT AVG(NULL) AS result;
結果:
| result |
|---|
| NULL |
這再一次證明 AVG() 會忽略 NULL。但如果整個資料集都是 NULL,那結果就會是 NULL。
但如果欄位裡不是 NULL,而是 0,這個值就會被算進去。
employees 資料表
| id | salary |
|---|---|
| 1 | 1000 |
| 2 | 0 |
| 3 | NULL |
| 4 | 2000 |
SQL 查詢:
SELECT AVG(salary) AS avg_salary
FROM employees;
結果:
| avg_salary |
|---|
| 1000 |
為什麼會這樣?
因為 AVG() 會這樣算:
[(1000 + 0 + 2000) / 3 = 1000]
有 NULL 的那一行直接不算進去。
範例:算學生的平均年齡
來看 students 資料表:
| id | name | age |
|---|---|---|
| 1 | Anna | 20 |
| 2 | Max | 22 |
| 3 | Maria | NULL |
| 4 | Otto | 21 |
查詢:
SELECT AVG(age) AS average_age
FROM students;
結果:
| average_age |
|---|
| 21 |
AVG()會忽略 Maria,因為她的年齡是 NULL。- 平均值是這樣算的:(20 + 22 + 21) / 3 = 21。
四捨五入結果
有時候 AVG() 算出來會有小數點很多位。
如果你想要四捨五入,可以用 ROUND() 這個函數。
employees 資料表
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | NULL |
SQL 查詢
SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;
結果
| rounded_average_salary |
|---|
| 52333.33 |
有 NULL 的那一行不算進去,所以平均是用三個值算的。
計算 AVG() 前先過濾資料
如果你只想算符合某些條件的平均,可以用 WHERE。
employees 資料表
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | 60000 |
| 5 | NULL |
範例:找出 id > 2 的員工平均薪水。
SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;
結果
| average_salary |
|---|
| 53500 |
只有 id = 3 和 id = 4 的薪水會被算進去。NULL 那行還是被排除。
範例:AVG() 的進階查詢
你可以把 AVG() 跟其他聚合函數或運算子一起用。
假設我們有一個銷售資料表 sales:
| sale_id | product | quantity | price |
|---|---|---|---|
| 1 | 手機 | 2 | 500 |
| 2 | 筆電 | 1 | 1500 |
| 3 | 平板 | 3 | 300 |
查詢平均總銷售金額:
SELECT AVG(quantity * price) AS average_total_sale
FROM sales;
結果:
| averagetotalsale |
|---|
| 950 |
實用小技巧跟常見錯誤
用 AVG() 的時候要小心,才不會踩到雷:
NULL 值:有時候你會發現結果比你想像的還低,記得 AVG() 會跳過 NULL 的行。
資料型態混用:如果欄位裡有數字也有文字(這其實很糟),AVG() 會直接報錯。
GO TO FULL VERSION