【1】聚合函數返回NULL
當where條件不滿足時,聚合函數sum()、avg()的返回值為NULL。
(1)源數據表
(2)如下SQL語句
SELECT sClass, COUNT(*) AS total, AVG(sChina) AS avg_china, AVG(sMath) AS avg_math, AVG(sEnglish) AS avg_english FROM grades WHERE sClass = '080601'
(3)實際結果:
溫馨提醒:如果不想要這行NULL值的結果集,可以參見隨筆《Mysql AVG() 值返回NULL而非空結果集》
【2】解決方案
因為某種需要,我們實在不想出現NULL這個值,想用0表示,可怎么處理呢?
有三種方式:
(1)如下SQL語句
SELECT sClass, COUNT(*) AS total, IFNULL(AVG(sMath), 0) AS avg_math, # 方式一 COALESCE(AVG(sEnglish), 0) AS avg_english, # 方式二 CASE WHEN ISNULL(AVG(sChina)) THEN 0 ELSE AVG(sChina) END AS avg_china # 方式三 FROM grades WHERE sClass = '080601';
(2)實際結果
【3】小數位數
如上結果,比較介懷,為什么avg函數的后面那么多小數位數,想要保留若干位數,又怎么處理呢?
使用ROUND進行四合五入:
(1)如下SQL語句
SELECT sClass, COUNT(*) AS total, ROUND(IFNULL(AVG(sMath), 0), 1) AS avg_math, # 保留一位 ROUND(COALESCE(AVG(sEnglish), 0), 2) AS avg_english, # 保留兩位 CASE WHEN ISNULL(AVG(sChina)) THEN 0 ELSE AVG(sChina) END AS avg_china # 保留四位 FROM grades WHERE sClass = '080604'
(2)實際結果
Good Good Study, Day Day Up.
順序 選擇 循環 總結