mysql JOIN中ON和WHERE有什么区别?

3

2
精确重复?https://dev59.com/SXE85IYBdhLWcg3w432o近似重复:https://dev59.com/NnE85IYBdhLWcg3wikO- - KevenK
两者应返回相同的结果集,尽管它们可能使用不同的执行计划。 - Robert Harvey
2
没有区别,但如果使用外连接,就会有区别... - OMG Ponies
3个回答

1

区别只在于外连接。我要求你试着将其解析得简单易懂,我相信这会帮助你消除疑虑。这些可以重写为INNER JOIN,而且经常也会这样做。

SELECT * FROM t1
LEFT OUTER JOIN t2
  ON ( true )
  WHERE false

-vs-

SELECT * FROM t1
LEFT OUTER JOIN t2
  ON ( false )
  WHERE true

0

where子句通常会扫描任何连接的结果并过滤它们,因此可能会使查询变慢。然而,现代查询优化器可以将其潜在地推到连接过程中更早地进行处理,使其与使用where子句时一样快/等效。我选择在on期间加入以便不必担心优化器正在做什么。

注意:where子句也可以在连接上具有各种条件,例如

where t1.id = t2.id OR t1.pickmynose = 'TRUE'

这就是为什么它在那里可用(我认为),但除非需要,否则不应使用。


0

从你使用的方式(内连接)来看,我认为不会有任何问题。如果您使用外连接,您将会看到一个区别,因为ON子句不会过滤行,而是返回T1或T2字段全部为NULL的行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接