1.查询是否被占用的问题 当查询不到时 不能用ifnull()函数进行null转换0在处理 查询不到的时候仍然
会返回一个null给你,impl处理起来捕捉不到0,只能捕捉null,比较难处理。 但是用count()函数就会捕捉到null时转换成0的情况,处理起来就比较得心应手。
2.left join on *** where *** 过流条件是放在on后和where后的区别:
***************************************过滤条件在on中时********************************
- 不管on中的条件如何写,左连接首先要得到左边的所有的行
- --对于右边的表,如果满足连接条件,则输出值,如果不满足条件,则返回null
- --也就是说,on中的过滤条件(比如 on leftTable.id=rightTable.id and leftTable.colName='***'),
- --是作为左外连接的连接条件,而不是过滤条件
- --左边表的数据是要全部输出的,做联接的时候,
- --抽取符合(leftTable.colName='***')条件的的左边的数据行,跟右边的表做连接,输出结果
- --不符合(leftTable.colName='***')条件的数据行,输出左边表,右边表为null值,输出结果
- 比如这个sql:
- select * from class A left join score B on A.class_id=B.class_id and A.class_name='英语'
- 查询过程是这样的:
- 找出A表的第一条数据,判断是否符合class_name='英语'
- 如果符合,则跟右表做,输出A表+B表的行(当然存在B表中可能没有相关ID的英语成绩,那么B表也可以输出null)
- 如果不符,直接输出A表中的行,B表中的行直接为null
- 从这个过程可以看出,on中的等值条件只是影响left join产生结果集的过程,并不参与数据的过滤
- A表总是将其所有的值输出的(不管过滤条件是啥,不管B表是否存在相关信息)
- 过滤条件在where中时:
- --但是过滤条件写在where中(on leftTable.id=rightTable.id where leftTable.colName='***')时,
- --是作为对左边表的“过滤条件”,就意味着先根据where(where leftTable.colName='***')条件过滤左边的表
- --然后将过滤后的结果跟右边的表做左联接连接
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
查询结果贴图: