SQL问题 ifnull和count的查出null的区别 派生表 条件放在on和where后的区别

1.查询是否被占用的问题  当查询不到时   不能用ifnull()函数进行null转换0在处理    查询不到的时候仍然

会返回一个null给你,impl处理起来捕捉不到0,只能捕捉null,比较难处理。 但是用count()函数就会捕捉到null时转换成0的情况,处理起来就比较得心应手。

2.left  join  on  ***  where   ***   过流条件是放在on后和where后的区别:

***************************************过滤条件在on中时********************************

  1. 不管on中的条件如何写,左连接首先要得到左边的所有的行  
  2. --对于右边的表,如果满足连接条件,则输出值,如果不满足条件,则返回null  
  3. --也就是说,on中的过滤条件(比如 on leftTable.id=rightTable.id  and leftTable.colName='***'),  
  4. --是作为左外连接的连接条件,而不是过滤条件  
  5. --左边表的数据是要全部输出的,做联接的时候,  
  6. --抽取符合(leftTable.colName='***')条件的的左边的数据行,跟右边的表做连接,输出结果  
  7. --不符合(leftTable.colName='***')条件的数据行,输出左边表,右边表为null值,输出结果  
  8. 比如这个sql:  
  9. select * from class A left join score B on A.class_id=B.class_id and A.class_name='英语'  
  10.   
  11. 查询过程是这样的:  
  12. 找出A表的第一条数据,判断是否符合class_name='英语'  
  13. 如果符合,则跟右表做,输出A表+B表的行(当然存在B表中可能没有相关ID的英语成绩,那么B表也可以输出null)  
  14. 如果不符,直接输出A表中的行,B表中的行直接为null  
  15.   
  16. 从这个过程可以看出,on中的等值条件只是影响left join产生结果集的过程,并不参与数据的过滤  
  17. A表总是将其所有的值输出的(不管过滤条件是啥,不管B表是否存在相关信息)  
  18. 过滤条件在where中时:
  19. --但是过滤条件写在where中(on leftTable.id=rightTable.id where  leftTable.colName='***')时,  
  20. --是作为对左边表的“过滤条件”,就意味着先根据where(where  leftTable.colName='***')条件过滤左边的表  
  21. --然后将过滤后的结果跟右边的表做左联接连接

 

2.当查询语句涉及多表查询的时候,会出现一种情况就是关联表中的一些数据,将会取不到,但是最终又需要该数据,left join又会过滤掉所需数据 这是尝试一下派生表

 t  s  n 都属于是派生表:每个派生表都必须有自己的别名  派生表之间的连接需要

   ,()  :作为连接   

SELECT * FROM  :查询所有派生表里的数据


SQL语句:

SELECT * FROM  

 (SELECT  COUNT(t0.id)  AS alarmnum  from  t_dev_alarm t0 LEFT JOIN (SELECT  t1.*   from t_device_yg t1   
LEFT JOIN  t_device_group_relation t2 on  t2.deviceid=t1.id  WHERE   t2.moduleid=2   AND t2.groupid=1   AND    t1.isdelete=0 AND t1.isenable=1
   ) AS  t3 ON t3.id=t0.deviceid WHERE t0.moduleid=2   
) AS t  ,

(SELECT COUNT(t1.id) AS num   from t_device_yg t1   
LEFT JOIN  t_device_group_relation t2 on  t2.deviceid=t1.id  WHERE   t2.moduleid=2   AND t2.groupid=1   AND    t1.isdelete=0 AND t1.isenable=1) AS s
,
(
  SELECT t0.telephone AS  telephone,  t0.contacts  AS contact, t2.groupname  AS groupname FROM   t_user  t0  LEFT JOIN   t_user_dgroup_relation   t1 ON   t1.userid=t0.id  
LEFT JOIN  t_device_group   t2   ON t2.id=t1.devicegroupid

WHERE   t1.devicegroupid=1

)  AS n

查询结果贴图:









猜你喜欢

转载自blog.csdn.net/qq_33355858/article/details/80995220
今日推荐