两个sql查询有什么区别?
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
答案 0 :(得分:1)
让我们得到这些数据:
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
都是?
首先,执行CROSS JOIN,但这会导致结果集只有一行:
b.UID c.UID
----- -----
1 2
然后,执行左连接,但交叉连接的结果中没有对uid
和b
具有相同c
的行,因此没有行可以匹配a
中的任一行。
答案 1 :(得分:0)
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