2009-02-23 36 views
4

我只是想知道下面的所有連接在邏輯上是否相等,如果不是,爲什麼不呢?所有這些SQL連接在邏輯上是否相同?

SELECT t1.x, t2.y from t1, t2 where t1.a=t2.a and t1.b=t2.b and t1.c = t2.c; 

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a where t1.b=t2.b and t1.c = t2.c; 

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b where t1.c = t2.c; 

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b and t1.c = t2.c; 

我想我真正的問題是:「上」做一些只從具有「開」相與在一起的多條件組合的不同「其中」用?

我使用MySQL,以防萬一。

回答

5

它們在邏輯上是等效的,應該產生相同的結果。然而,最後一個是優選的,因爲它更準確地說明了查詢的語義 - 即「連接表t1和t2」。

WHERE子句應該用於「過濾」連接的結果 - 例如,

... WHERE t2.some_col > 10 

此外,正如康斯坦丁在另一個答案中所說,如果連接是一個外部連接,4個查詢將會不同。

+0

第一個查詢是否會完全執行交叉連接,還是DBMS足夠智能以便首先應用where子句? – 2009-02-23 17:16:36

+0

從SQL Server 2000版開始,將推斷頂層示例爲INNER JOIN。測試它並查看執行計劃 – 2009-02-23 17:18:48

2

是的,正如其他人所說的那樣,結果在所有這些查詢中都是相同的。

FWIW,你也可以使用這個簡寫語法當你做對是相同的兩個表中列名等值連接:

SELECT t1.x, t2.y from t1 join t2 using (a, b, c); 

至於優化,它應該是優化相同。也就是說,RDBMS應該足夠聰明,可以分析WHERE語法相同,並執行連接,而不是生成中間的巨大交叉連接結果並向其應用過濾條件。這是一種常見的查詢類型,對於給定的RDBMS實現來說,識別和優化它也很常見。

在MySQL的情況下,連接和哪裏(種)一起評估。嘗試使用EXPLAIN分析您的查詢。如果「type」列指示「eq_ref」,則表示它正在使用索引連接。這是與優化有關的最佳加入類型。如果「type」是「ref」,那也不錯。

無論是將條件放在JOIN...ON子句還是WHERE子句中,都可以獲得這些連接優化類型。

1

它們在邏輯上是等效的。但是,定義連接條件的位置會影響應用where子句的臨時表中使用的記錄數量。也就是說,

如果表T1,T2和T3各爲10條記錄,聲明,

SELECT t1.x, t2.y from t1, t2 where t1.a=t2.a and t1.b=t2.b and t1.c = t2.c; 

結果1000條記錄的三個表記錄的排列,然後應用where子句。

對於

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b and t1.c = t2.c; 

只有十個記錄在臨時表中的任何地方施加條款(在這種情況下無)之前。使用大型表格時,第二種方法要快得多。