mysql中left join的誤解及笛卡爾積解釋

首先,說下自己一直以來的誤區:
left join(左外連接)查詢,已左表A爲基礎表,關聯右表B查詢,最多隻會返回A表裏面滿足條件的記錄。
這種想法是錯誤的,返回的記錄條數和兩表的關聯條件有關。

比如:

select   A.id,A.name,B.id,B.name   from  A  left   join  B   on   A.name = B.name 

如果name在關聯表B中不是唯一字段(唯一字段,可以直接用來確定唯一的一條記錄的字段,比如主鍵),
那麼返回的結果可能多於A表中滿足條件的記錄。

究其原因,只要是關聯查詢,首先都是進行笛卡爾積,然後根據連接條件和where條件進行條件過濾
如果只是對查詢結果的單表進行統計,一定要記得對結果進行去重.
示例:2.1
在這裏插入圖片描述
可以看到,由於B表中張三關聯2個職位,所以儘管是通過A表進行左外關聯查詢,但是最後實際查詢的結果,卻大於A表中實際滿足條件的記錄數。

所以,通過關聯查詢來進行數據統計的時候,一定要記得去重。

比如查詢經理職位的用戶的id集合:

select distinct A.id A left join B on A.name = B.name and b.zhiwei = ‘經理’

示例:2.1
Select * From A left join B on A.aid = B.bid;
在這裏插入圖片描述

left join是以A表的記錄爲基礎的,A可以看成左表,B可以看成右表,left join是以左表爲準的。 換句話說,左表A的記錄將會全部表示出來,而右表B只會顯示符合搜索條件的記錄(例子中爲: A.aid = B.bid),B表記錄不足的地方均爲NULL.

A表所有記錄都會顯示,A表中沒有被匹配的行(如aid=5、6的行)相應內容則爲NULL。
返回的記錄數一定大於A表的記錄數,如A表中aid=7行被B表匹配了3次(因爲B表有三行bid=7)。
注意:在Access中A.aid、B.bid不能縮寫成aid、bid,否則會提示“不支持鏈接表達式”,這一點不同於Where查詢

笛卡爾積
如果A表有20條記錄,B表有30條記錄,則二者關聯後的笛卡爾積工20*30=600條記實錄。也就是說A表中的每條記錄都會於B表的所有記錄關聯一次,三種關聯方式實際上就是對“笛卡爾積”的處理方式不同。

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