left join on後面 加條件 與 where後面加條件的區別

本文主要講解left join on 和where 的區別,以及用法
首先
數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。

在使用left join時,on和where條件的區別如下:

1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否爲真,都會返回左邊表中的記錄。

2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不爲真的就全部過濾掉。

 

1.用left join 進行條件過濾時,on條件只會對右表進行條件過濾,不會對左表數據產生任何影響;
2.用left join 進行條件過濾時,where條件會對結果表進行條件過濾,所以會對左表數據產生影響;
3.用inner join 用on和where沒有任何區別

使用:

單獨使用left join時:

 

select

o.id id,
o.user_id ,
o.out_trade_no,
o.create_time,
o.state,
o.total_fee,
o.video_id,
o.video_title,
o.video_img,
u.name,
u.head_img,
u.create_time,
u.phone
from video_order o left join user u on o.user_id = u.id

  


這裏video_order o是讓o代替video_order 這個表,方便命名書寫,它的作用首先是輸出左表的全部數據,然後篩選右表,將符合的一一對應,與左表關聯輸出。注意這裏是左表的全部數據均輸出

再看另外一個left join on的例子

 

select

o.id id,
o.user_id ,
o.out_trade_no,
o.create_time,
o.state,
o.total_fee,
o.video_id,
o.video_title,
o.video_img,
u.name,
u.head_img,
u.create_time,
u.phone
from video_order o left join user u on o.user_id = u.id and u.id=6

 

通過圖示我們發現,這裏也是顯示左表的所有數據,不同在於,要篩選右表,右表不符合的顯示爲NULL;

join on與where同時使用
下面是我們更希望出現的樣子,就是我們關聯查詢後,能過濾到左表我們不想要的東西

select

o.id id,
o.user_id ,
o.out_trade_no,
o.create_time,
o.state,
o.total_fee,
o.video_id,
o.video_title,
o.video_img,
u.name,
u.head_img,
u.create_time,
u.phone
from video_order o left join user u on o.user_id = u.id where u.id=6

 

其實除了這個辦法,我們還可以對左表用子查詢進行篩選,具體代碼如下

select o.order_id,o.user_id,u.user_id,u.user_name
from ( select * from tb_order where order_id > 10 ) o LEFT JOIN tb_user u on o.user_id = u.user_id;

 

 

 

LEFT JOIN條件在on後面和在where後面的區別
一、left join 的實際運用
二、兩表聯查SQL區別
1、在on後面補全條件
2、在where後面補全條件
三、三表聯查SQL區別
1.錯誤示範:
1.1 連續使用left join,on後面過濾條件
1.2 連續使用left join,where後面過濾條件
2.正確操作:
2.1將test2和test3作爲整個右表查詢
四、結論
一、left join 的實際運用
left join 一般用於顯示左邊所有數據,並攜帶右表的數據;
而在on後面進行條件過濾,只會過濾掉右表條件不爲真的數據,左表數據一定會顯示;
在where後面進行條件過濾,是對左表右表的結果表進行過濾,所以數據不一定能完全顯示。

二、兩表聯查SQL區別
存在數據表test1, test4
test1:

test4:


1、在on後面補全條件
select * from test1 left join test4 on test1.id = test4.id and test4.is_effective = 1
1

可以發現test1中的數據全部被讀取,test4中過濾了is_effective != 1的數據

2、在where後面補全條件
select * from test1 left join test4 on test1.id = test4.id where test4.is_effective = 1
1

可以發現只顯示了test1中的id爲1的數據內容。

三、三表聯查SQL區別
存在test1,test2,test3三張表,其中test3是test1和test2的中間表
test1:

test2:

test3:


某些業務中,我們會使用中間表查詢數據,如果存在業務,要顯示test1中的全部數據,並攜帶test2中的有效數據,我們一般會採用left join 去完成sql,而這時需要注意應該將test2和test3的結果表作爲整個右表,才能正常完成業務。

1.錯誤示範:
1.1 連續使用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

 



會查出test1中的重複數據

1.2 連續使用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中的數據

2.正確操作:
2.1將test2和test3作爲整個右表查詢

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
 

 

正常完成查詢
 

參考:left join on後面 加條件 與 where後面加條件的區別

參考:LEFT JOIN條件在on後面和在where後面的區別



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章