AVG() 函數 (SQL AVG() Function)

AVG() 是一個聚合函數 (Aggregate Function),用於計算數值欄位的平均值。它會忽略 NULL 值,只對非 NULL 的數值計算平均。

AVG() 語法 (Syntax)

SELECT AVG(column_name) FROM table_name [WHERE condition];

AVG() 用法範例 (Example)

students 資料表:

S_IdNameHeight
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_IdPriceCustomer
11000張一
22000王二
3500李三
41300張一
51800王二

計算「張一」的平均訂單金額:

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;

結果:

CustomerAvgPrice
張一1150
王二1900
李三500

AVG() 搭配 HAVING

使用 HAVING 篩選平均值符合條件的群組:

SELECT Customer, AVG(Price) AS AvgPrice
FROM orders
GROUP BY Customer
HAVING AVG(Price) > 1000;

結果:

CustomerAvgPrice
張一1150
王二1900

AVG() 與 NULL 值

AVG()忽略 NULL 值,不將其計入平均計算:

假設資料:

S_IdScore
180
2NULL
390
SELECT AVG(Score) AS AvgScore FROM students;
-- 結果:85 (只計算 80 和 90,NULL 被忽略)
-- 計算方式:(80 + 90) / 2 = 85

💡 注意: 如果要將 NULL 視為 0 來計算平均,需要使用 COALESCEIFNULL

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;

注意事項

  1. 整數除法:在某些資料庫中,整數欄位的 AVG() 可能返回整數。使用 CAST 轉換為浮點數可以獲得精確結果:

    SELECT AVG(CAST(Score AS DECIMAL(10,2))) AS AvgScore FROM students;
    
  2. 空結果集:如果沒有任何記錄或所有值都是 NULL,AVG() 返回 NULL。

相關主題