【日常總結】數據庫查詢遇到的問題:三目運算、sum的null值處理、多表聯查


1、MySql中的三元運算符有兩種方法:

case when 條件 then (條件為true時執行) else(條件為false時執行) end /*end不可少*/

select *,if(expr1,expr2,expr3) from 表名

問題描述:統計數據時,需要查詢回復量>0的記錄總數

解決方案: IFNULL(SUM(IF(p.reply_count>0,'1','0')),0) replyCount

 

2、問題描述:進行數據統計時,在sql中使用了SUM()函數,返回的結果集中有null值

解決方案:利用IFNULL()函數判斷SUM()函數查詢的結果集是否為null,若果是null,將結果設置為某一固定值(比如0)

參考:解決數據庫查詢時Null的問題(如SUM函數)

 1 #SUM(expr)函數如果表達式沒有數據,那么返回的結果就會為空,下面介紹四種方法解決NUll問題:  
 2       
 3 #第一種: 采用 IFNULL(expr1,expr2)函數,當expr1為NULL時,則數據返回默認值expre2  
 4   
 5     SELECT IFNULL(SUM(expr),0) -- 表示若 SUM()函數結果返回為NULL澤返回0  
 6   
 7 #第二種: 采用從 COALESCE(value,...) 函數, COALESCE 函數作用是返回傳入參數中第一個非空的值  
 8   
 9     SELECT COALESCE(SUM(expr),0)   
10   
11 #第三種: 采用 case WHEN THEN WHEN THEN .. ELSE END 函數,注意 CASE WHEN 函數最后是以 END 結尾  
12   
13     SELECT CASE WHEN ISNULL(SUM(expr)) THEN 0 ELSE SUM(expr) END  
14   
15 #第四種: 在結果集中進行處理  
16       
17     #比如在Java在進行數據庫交互查詢之后,處理 SUM(expr) 的結果集,返回為null,進行==判斷即可:  
18     #if(result == null){result=0} return result;  
19     #or if(result instanceof Integer){return result}else{return 0;}  

 

附:SUM()與COUNT()的區別:

  • SUM是對符合條件的記錄的數值列求和
  • COUNT 是對查詢中符合條件的結果(或記錄)的個數

  SQL中AVG、COUNT、SUM、MAX等聚合函數對NULL值的處理:

  • AVG忽略NULL值,而不是將其作為“0”參與計算
  • COUNT(*)對表中行數進行計數不管是否有NULL,COUNT(字段名)對特定列有數據的行進行計數忽略NULL值
  • MAX()、MIN()求最大、最小值都忽略NULL
  • 可以對單個列求和,也可以對多個列運算后求和忽略NULL值,且當對多個列運算求和時,如果運算的列中任意一列的值為NULL,則忽略這行的記錄。

 

3、問題描述:從部門表(org)查詢部門人數大於3人(employee)的所有部門的信息

解決方案:

SELECT o.* FROM org o WHERE STATUS=1 AND o.id IN (

  SELECT temp.oid FROM (

    SELECT COUNT(*) custNum,e.org_id oid FROM employee e WHERE e.state=1 GROUP BY oid HAVING custNum>0

  ) AS temp

)


免責聲明!

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



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