AVG() 函數 (SQL AVG() Function)
AVG() 是一個聚合函數 (Aggregate Function),用於計算數值欄位的平均值。它會忽略 NULL 值,只對非 NULL 的數值計算平均。
AVG() 語法 (Syntax)
SELECT AVG(column_name) FROM table_name [WHERE condition];
AVG() 用法範例 (Example)
students 資料表:
| S_Id | Name | Height |
|---|---|---|
| 1 | 張一 | 170 |
| 2 | 王二 | 176 |
| 3 | 李三 | 173 |
範例 1:計算學生的平均身高
SELECT AVG(Height) AS AvgHeight
FROM students;
結果:
| AvgHeight |
|---|
| 173 |
(計算方式:(170 + 176 + 173) / 3 = 173)
AVG() 搭配 WHERE 條件
orders 資料表:
| O_Id | Price | Customer |
|---|---|---|
| 1 | 1000 | 張一 |
| 2 | 2000 | 王二 |
| 3 | 500 | 李三 |
| 4 | 1300 | 張一 |
| 5 | 1800 | 王二 |
計算「張一」的平均訂單金額:
SELECT AVG(Price) AS AvgPrice
FROM orders
WHERE Customer = '張一';
結果:
| AvgPrice |
|---|
| 1150 |
(計算方式:(1000 + 1300) / 2 = 1150)
AVG() 搭配 GROUP BY
使用 GROUP BY 計算每個群組的平均值:
SELECT Customer, AVG(Price) AS AvgPrice
FROM orders
GROUP BY Customer;
結果:
| Customer | AvgPrice |
|---|---|
| 張一 | 1150 |
| 王二 | 1900 |
| 李三 | 500 |
AVG() 搭配 HAVING
使用 HAVING 篩選平均值符合條件的群組:
SELECT Customer, AVG(Price) AS AvgPrice
FROM orders
GROUP BY Customer
HAVING AVG(Price) > 1000;
結果:
| Customer | AvgPrice |
|---|---|
| 張一 | 1150 |
| 王二 | 1900 |
AVG() 與 NULL 值
AVG() 會忽略 NULL 值,不將其計入平均計算:
假設資料:
| S_Id | Score |
|---|---|
| 1 | 80 |
| 2 | NULL |
| 3 | 90 |
SELECT AVG(Score) AS AvgScore FROM students;
-- 結果:85 (只計算 80 和 90,NULL 被忽略)
-- 計算方式:(80 + 90) / 2 = 85
💡 注意: 如果要將 NULL 視為 0 來計算平均,需要使用
COALESCE或IFNULL:
SELECT AVG(COALESCE(Score, 0)) AS AvgScore FROM students;
-- 結果:56.67 (計算方式:(80 + 0 + 90) / 3)
AVG(DISTINCT column_name)
計算不重複值的平均:
SELECT AVG(DISTINCT Score) AS AvgUniqueScore
FROM students;
-- 只對不重複的分數計算平均
AVG() 搭配 ROUND() 控制小數位數
平均值通常會有小數,可以用 ROUND() 控制顯示位數:
SELECT ROUND(AVG(Price), 2) AS AvgPrice
FROM orders;
-- 四捨五入到小數點後兩位
AVG() 與比較查詢
找出高於平均的記錄:
-- 找出價格高於平均的訂單
SELECT *
FROM orders
WHERE Price > (SELECT AVG(Price) FROM orders);
AVG() 與窗口函數
使用窗口函數計算移動平均:
SELECT
O_Id,
Customer,
Price,
AVG(Price) OVER () AS OverallAvg,
AVG(Price) OVER (PARTITION BY Customer) AS CustomerAvg,
AVG(Price) OVER (ORDER BY O_Id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS MovingAvg
FROM orders;
注意事項
整數除法:在某些資料庫中,整數欄位的 AVG() 可能返回整數。使用
CAST轉換為浮點數可以獲得精確結果:SELECT AVG(CAST(Score AS DECIMAL(10,2))) AS AvgScore FROM students;空結果集:如果沒有任何記錄或所有值都是 NULL,AVG() 返回 NULL。