先看執行個體
| 代碼如下 |
複製代碼 |
SELECT p.price, pd.name, m.manufacturers_name FROM (products p LEFT JOIN products_description pd ON p.products_id = pd.products_id) LEFT JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id |
關於 “A LEFT JOIN B ON 條件運算式” 的一點提醒
ON 條件(“A LEFT JOIN B ON 條件運算式”中的ON)用來決定如何從 B 表中檢索資料行。
如果 B 表中沒有任何一行資料匹配 ON 的條件,將會額外產生一行所有列為 NULL 的資料
在匹配階段 WHERE 子句的條件都不會被使用。僅在匹配階段完成以後,WHERE 子句條件才會被使用。它將從匹配階段產生的資料中檢索過濾。
聯集查詢效率分析
user表:
id | name
---------
1 | libk
2 | zyfon
3 | daodao
user_action表:
user_id | action
---------------
1 | jump
1 | kick
1 | jump
2 | run
4 | swim
sql:
| 代碼如下 |
複製代碼 |
select id, name, action from user as u left join user_action a on u.id = a.user_id |
result:
id | name | action
--------------------------------
1 | libk | jump ①
1 | libk | kick ②
1 | libk | jump ③
2 | zyfon | run ④
3 | daodao | null ⑤
分析:
注意到user_action中還有一個user_id=4, action=swim的紀錄,但是沒有在結果中出現,
而user表中的id=3, name=daodao的使用者在user_action中沒有相應的紀錄,但是卻出現在了結果集中
因為現在是left join,所有的工作以left為準.
結果1,2,3,4都是既在左表又在右表的紀錄,5是只在左表,不在右表的紀錄
結論:
我們可以想象left join 是這樣工作的
從左表讀出一條,選出所有與on匹配的右表紀錄(n條)進行串連,形成n條紀錄(包括重複的行,如:結果1和結果3),
如果右邊沒有與on條件匹配的表,那串連的欄位都是null.
然後繼續讀下一條。