連表查詢--left join用法


相信剛接觸mysql的時候,可能遇到以下的情況:

標准查詢關鍵字執行順序為 FROM->WHERE->GROUP BY->HAVING->ORDER BY

LEFT JOIN 是在 FROM 范圍內 所以先 ON 條件篩選表,然后兩表再做 LEFT JOIN

而對於 WHERE 來說是在 LEFT JOIN 結果再次篩選

一、場景及要求:

A表有三條數據對應1、2、3;B表有兩條數據對應1、2;A表中的1對應 B表的1,A表中3對應B表的2。我想過濾數據(條件是A.id != 1 && B.name != 'xx')得到A表中的2。

A表

id

name

age

1

張三

12

2

李四

24

3

王二

13

 

B表

id

a_id

name

1

1

ss

2

3

xx

二、錯誤的實現

select a.id as aid,a.name as aname,a.aage as age.b.id as bid,b.name as bname form  A as a left join B as b on b.a_id = a.id where a.id !=1 and b.name != 'xx' ;

從語義上理解根據a.id !=1和b.name != 'xx'是可以查詢到想要的數據。但是這個sql運行之后你什么都得不到。為什么那?

我先來看看mysql怎么執行這條sql語句的。

第一步:先執行select a.id as aid,a.name as aname,a.aage as age.b.id as bid,b.name as bname form  A as a left join B as b on b.a_id = a.id生成一張AB臨時表

AB表

aid

aname

aage

bid

bname

1

張三

12

1

ss

2

李四

24

NULL

NULL

3

王二

13

2

xx

第二步:執行where之后的條件篩選AB表中的數據為空

你可能對aid=2這條記錄不滿足條件有疑問!原因是aid = 2這一行中有關b表的數據都是不存在的,所以數據庫不會對這行數據進行搜索匹配。(我的理解是bid和bname的是值為NULL不是null)

 

三、正確實現方案

select a.id as aid,a.name as aname,a.aage as age.b.id as bid,b.name as bname form  A as a left join B as b on b.a_id = a.id where a.id !=1 and (b.name != 'xx' or b.id is NULL);

執行順序:

第一步:先執行select a.id as aid,a.name as aname,a.aage as age.b.id as bid,b.name as bname form  A as a left join B as b on b.a_id = a.id 生成一張臨時表AB表(AB表名稱是隨便取的)

 

AB表

aid

aname

aage

bid

bname

1

張三

12

1

ss

2

李四

24

NULL

NULL

3

王二

13

2

xx

 

第二步:執行where之后的條件篩選AB表中的數據。

aid

aname

aage

bid

bname

2

李四

24

NULL

NULL

參考文檔:

https://blog.csdn.net/minixuezhen/article/details/79763263

https://www.cnblogs.com/lzh007blog/p/7656428.html

https://blog.csdn.net/sinat_30397435/article/details/52492272


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM