MySQL JOIN的默认默认行为是INNER或OUTER?


91

因此,我在过去的一个小时里一直在互联网上浏览,阅读并寻找这个简单问题的明确答案。

MySQL中的默认JOIN是什么?

SELECT * FROM t1 JOIN t2

是一样的吗

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

还有一个相关的问题,当您使用“ WHERE”子句时,它是否与JOIN或INNER JOIN相同?

现在,我认为独立的JOIN与使用逗号和WHERE子句相同。

Answers:


124

在MySQL中,写JOIN不合格的隐含含义INNER JOIN。换句话说,INNERin INNER JOIN是可选的。INNERCROSS在MySQL的同义词。为了清楚起见,我写JOIN或者INNER JOIN如果我有一个连接条件,CROSS JOIN如果我没有条件。

文档中介绍了允许的联接语法。


现在,我认为独立的JOIN只是(使用)逗号和WHERE子句而已。


效果是一样的,但是背后的历史却不同。逗号语法来自ANSI-89标准。但是,这种语法存在许多问题,因此在ANSI-92标准中引入了JOIN关键字。

我强烈建议您始终使用JOIN语法而不是逗号。

  • T1 JOIN T2 ON ...比更具可读性T1, T2 WHERE ...
  • 它更易于维护,因为表关系和过滤器已明确定义,而不是混合在一起。
  • 与逗号语法相比,JOIN语法更容易转换为OUTER JOIN。
  • 由于优先规则,在同一条语句中混合使用逗号和JOIN语法会产生奇怪的错误。
  • 由于遗忘了join子句,因此在使用JOIN语法时不太可能意外地创建笛卡尔乘积,因为join子句写在joins的旁边,很容易看出是否缺少。

亲爱的,感谢您为我澄清了这个简单的问题:)过去,我一直使用逗号+ where子句...,但是根据您的建议,它将转换为使用JOIN。谢谢
Quang Van 2010年

嗨,马克,JOIN和逗号的混合使用是什么意思。混合这样的查询,SELECT * FROM t1左联接(t2,t3,t4)ON(t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)?
Quang Van 2010年

2
@Quang:例如,这将失败:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers 2010年

0

这些都是等效的,也等于CROSS JOIN

使用逗号和[INNER | CROSS] JOIN语法之间存在一些差异,这在连接更多表时可能很重要。MySQL JOIN文档中描述了几乎所有您需要了解的内容


1
^ ---问题的答案是JOIN(独立)对于INNER和逗号+ where子句基本上是同一回事
Quang Van 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.