本文主要講解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後面的區別