内部联接或WHERE子句中的AND语句之间的差异

Ale*_*lex 3 mysql sql join inner-join

大家好我在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
Run Code Online (Sandbox Code Playgroud)

请注意查询结尾处的差异.在第一个中我使用AND子句(之前不使用WHERE子句).在第二个中,我使用WHERE来指定我的id.

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

谢谢你的帮助.

Ilm*_*nen 11

是的,不,不.

再具体一点:

  1. 是的,语法是正确的.从概念上讲,第一查询创建之间内部联接t1,并t2与所述连接条件t1.id = t2.id AND t2.id = 0,而第二个产生一个内连接上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
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.通过INNER JOIN,事情非常简单.使用OUTER JOIN和适当复杂的条件,无论过滤操作是在JOIN中还是在(主查询的)WHERE子句中,它都会有所不同. (2认同)