2014-10-20 103 views
0

我注意到的是,形式的查詢是FROM x JOIN y ON x.a = y.b相當於FROM x,y WHERE x.a = y.b?

SELECT * 
FROM a 
JOIN b ON a.x = b.y 
WHERE [more conditions...]; 

分別爲形式

SELECT * 
FROM a,b 
WHERE a.x = b.y 
AND [more conditions...]; 

直覺,他們似乎等同的查詢返回相同的數據的一些測試數據,但我不相信這是這樣的。

我更喜歡使用JOIN的查詢,因爲它將查詢的通用結構與查詢的特定業務邏輯分開。即,使用JOIN的查詢的WHERE部分中的條件是可以參數化的條件。

在哪些其他方式,如果有的話,這些查詢是不是完全相同?

+0

什麼是數據庫平臺? – 2014-10-20 15:11:49

+2

這可能會幫助你http://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins – 2014-10-20 15:12:19

+0

是的,在大多數RDBMSs中,它們不僅會返回相同的記錄,而且會具有完全相同的執行路徑好。 – JNevill 2014-10-20 15:13:27

回答

1

這兩種形式是等價的,但另一個原因

SELECT * 
FROM a 
JOIN b ON a.x = b.y 
WHERE [more conditions...]; 

往往是首選的是,它提供了更多的靈活性,如果你需要一個稍微不同的過濾器的東西。想象一下,例如,x可能是null。您只需將加入類型更改爲left join即可。

1

這些查詢在邏輯上是相同的。新的JOIN表單(SQL-92)和較早的,表單之間的邏輯差異在於外連接表達式如何工作。

它們不相同的地方在於代碼質量。 SQL-89表單在20多年前被SQL-92所取代,而新的表單更清晰,外部聯接的標準更好,外部聯接的表達能力更強。

0

是的,這兩種方式的功能類似,根據書籍:數據庫系統基礎/ Ramez Elmasri,Shamkant B. Navathe。 Online book link

1

一般答案是肯定的。

但是,您必須考慮到,隨着您的SQL語句的複雜性,解析它們並確定它們在數據庫中的執行計劃的複雜性將會增加,從而使ANSI風格的聯接和常規聯接更可能沒有相同的執行計劃,性能和輸出。

這在Oracle中確實是這樣,它在ANSI連接解析中仍然存在一些嚴重的錯誤(在Oracle支持時有一些懸而未決的錯誤)。

相關問題