这两个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