大家好我在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子句进行过滤)。我应该期望不同的输出具有不同的查询吗?
感谢您的帮助。
答案 0 :(得分:11)
是,不,不。
具体来说:
是的,语法正确。从概念上讲,第一个查询使用连接条件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
的内容,然后进行两次单行查找。
不,几乎任何合理的SQL引擎都应该将这两个查询视为完全相同。
不,见上文。
顺便说一句,以下编写相同查询的方法也是有效的:
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