【问题标题】:Difference between the AND statement in an Inner Join or in a WHERE clause内部联接或 WHERE 子句中的 AND 语句之间的区别
【发布时间】:2012-03-21 23:18:52
【问题描述】:

大家好,我有一个关于 SQL 中的 AND 子句的具体问题。

以下两个 SQL 语句提供相同的输出:

SELECT * FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id AND t2.id = 0


SELECT * FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id WHERE t2.id = 0

请注意查询末尾的差异。在第一个中,我使用了 AND 子句(之前没有使用 WHERE 子句)。在第二个中,我使用 WHERE 来指定我的 id。

  1. 第一个语法正确吗?
  2. 如果是,第一个在性能方面是否更好(不使用 WHERE 子句进行过滤)?
  3. 我应该期待不同的输出与不同的查询吗?

感谢您的帮助。

【问题讨论】:

  • 你可以看一下数据库生成的查询计划,看看有没有不同。对于 MySQL 数据库,您可以使用 EXPLAIN 语句执行此操作,对于其他数据库可能有类似的内容。

标签: mysql sql join inner-join


【解决方案1】:

是,不是,也不是。

具体来说:

  1. 是的,语法是正确的。从概念上讲,第一个查询使用连接条件t1.id = t2.id AND t2.id = 0t1t2 之间创建一个内连接,而第二个查询在t1.id = t2.id 上创建一个内连接,然后使用条件t2.id = 0 过滤结果。

    但是,我所知道的任何 SQL 引擎都不会真正执行这样的查询。相反,在这两种情况下,引擎都会将它们都优化为t1.id = 0 AND t2.id = 0,然后进行两次单行查找。

  2. 不,几乎任何合理的 SQL 引擎都应该将这两个查询视为实际上相同。

  3. 不,见上文。

顺便说一下,同样的查询,下面的写法也是有效的:

SELECT * FROM Table1 t1 INNER JOIN Table2 t2 WHERE t1.id = t2.id AND t2.id = 0

SELECT * FROM Table1 t1, Table2 t2 WHERE t1.id = t2.id AND t2.id = 0

【讨论】:

  • 不错的答案。使用 INNER JOIN,事情变得非常简单。使用 OUTER JOIN 和适当复杂的条件,过滤操作是在 JOIN 中还是在(主查询的)WHERE 子句中可能会有所不同。
  • 谢谢主要​​答案。是的,在外连接的情况下,我注意到了这个乔纳森。感谢您的输入!编辑:是的第二种方式 Ilmary 但我宁愿坚持使用 ANSI 语法。
  • 我认为 Ilmari Karonen 已经给出了很好的答案。使用 INNER JOIN ON 部分定义表之间的连接(如 t1.id = t2.id),并将 WHERE 部分用于业务规则,如 where t2.amount = 0。没有速度损失,只有为人类读者提供更清晰的代码。
  • 还有SELECT * FROM Table1 t1, Table2 t2 WHERE t1.id = 0 AND t2.id = 0
  • @Ilmari Karonen:Table1 t1 INNER JOIN Table2 t2 WHERE ... 仅在 MySQL 中有效。如果你做了CROSS JOIN,是的,它是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2017-05-02
相关资源
最近更新 更多