摘要:本教學將示範如何使用 SQL AVG 函數取得集合的平均值。
SQL AVG 函數簡介
SQL AVG 函數是一個彙總函數,用於計算集合的平均值。以下說明 SQL AVG 函數的語法:
AVG([ALL|DISTINCT] expression)
Code language: SQL (Structured Query Language) (sql)
如果我們使用 ALL 關鍵字,AVG 函數會將所有值納入計算。預設情況下,無論是否指定,AVG 函數都會使用 ALL。
如果我們明確指定 DISTINCT 關鍵字,AVG 函數只會將唯一值納入計算。
例如,如果我們有一個集合 (1,2,3,3,4),並對此集合應用 AVG(ALL),AVG 函數將執行以下計算:
(1+2+3+3+4)/5 = 2.6
Code language: SQL (Structured Query Language) (sql)
然而,AVG(DISTINCT) 將會如下處理:
(1+2+3+4)/4 = 2.5
Code language: SQL (Structured Query Language) (sql)
SQL AVG 函數範例
我們將使用範例資料庫中的 employees
表格來示範 SQL AVG 函數的運作方式。下圖說明了 employees
表格的結構:

若要計算所有員工的平均薪資,您可以將 AVG 函數應用於薪資欄位,如下所示:
SELECT
AVG(salary)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

讓我們應用 DISTINCT 運算子來看看結果是否會改變:
SELECT
AVG(DISTINCT salary)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

結果改變了,因為有些員工的薪資相同。
若要將結果四捨五入到小數點後兩位,您可以使用 ROUND 函數,如下所示:
SELECT
ROUND(AVG(DISTINCT salary), 2)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

若要計算數值子集的平均值,我們可以在 SELECT 語句中加入 WHERE 子句。例如,若要計算部門 ID 為 5 的員工的平均薪資,我們可以使用以下查詢:
SELECT
AVG(DISTINCT salary)
FROM
employees
WHERE
department_id = 5;
Code language: SQL (Structured Query Language) (sql)

以下語句會傳回職位 ID 為 6 的員工的平均薪資:
SELECT
AVG(salary)
FROM
employees
WHERE
job_id = 6;
Code language: SQL (Structured Query Language) (sql)

搭配 GROUP BY 子句的 SQL AVG 範例
若要計算群組的平均值,我們將 AVG 函數與 GROUP BY 子句一起使用。例如,以下語句會傳回各部門及其員工的平均薪資:
SELECT
department_id,
AVG(salary)
FROM
employees
GROUP BY
department_id;
Code language: SQL (Structured Query Language) (sql)

我們可以使用 inner join 子句將 employees
表格與 departments
表格連接,以取得部門名稱資料:
SELECT
e.department_id,
department_name,
AVG(salary)
FROM
employees e
INNER JOIN departments d ON d.department_id = e.department_id
GROUP BY
e.department_id;
Code language: SQL (Structured Query Language) (sql)

搭配 ORDER BY 子句的 SQL AVG 範例
若要排序包含 AVG 結果的結果集,您可以在 ORDER BY 子句中使用 AVG 函數,如下所示:
SELECT e.department_id, department_name, AVG(salary) FROM employees e INNER JOIN departments d ON d.department_id = e.department_id GROUP BY e.department_id ORDER BY AVG(salary) DESC;

搭配 HAVING 子句的 SQL AVG 範例
若要篩選群組,您可以在 HAVING 子句中使用 AVG 函數。例如,以下語句會取得平均薪資低於 5000 的部門:

搭配子查詢的 SQL AVG
我們可以在單一 SQL 語句中多次應用 AVG 函數,以計算平均值的集合的平均值。
例如,我們可以使用 AVG 函數來計算每個部門的員工平均薪資,然後再應用一次 AVG 函數來計算各部門的平均薪資。
以下查詢說明了這個概念:
SELECT
AVG(employee_sal_avg)
FROM
(
SELECT
AVG(salary) employee_sal_avg
FROM
employees
GROUP BY
department_id
) t;
Code language: SQL (Structured Query Language) (sql)
查詢如何運作。
- 子查詢會傳回每個部門的員工平均薪資集合。
- 外部查詢會傳回部門的平均薪資。
在本教學中,您已學習如何使用 SQL AVG 函數來計算集合的平均值。