今天進行sql查詢時,碰到了一個問題:
SQL語句:
select r.user_id, r.job_id, sum(t.money) as job_salary
from pj_punch_records as r left join pj_punch_transactions as t on r.job_id= t.transaction_detail
where r.user_id = 1 and t.type = 1
order by r.created_at desc
1.進行2表關聯查詢,同時,使用 sum() 來統計金錢總數,主表,並沒有對應查詢條件的記錄,居然出現了一條全部為 NULL 的記錄。這個不合理啊!我想要的自然是,沒有查詢到合適的數據,結果集應該為空!
2.上面這種情況,當有記錄時,就正常了!
解決方法:
也是胡亂測試了下,發現添加上 'group by r.job_id' 后,發現結果集就為空了!
沒研究過mysql,也沒時間好好看看mysql方面的知識。但通過以上的2種情況,猜測:
select - 作為mysql的輸出方法,類似php中的echo等
碰到 sum() avg() 等mysql的內置函數,或其他非當前、查詢的數據表的直接字段(要么是其他語句、要么是把數據表的字段做了什么處理!),都會輸出一行數據!
所以,才有了我們看到的一行全部為NULL的數據!
而使用 group by r.job_id 對結果進行了聚合,把NULL的記錄給過濾了,從而返回了 '空結果集'
在網上搜索時,也正好找到一篇處理這個問題的,采用的方式為:group by NULL
http://www.xuebuyuan.com/2008066.html
網上涉及更多的sum()返回null,是想返回0,這里正好也筆記下:
1.第一種: 采用 IFNULL(expr1,expr2)函數,當expr1為NULL時,則數據返回默認值expre2
SELECT IFNULL(SUM(expr),0) -- 表示若 SUM()函數結果返回為NULL澤返回0
2.第二種: 采用從 COALESCE(value,...) 函數, COALESCE 函數作用是返回傳入參數中第一個非空的值
SELECT COALESCE(SUM(expr),0)
3.第三種: 采用 case WHEN THEN WHEN THEN .. ELSE END 函數,注意 CASE WHEN 函數最后是以 END 結尾
SELECT CASE WHEN ISNULL(SUM(expr)) THEN 0 ELSE SUM(expr) END
參考文章:
http://blog.csdn.net/h70614959/article/details/40115395
http://blog.csdn.net/qq844579582/article/details/52610484
可查看 SQL NULL 函數:
ISNULL()、NVL()、IFNULL()、COALESCE(),這幾個函數可能效果差不多
參考:
http://www.w3school.com.cn/sql/sql_isnull.asp
SQL中AVG、COUNT、SUM、MAX等函數對NULL值處理
一、AVG()
求平均值
注意AVE()忽略NULL值,而不是將其作為“0”參與計算
二、COUNT(),兩種用法
1、COUNT(*)
對表中行數進行計數
不管是否有NULL
2、COUNT(字段名)
對特定列有數據的行進行計數
忽略NULL值
三、MAX()、MIN()
求最大、最小值
都忽略NULL
四、SUM()
可以對單個列求和,也可以對多個列運算后求和
忽略NULL值,且當對多個列運算求和時,如果運算的列中任意一列的值為NULL,則忽略這行的記錄。
例如: SUM(A+B+C),A、B、C 為三列,如果某行記錄中A列值為NULL,則不統計這行。
五、GROUP BY的使用注意事項
1、分組列中若有NULL,這也將作為一組,且NULL值排在最前面
2、除匯總函數計算語句外,SELECT中的選擇列必須出現在GROUP BY 中
3、GROUP BY 可以包含任意數目的列,可以嵌套
轉載文章:
http://m.studyofnet.com/news/1219.html