2012-03-03 72 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