什么是默认的 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
是可选的。 INNER
和 CROSS
在 MySQL 中是同义词。为清楚起见,如果我有连接条件,我写 JOIN
或 INNER 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?的主要内容,如果未能解决你的问题,请参考以下文章