LEFT JOIN條件在on后面和在where后面的區(qū)別及說明
一、left join 的實(shí)際運(yùn)用
left join 一般用于顯示左邊所有數(shù)據(jù),并攜帶右表的數(shù)據(jù);
而在on后面進(jìn)行條件過濾,只會(huì)過濾掉右表?xiàng)l件不為真的數(shù)據(jù),左表數(shù)據(jù)一定會(huì)顯示;
在where后面進(jìn)行條件過濾,是對(duì)左表右表的結(jié)果表進(jìn)行過濾,所以數(shù)據(jù)不一定能完全顯示。
二、兩表聯(lián)查SQL區(qū)別
存在數(shù)據(jù)表test1, test4
test1:

test4:

1、在on后面補(bǔ)全條件
select * from test1 left join test4 on test1.id = test4.id and test4.is_effective = 1

可以發(fā)現(xiàn)test1中的數(shù)據(jù)全部被讀取,test4中過濾了is_effective != 1的數(shù)據(jù)
2、在where后面補(bǔ)全條件
select * from test1 left join test4 on test1.id = test4.id where test4.is_effective = 1

可以發(fā)現(xiàn)只顯示了test1中的id為1的數(shù)據(jù)內(nèi)容。
三、三表聯(lián)查SQL區(qū)別
存在test1,test2,test3三張表,其中test3是test1和test2的中間表
test1:

test2:

test3:

某些業(yè)務(wù)中,我們會(huì)使用中間表查詢數(shù)據(jù),如果存在業(yè)務(wù),要顯示test1中的全部數(shù)據(jù),并攜帶test2中的有效數(shù)據(jù),我們一般會(huì)采用left join 去完成sql,而這時(shí)需要注意應(yīng)該將test2和test3的結(jié)果表作為整個(gè)右表,才能正常完成業(yè)務(wù)。
1.錯(cuò)誤示范:
1.1 連續(xù)使用left join,on后面過濾條件
SELECT * FROM test1 LEFT JOIN test3 ON test1.id = test3.id1 LEFT JOIN test2 ON test2.id = test3.id2 and is_effective = 1

會(huì)查出test1中的重復(fù)數(shù)據(jù)
1.2 連續(xù)使用left join,where后面過濾條件
SELECT * FROM test1 LEFT JOIN test3 ON test1.id = test3.id1 LEFT JOIN test2 ON test2.id = test3.id2 WHERE is_effective = 1

無法完全顯示test1中的數(shù)據(jù)
2.正確操作
2.1將test2和test3作為整個(gè)右表查詢
SELECT * FROM test1 LEFT JOIN ( SELECT * FROM test2 INNER JOIN test3 ON test2.id = test3.id2 WHERE is_effective = 1 ) b ON test1.id = b.id1

正常完成查詢
四、結(jié)論
1.用left join 進(jìn)行條件過濾時(shí),on條件只會(huì)對(duì)右表進(jìn)行條件過濾,不會(huì)對(duì)左表數(shù)據(jù)產(chǎn)生任何影響;
2.用left join 進(jìn)行條件過濾時(shí),where條件會(huì)對(duì)結(jié)果表進(jìn)行條件過濾,所以會(huì)對(duì)左表數(shù)據(jù)產(chǎn)生影響;
3.用inner join 用on和where沒有任何區(qū)別
好了,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解析如何使用Zend Framework 連接數(shù)據(jù)庫
本篇文章是對(duì)如何使用Zend Framework 連接數(shù)據(jù)庫的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
win8.1安裝mysql5.6時(shí)遇到問題解決方案
本文主要記錄的是作者在win8.1安裝mysql5.6時(shí)遇到問題的解決方案,網(wǎng)上查了很多方法都沒能解決,這里把最后的方法分享給大家2016-10-10
mysql存儲(chǔ)過程游標(biāo)之loop循環(huán)解讀
這篇文章主要介紹了mysql存儲(chǔ)過程游標(biāo)之loop循環(huán)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
詳解如何在阿里云服務(wù)器安裝Mysql數(shù)據(jù)庫
這篇文章主要介紹了詳解如何在阿里云服務(wù)器安裝Mysql數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
MySQL中表復(fù)制:create table like 與 create table as select
這篇文章主要介紹了MySQL中表復(fù)制:create table like 與 create table as select,需要的朋友可以參考下2014-12-12

