我的理解如下几条: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