在mysql中,可以利用AVG()函數來求平均值,該函數可以通過計算返回的行數和每一行數據的和,求得指定列數據的平均值;語法“SELECT AVG(column_name) FROM table_name”。
本教程操作環境:windows7系統、mysql8版本、Dell G3電腦。
在mysql中,可以利用AVG()函數來求平均值。
MySQL AVG()函數是一個聚合函數,它用于計算一組值或表達式的平均值。
AVG() 函數可以通過計算返回的行數和每一行數據的和,求得指定列數據的平均值。
AVG()函數的語法如下:
SELECT?AVG(column_name)?FROM?table_name;
AVG()函數中還可添加DISTINCT運算符來計算不同值的平均值。 例如,如果您有一組值1、1、2、3,具有DISTINCT操作的AVG()函數將返回不同值的和,即:(1 + 2 + 3)/3 = 2.00?。
MySQL AVG示例
我們將在示例數據庫中使用products表進行演示,下圖是products表的結構 –
mysql>?desc?products; +--------------------+---------------+------+-----+---------+------------------+ |?Field??????????????|?Type??????????|?Null?|?Key?|?Default?|?Extra????????????| +--------------------+---------------+------+-----+---------+------------------+ |?productCode????????|?varchar(15)???|?NO???|?PRI?|?????????|??????????????????| |?productName????????|?varchar(70)???|?NO???|?MUL?|?NULL????|??????????????????| |?productLine????????|?varchar(50)???|?NO???|?MUL?|?NULL????|??????????????????| |?productScale???????|?varchar(10)???|?NO???|?????|?NULL????|??????????????????| |?productVendor??????|?varchar(50)???|?NO???|?????|?NULL????|??????????????????| |?productDescription?|?text??????????|?NO???|?????|?NULL????|??????????????????| |?quantityInStock????|?smallint(6)???|?NO???|?????|?NULL????|??????????????????| |?buyPrice???????????|?decimal(10,2)?|?NO???|?????|?NULL????|??????????????????| |?MSRP???????????????|?decimal(10,2)?|?NO???|?????|?NULL????|??????????????????| |?stockValue?????????|?double????????|?YES??|?????|?NULL????|?STORED?GENERATED?| +--------------------+---------------+------+-----+---------+------------------+ 10?rows?in?set
要計算products表中所有產品的平均價格,可以使用AVG函數,如下查詢:
SELECT?AVG(buyprice)?'Avarage?Price'?FROM?products;
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?AVG(buyprice)?'Avarage?Price'?FROM?products; +---------------+ |?Avarage?Price?| +---------------+ |?54.395182?????| +---------------+ 1?row?in?set
請注意,FORMAT函數用于格式化AVG函數返回的平均值。
您可以向SELECT語句添加一個WHERE子句來計算子集值的平均值。 例如,要計算產品線為Classic Cars的產品的平均價格,您可以使用以下查詢:
SELECT?AVG(buyprice)?'Avarage?Classic?Cars?Price' FROM?products WHERE?productline?=?'Classic?Cars';
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?AVG(buyprice)?'Avarage?Classic?Cars?Price' FROM?products WHERE?productline?=?'Classic?Cars'; +----------------------------+ |?Avarage?Classic?Cars?Price?| +----------------------------+ |?64.446316??????????????????| +----------------------------+ 1?row?in?set
具有DISTINCT的MySQL AVG()函數
有些產品價格相同,可以使用以下查詢來檢查它:
SELECT?COUNT(buyprice)?-?COUNT(DISTINCT?buyprice)?FROM?products;
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?COUNT(buyprice)?-?COUNT(DISTINCT?buyprice)?FROM?products; +--------------------------------------------+ |?COUNT(buyprice)?-?COUNT(DISTINCT?buyprice)?| +--------------------------------------------+ |??????????????????????????????????????????2?| +--------------------------------------------+ 1?row?in?set
可以使用AVG()函數通過添加DISTINCT運算符來計算不同價格的平均值,如下所示:
SELECT?AVG(DISTINCT?buyprice)?FROM?products;
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?AVG(DISTINCT?buyprice)?FROM?products; +------------------------+ |?AVG(DISTINCT?buyprice)?| +------------------------+ |?54.372870??????????????| +------------------------+ 1?row?in?set
結果與使用DISTINCT操作符的平均價格略有不同。
具有GROUP BY子句的MySQL AVG
我們經常使用AVG函數與GROUP BY子句一起計算表中每組行的平均值。
例如,要計算每個產品線的產品的平均價格,您將使用帶有GROUP BY子句的AVG函數,如下查詢語句:
SELECT?productline, ???????AVG(buyprice)?'Avarage?Price' FROM?products GROUP?BY?productline;
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?productline, ???????AVG(buyprice)?'Avarage?Price' FROM?products GROUP?BY?productline; +------------------+---------------+ |?productline??????|?Avarage?Price?| +------------------+---------------+ |?Classic?Cars?????|?64.446316?????| |?Motorcycles??????|?50.685385?????| |?Planes???????????|?49.629167?????| |?Ships????????????|?47.007778?????| |?Trains???????????|?43.923333?????| |?Trucks?and?Buses?|?56.329091?????| |?Vintage?Cars?????|?46.066250?????| +------------------+---------------+ 7?rows?in?set
具有HAVING子句的MySQL AVG
您可以使用AVG函數中的HAVING子句中為分組的平均值設置條件。 例如,如果要僅選擇產品平均價格大于50的產品線,則可以使用以下查詢:
SELECT?productline,?AVG(buyprice)?'Avarage?Price'?FROM?products?GROUP?BY?productline?HAVING?AVG(buyprice)?>?50;
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?productline,?AVG(buyprice)?'Avarage?Price'?FROM?products?GROUP?BY?productline?HAVING?AVG(buyprice)?>?50; +------------------+---------------+ |?productline??????|?Avarage?Price?| +------------------+---------------+ |?Classic?Cars?????|?64.446316?????| |?Motorcycles??????|?50.685385?????| |?Trucks?and?Buses?|?56.329091?????| +------------------+---------------+ 3?rows?in?set
MySQL AVG()函數與子查詢
您可以在SQL語句中多次使用AVG()函數來計算一組平均值的平均值。 例如,可以計算產品線平均購買價格的平均買價如下:
SELECT?AVG(pl_avg)?'Average?Product' FROM?( ????SELECT?AVG(buyprice)?pl_avg ????FROM?products ????GROUP?BY?productline )?avgs;
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?AVG(pl_avg)?'Average?Product' FROM?( ????SELECT?AVG(buyprice)?pl_avg ????FROM?products ????GROUP?BY?productline )?avgs; +-----------------+ |?Average?Product?| +-----------------+ |?51.1553314286???| +-----------------+ 1?row?in?set
怎么運行的 –
- 子查詢根據產品線計算平均購買價格。
- 外部查詢計算從子查詢返回的產品線的平均購買價格的平均購買價格。
具有NULL值的MySQL AVG函數
AVG()函數忽略計算中的NULL值,請參閱以下示例:
首先,創建一個名為t的新表,其中有兩列id和val,val列可以包含NULL值。
CREATE?TABLE?IF?NOT?EXISTS?t( ????id??int?auto_increment?primary?key, ????val?int );
其次,在t表中插入一些行,包括NULL值。
INSERT?INTO?t(val) VALUES(1),(2),(nulL),(3);
第三,使用AVG()函數計算val列中值的平均值:
SELECT?AVG(val)?FROM?t;
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?AVG(val)?FROM?t; +----------+ |?AVG(val)?| +----------+ |?2.0000???| +----------+ 1?row?in?set
該語句按預期返回2,因為在AVG函數的計算中不包括NULL值。
具有控制流函數的MySQL AVG
要計算列的平均值,并在單個語句中有條件地計算相同列的平均值,可以使用具有控制流函數(如IF,CASE,IFNULL,NULLIF等)的AVG函數。
例如,要計算Classic Cars產品線的平均價格與所有產品的平均價格的比例,請使用以下聲明:
SELECT?AVG(IF(productline='Classic?Cars',buyprice,NULL))?/?AVG(buyprice)?'Classic?Cars/?Products' FROM?products;
執行上面查詢語句,得到以下結果 –
mysql>?SELECT?AVG(IF(productline='Classic?Cars',buyprice,NULL))?/?AVG(buyprice)?'Classic?Cars/?Products' FROM?products; +------------------------+ |?Classic?Cars/?Products?| +------------------------+ |?1.1847798580???????????| +------------------------+ 1?row?in?set
如果產品線是Classic Cars,則IF(productline=’Classic Cars’,buyprice,NULL)表達式返回價格,否則返回NULL。
因為AVG函數忽略了計算中的NULL值,所以AVG(IF(productline =’Classic Cars’,buyprice,NULL))表達式只計算產品線是Classic Cars的產品的平均價格。
【相關推薦:mysql視頻教程】