這兩個sql查詢有什麼區別?左連接(table1,table2)和左連接table1左連接表2有什麼區別2
select * from a
left join (b, c)
on a.id = b.uid and a.id = c.uid
select * from a
left join b on a.id = b.uid
left join c on a.id = c.uid
這兩個sql查詢有什麼區別?左連接(table1,table2)和左連接table1左連接表2有什麼區別2
select * from a
left join (b, c)
on a.id = b.uid and a.id = c.uid
select * from a
left join b on a.id = b.uid
left join c on a.id = c.uid
讓我們有這樣的數據:
A B C
id uid uid
-- --- ---
1 1 2
2
首先,第二查詢:
select * from a
left join b on a.id = b.uid
left join c on a.id = c.uid
ID UID UID
-- ---- ----
1 1 NULL
2 NULL 2
這應該是毫不奇怪 - 第二列從b
接合,並且其中有一個在b
沒有數據,NULL
被使用(外連接);第三列的行爲相同,僅適用於c
。
的第一個查詢,用CROSS JOIN
(這相當於)重寫以符合ANSI標準:
select * from a
left join (b CROSS JOIN c)
on a.id = b.uid and a.id = c.uid
ID UID UID
-- ---- ----
2 NULL NULL
1 NULL NULL
爲什麼有所有NULL
S'
首先,CROSS JOIN執行,但導致一個結果只有一個行:
b.UID c.UID
----- -----
1 2
然後,攜手進行左側,但沒有列在結果的交叉連接是對於b
和c
都將具有相同uid
,因此a
中的任何一行都不能匹配任何行。
select * from a
left join (b, c)
on a.id = b.uid and a.id = c.uid
相當於
select * from a
left join (b cross join c)
on (a.id = b.uid and a.id = c.uid)
在這裏您可以找到詳細 https://dev.mysql.com/doc/refman/5.7/en/join.html
謝謝。我可以從一個b或c得到的結果沒有額外的數據,我的第二個sql? – Tang3
我想,你從@Jiri Tousek得到了答案 –
第一個查詢不是有效的ANSI SQL。 – jarlh
它在mysql5.7中有效。@ jarlh – Tang3
當你不需要額外的努力就可以正確地寫出非可移植的代碼時,仍然是一個壞主意。 – jarlh