我的理解如下幾條: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