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

时间:2012-03-03 22:38:49

标签: 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

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:11)

是,不,不。

具体来说:

  1. 是的,语法正确。从概念上讲,第一个查询使用连接条件t1t2t1.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. 不,见上文。

  4. 顺便说一句,以下编写相同查询的方法也是有效的:

    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