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

Posted

技术标签:

【中文标题】什么是默认的 MySQL JOIN 行为,INNER 或 OUTER?【英文标题】:What is the default MySQL JOIN behaviour, INNER or OUTER? 【发布时间】:2011-05-24 01:22:45 【问题描述】:

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

mysql 中默认的 JOIN 是什么?

SELECT * FROM t1 JOIN t2

是一样的

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

还有一个相关的问题,当你使用“WHERE”子句时,它与JOIN或INNER JOIN一样吗?

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

^--- 问题的答案是 JOIN(独立)基本上与 INNER 和逗号+where 子句相同【参考方案2】:

在 MySQL 中,JOIN 不合格意味着INNER JOIN。换句话说,INNER JOIN 中的INNER 是可选的。 INNERCROSS 在 MySQL 中是同义词。为清楚起见,如果我有连接条件,我写 JOININNER JOIN,如果我没有条件,我写 CROSS JOIN

documentation 中描述了允许的连接语法。


现在我认为独立的 JOIN 只不过是(等同于)使用逗号和 WHERE 子句。


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

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

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

【讨论】:

太好了,感谢您为我澄清了这个简单的问题 :) 过去我一直使用逗号+where 子句...但将根据您的建议转换为使用 JOIN。谢谢 嘿,马克,你说的 JOIN 和逗号的混合是什么意思。像这样混合查询,SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c) ? @Quang:例如这将失败:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b

以上是关于什么是默认的 MySQL JOIN 行为,INNER 或 OUTER?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL LEFT JOIN 的怪异行为

MYSQL LEFT JOIN 的怪异行为

mysql中多表连接(不使用join )为啥 超过三张表就报错?

mysql from 逗号 是join的简写吗

mysql join 有多少种

mysql join 谁是驱动表