SQL AVG

摘要:本教學將示範如何使用 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.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 表格來示範 SQL AVG 函數的運作方式。下圖說明了 employees 表格的結構:

employees_table

若要計算所有員工的平均薪資,您可以將 AVG 函數應用於薪資欄位,如下所示:

SELECT 
    AVG(salary)
FROM
    employees;Code language: SQL (Structured Query Language) (sql)

試試看

SQL AVG example

讓我們應用 DISTINCT 運算子來看看結果是否會改變:

SELECT 
    AVG(DISTINCT salary)
FROM
    employees;Code language: SQL (Structured Query Language) (sql)

試試看

SQL AVG DISTINCT example

結果改變了,因為有些員工的薪資相同。

若要將結果四捨五入到小數點後兩位,您可以使用 ROUND 函數,如下所示:

SELECT 
    ROUND(AVG(DISTINCT salary), 2)
FROM
    employees;Code language: SQL (Structured Query Language) (sql)

試試看

SQL AVG with ROUND function example

若要計算數值子集的平均值,我們可以在 SELECT 語句中加入 WHERE 子句。例如,若要計算部門 ID 為 5 的員工的平均薪資,我們可以使用以下查詢:

SELECT
	AVG(DISTINCT salary)
FROM
	employees
WHERE
	department_id = 5;Code language: SQL (Structured Query Language) (sql)

試試看

SQL AVG WHERE example

以下語句會傳回職位 ID 為 6 的員工的平均薪資:

SELECT 
    AVG(salary)
FROM
    employees
WHERE
    job_id = 6;Code language: SQL (Structured Query Language) (sql)

試試看

SQL AVG WHERE job id

搭配 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)

試試看

SQL AVG GROUP BY example

我們可以使用 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)

試試看

SQL AVG with INNER JOIN example

搭配 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;

試試看

SQL AVG with ORDER BY example

搭配 HAVING 子句的 SQL AVG 範例

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

SQL AVG with HAVING clause example

搭配子查詢的 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 函數來計算集合的平均值。

這個教學對您有幫助嗎?