SQL: 左链接(left join )或者右链接( right join )在 on 后面直接跟and 或 where条件的区别

我的理解如下几条:sql

  • on 后直接跟and条件则只能对_从表_(B)的结果进行筛选,对主表A数据无影响;即对B表的结果集根据and后面的条件进行筛选后再将数据与主表A进行链接
  • 若是要对_主表_(A)的结果进行筛选,则筛选条件通常放在where后面;即where 后的条件则是先将主表A和从表B链接后再对其总结果集C进行筛选。
  • where后的条件不管是针对主表A仍是从表B的筛选都有用

话很少说,先看执行效果就知道了。code

select A.id,A.name,B.area_id,B.park_name from t_sys_city_code A
left join eimm_park_inf B on A.id=B.area_id  
order by A.id,B.park_name

执行结果1:on 后and A.id=B.area_id  这个条件只筛选掉了从表B中的数据,主表A中数据未受影响图片

输入图片说明

select A.id,A.name,B.area_id,B.park_name from t_sys_city_code A
left join eimm_park_inf B on A.id=B.area_id  
and A.id not in('610103','610102','610104','0')  
order by A.id,B.park_name

执行结果2:on 后面直接 and A.id not in('610103','610102','610104','0')   这个条件虽然看起来是针对主表A中的数据进行筛选,可是结果依然对主表A没有影响,筛选掉的只是从表B中能与主表A ('610103','610102','610104','0') 这几个条件关联起来的数据ci

输入图片说明

select A.id,A.name,B.area_id,B.park_name from t_sys_city_code A
left join eimm_park_inf B on A.id=B.area_id 
and B.park_name='光电孵化协同创新工程示范基地' 
and A.id not in('610103','610102','610104','0','61010a') 
order by A.id,B.park_name

执行结果3:on后and B.park_name='光电孵化协同创新工程示范基地' 条件,只是将从表B 的park_name='光电孵化协同创新工程示范基地'的这条数据过滤掉了,这里依然对主表A的数据未形成影响it

输入图片说明

select A.id,A.name,B.area_id,B.park_name from t_sys_city_code A
left join eimm_park_inf B on A.id=B.area_id 
where   A.id not in('610103','610102','610104','0')  
order by A.id,B.park_name

执行结果4:主表A从表B进行关联后获得结果集C,where   A.id not in('610103','610102','610104','0') 条件对结果集C进行筛选class

输入图片说明

select A.id,A.name,B.area_id,B.park_name from t_sys_city_code A
left join eimm_park_inf B on A.id=B.area_id 
and   B.park_name='光电孵化协同创新工程示范基地' 
where   A.id not in('610103','610102','610104','0')  
order by A.id,B.park_name

执行结果5:on后and   B.park_name='光电孵化协同创新工程示范基地' 条件针对从表B进行了筛选后,在与主表A关联接到结果集C,where   A.id not in('610103','610102','610104','0')  条件在对结果集C进行了筛选select

输入图片说明

select A.id,A.name,B.area_id,B.park_name from t_sys_city_code A
left join eimm_park_inf park on A.id=B.area_id 
where   A.id not in('610103','610102','610104','0') 
and   B.park_name='光电孵化协同创新工程示范基地'  
order by A.id,B.park_name

执行结果6:where后面的结果直接对主表A从表B关联后的结果进行了筛选im

输入图片说明

相关文章
相关标签/搜索