Mysql AVG() 值 返回NULL而非空結果集


【1】select 查詢返回一行NULL

先來模擬復現一下遇到的問題。

(1)源數據表grades,學生成績表

(2)查詢SQL語句

查詢‘080601’班的各門課平均成績

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)實際結果

(4)期望結果

如果沒有滿足條件的記錄,期望返回無結果集,而不是有一行NULL結果集。

【2】分析原因

第一反應,當條件滿足時,會不會有這行NULL呢?

請看這個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 = '080605';

結果:

很明顯,沒有那么一行NULL值。

經分析:

如果所查詢的表 或 where條件篩選后得到的結果集為空,那么聚合函數sum() 或 avg()的返回值為NULL;count()函數的返回值為0

驗證一下,假如我們不加這個avg函數呢?

請看這個SQL:

SELECT sClass,
COUNT(*) AS total
FROM grades 
WHERE sClass = '080601';

結果:

看來,只要有聚合函數,當where條件結果集為空時,應該都會生成這么一行NULL值記錄項。

【3】解決方案

經查詢,找到了一種處理方法:在Sql語句的最后加上GROUP BY NULL;

修改如上語句,例如:

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'
GROUP BY NULL;

結果:

滿足需求。好,很好,這樣就會避免一個坑。

沒有完,再想想,假如where條件滿足篩選出結果集,那么加GROUP BY NULL會有什么“隱患”嗎?

請看驗證過程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 = '080604';
GROUP BY NULL;

實際結果:

看起來,貌似沒有其他隱患。

暫且如上。

 

 

Good Good Study, Day Day Up.

順序  選擇  循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM