【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.
順序 選擇 循環 總結