SQL語句中 left join 后用 on 還是 where,區(qū)別大了!
點(diǎn)擊關(guān)注公眾號,Java干貨及時送達(dá)
真香!24W字的Java面試手冊(點(diǎn)擊查看)
來源:blog.csdn.net/wqc19920906/article/details/79785424
前天寫SQL時本想通過 A left B join on and 后面的條件來使查出的兩條記錄變成一條,奈何發(fā)現(xiàn)還是有兩條。
后來發(fā)現(xiàn) join on and 不會過濾結(jié)果記錄條數(shù),只會根據(jù)and后的條件是否顯示 B表的記錄,A表的記錄一定會顯示。
不管and 后面的是A.id=1還是B.id=1,都顯示出A表中所有的記錄,并關(guān)聯(lián)顯示B中對應(yīng)A表中id為1的記錄或者B表中id為1的記錄。
運(yùn)行sql :
select * from student s left join class c on s.classId=c.id order by s.id

運(yùn)行sql :
select * from student s left join class c on s.classId=c.id and s.name="張三" order by s.id

運(yùn)行sql :
select * from student s left join class c on s.classId=c.id and c.name="三年級三班" order by s.id

數(shù)據(jù)庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。
在使用left jion時,on和where條件的區(qū)別如下:
1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
假設(shè)有兩張表:
表1:tab2

表2:tab2

兩條SQL:
1、
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
第一條SQL的過程:
1、中間表on條件:
tab1.size = tab2.size

2、再對中間表過濾where 條件:
tab2.name=’AAA’

第二條SQL的過程:
1、中間表on條件:
tab1.size = tab2.size and tab2.name=’AAA’
(條件不為真也會返回左表中的記錄)

如有文章對你有幫助,
“在看”和轉(zhuǎn)發(fā)是對我最大的支持!
推薦, Java面試手冊 內(nèi)容包括網(wǎng)絡(luò)協(xié)議、Java基礎(chǔ)、進(jìn)階、字符串、集合、并發(fā)、JVM、數(shù)據(jù)結(jié)構(gòu)、算法、MySQL、Redis、Mongo、Spring、SpringBoot、MyBatis、SpringCloud、Linux以及各種中間件(Dubbo、Nginx、Zookeeper、MQ、Kafka、ElasticSearch)等等... 點(diǎn)擊文末“閱讀原文”可直達(dá)
評論
圖片
表情

