摘要:在本教程中,您將學習如何使用 SQL AVG 函式來計算一組值的平均值。
SQL AVG 函式簡介 #
AVG 函式是一個聚合函式,用於計算一個集合的平均值。
以下是 AVG 函式的語法
AVG([ALL|DISTINCT] expression)Code language: SQL (Structured Query Language) (sql)如果您使用 ALL 關鍵字,AVG 函式會計算所有值的平均值,包括重複值。如果您使用 DISTINCT 關鍵字,AVG 函式會計算不同值的平均值。AVG 函式預設使用 ALL。
假設您使用 AVG() 函式來計算集合 (1, 2, 3, 3, 4) 的平均值,AVG 函式將執行以下計算
(1+2+3+3+4)/5 = 2.6Code language: SQL (Structured Query Language) (sql)然而,AVG(DISTINCT) 將計算不同值的平均值
(1+2+3+4)/4 = 2.5Code language: SQL (Structured Query Language) (sql)SQL AVG 函式示例 #
我們將使用示例資料庫中的 employees 表來演示 AVG 函式的工作原理

要計算所有員工的平均工資,您可以將 AVG 函式應用於 salary 列,如下所示
SELECT
AVG(salary) average_salary
FROM
employees;Code language: SQL (Structured Query Language) (sql) average_salary
-----------------------
8060.0000000000000000Code language: CSS (css)讓我們應用 DISTINCT 運算子看看結果是否會改變
SELECT
ROUND(AVG(DISTINCT salary), 2) average_salary
FROM
employees;Code language: SQL (Structured Query Language) (sql)輸出
average_salary
----------------
7845.45Code language: CSS (css)結果改變了,因為有些員工的薪水相同。
要將結果四捨五入到小數點後兩位,您可以使用 ROUND 函式,如下所示
SELECT
ROUND(AVG(DISTINCT salary), 2) average_salary
FROM
employees;Code language: SQL (Structured Query Language) (sql) average_salary
----------------
7845.45Code language: CSS (css)要計算一個值子集的平均值,我們在 SELECT 語句中新增一個 WHERE 子句。
例如,要計算部門 ID 為 5 的員工的平均工資,您可以使用以下查詢
SELECT
ROUND(AVG(salary), 2) average_salary
FROM
employees
WHERE
department_id = 5;Code language: SQL (Structured Query Language) (sql) average_salary
----------------
5885.71Code language: CSS (css)以下語句返回職位 ID 為 6 的員工的平均工資
SELECT
ROUND(AVG(salary), 2) average_salary
FROM
employees
WHERE
job_id = 6;Code language: SQL (Structured Query Language) (sql) average_salary
----------------
7920.00
(1 row)Code language: CSS (css)將 AVG 函式與 GROUP BY 子句結合使用的示例 #
要計算分組的平均值,我們將 AVG 函式與 GROUP BY 子句一起使用。
例如,以下語句返回各部門及其員工的平均工資
SELECT
department_id,
ROUND(AVG(salary), 2) average_salary
FROM
employees
GROUP BY
department_id
ORDER BY
average_salary;Code language: SQL (Structured Query Language) (sql) department_id | average_salary
---------------+----------------
3 | 4150.00
1 | 4400.00
6 | 5760.00
5 | 5885.71
4 | 6500.00
10 | 8600.00
2 | 9500.00
8 | 9616.67
7 | 10000.00
11 | 10150.00
9 | 19333.33我們可以使用 inner join 子句將 employees 表與 departments 表連線起來,以獲取部門名稱資料
SELECT
department_name,
ROUND(AVG(salary), 2) average_salary
FROM
employees e
INNER JOIN departments d ON d.department_id = e.department_id
GROUP BY
department_name
ORDER BY
average_salary;Code language: SQL (Structured Query Language) (sql) department_name | average_salary
------------------+----------------
Purchasing | 4150.00
Administration | 4400.00
IT | 5760.00
Shipping | 5885.71
Human Resources | 6500.00
Finance | 8600.00
Marketing | 9500.00
Sales | 9616.67
Public Relations | 10000.00
Accounting | 10150.00
Executive | 19333.33Code language: PHP (php)將 AVG 函式與 HAVING 子句結合使用的示例 #
要篩選分組,您可以在 HAVING 子句中使用 AVG 函式。
例如,以下語句檢索平均工資低於 5000 的部門
SELECT
department_name,
ROUND(AVG(salary), 2) average_salary
FROM
employees e
INNER JOIN departments d ON d.department_id = e.department_id
GROUP BY
department_name
HAVING AVG(salary) < 5000
ORDER BY
average_salary DESC; department_name | average_salary
-----------------+----------------
Administration | 4400.00
Purchasing | 4150.00在子查詢中使用 SQL AVG 函式 #
您可以在單個 SQL 語句中多次應用 AVG 函式,以計算一組平均值的平均值。
例如,我們可以使用 AVG 函式計算每個部門員工的平均工資,然後再次應用 AVG 函式來計算各部門的平均工資
SELECT
ROUND(AVG(average_salary_department), 2) average_salary
FROM
(
SELECT
AVG(salary) average_salary_department
FROM
employees
GROUP BY
department_id
) t;Code language: SQL (Structured Query Language) (sql) average_salary
----------------
8535.97Code language: CSS (css)查詢工作原理:
- 子查詢返回每個部門員工的平均工資集合。
- 外部查詢返回各部門的平均工資。
摘要 #
- 使用
AVG函式計算一個集合的平均值。 - 將
AVG函式與GROUP BY子句結合使用,以計算每個分組的平均值。