一個(gè)一直我困擾很久的問題,SQL語句中這兩種寫法有什么區(qū)別嗎鸦难?
select * from a,b where a.id = b.id
select * from a inner join b on a.id =b.id
查詢結(jié)果是一樣的
那么挚躯,連接查詢join后的限制條件 on 和where又有什么區(qū)別呢?
用left join做實(shí)驗(yàn)比較清楚
select * from a,b where a.id between 1000 and 2000
select * form a left join b on a.id between 1000 and 2000
可以看到
第一句SQL查詢了所有a表集漾,b表查詢項(xiàng)目?jī)H限于1表中a.id在1000~2000之間的切黔,on關(guān)鍵字篩選了a表的結(jié)果將b表連接到了與a表結(jié)果匹配的行
如果要得到等同于第一句的SQL
需要再添加where條件
select * from a,b where a.id between 1000 and 2000
select * form a left join b on a.id between 1000 and 2000 where a.id between 1000 and 2000
另外一點(diǎn)發(fā)現(xiàn):
對(duì)于left join砸脊,不管on后面跟什么條件,左表的數(shù)據(jù)全部查出來纬霞,因此要想過濾需把條件放到where后面凌埂。
where條件是在聯(lián)合條件臨時(shí)表生成好后,再對(duì)臨時(shí)表進(jìn)行過濾的條件诗芜,如果過濾的是左連接的主表瞳抓,則沒有問題,如果過濾的是左連接的從表伏恐,那前面的left join 就沒有了意義孩哑,查詢等同于inner join;過濾條件放在 where后面:是先連接然生成臨時(shí)查詢結(jié)果翠桦,然后再篩選
過濾條件放在 on后面:先根據(jù)條件過濾篩選横蜒,再連,生成臨時(shí)查詢結(jié)果