CodeGym /課程 /SQL SELF /平均值用 AVG() — 用來計算欄位的平均值

平均值用 AVG() — 用來計算欄位的平均值

SQL SELF
等級 7, 課堂 3
開放

如果你有算過考試的平均分數,或是像算部門的平均薪水,其實你早就懂什麼是算術平均值啦。這東西在學校也常常教。在 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() 會直接報錯。

2
任務
SQL SELF, 等級 7, 課堂 3
上鎖
簡單計算學生的平均年齡
簡單計算學生的平均年齡
2
任務
SQL SELF, 等級 7, 課堂 3
上鎖
計算符合條件的員工平均薪資
計算符合條件的員工平均薪資
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION