个人理解以下几条:
on 后直接跟and条件则只能对_从表_(B)的结果进行筛选,对主表A数据无影响;即对B表的结果集根据and后面的条件进行筛选后再将数据与主表A进行连接
如果要对_主表_(A)的结果进行筛选,则筛选条件一般放在where后面;即where 后的条件则是先将主表A和从表B连接后再对其总结果集C进行筛选。
where后的条件无论是针对主表A还是从表B的筛选都有用
话不多说,先看执行效果就知道了。
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') 这几个条件关联起来的数据
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的数据未造成影响
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进行筛选
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 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关联后的结果进行了筛选