2012-03-03 39 views
3

Hello guys我有一个关于SQL中AND子句的具体问题。内部联接或WHERE子句中的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子句进行过滤)。我应该期望不同的查询有不同的输出吗?

感谢您的帮助。

+2

你可以看看由数据库生成的查询计划,看看它们是不同的。使用MySQL数据库,您可以使用EXPLAIN语句来完成此操作,但对于其他数据库,这可能与此类似。 – 2012-03-03 22:45:18

回答

11

是的,没有,没有。

具体来说:

  1. 是的,语法是正确的。从概念上讲,第一个查询创建t1t2之间的内部联接,联接条件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 
+0

短,甜,简单的+1! – Ben 2012-03-03 22:49:58

+2

很好的答案。通过INNER JOIN,事情非常简单。使用OUTER JOIN和适当复杂的条件,过滤操作是在JOIN还是在(主查询的)WHERE子句中可以有所不同。 – 2012-03-03 22:54:08

+0

Thx为主要答案。是的,我注意到这个乔纳森在外部连接的情况下。感谢您的输入!编辑:是的第二种方法Ilmary,但我宁愿坚持ANSI语法。 – Alex 2012-03-03 22:55:39