sql用法 - sql語法範例




顯式與隱式SQL連接 (8)

顯式與隱式內部聯接有效率差異嗎? 例如:

SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;

SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;

性能方面,它們是完全相同的(至少在SQL Server中),但請注意,它們不贊成使用此連接語法,並且SQL Server2005不支持它。

我認為你正在考慮已棄用的* =和= *運算符與“外部連接”。

我剛剛測試了兩種給出的格式,並且它們在SQL Server 2008數據庫上正常工作。 在我的情況下,他們制定了相同的執行計劃,但我無法自信地說這總是如此。


@lomaxx:為了澄清,我非常確定SQL Server 2005支持上述兩種語法。但是,下面的語法不支持

select a.*, b.*  
from table a, table b  
where a.id *= b.id;

具體而言,不支持外部聯接(* =)。


在一些數據庫(特別是Oracle)上,連接的順序可以對查詢性能產生巨大影響(如果有多於兩個的表)。 在一個應用程序中,我們在某些​​情況下幾乎有兩個數量級的差異。 如果使用正確的提示語法,使用內部連接語法可以控制這一點。

你沒有指定你正在使用哪個數據庫,但是可能性建議SQL Server或MySQL在那裡沒有真正的區別。


就我個人而言,我更喜歡連接語法,因為它更清楚地表明連接的表以及它們如何連接。 嘗試比較從8個不同表格中選擇的較大的SQL查詢,並在其中進行大量篩選。 通過使用連接語法,可以將表格連接的部分分隔到要過濾行的部分。


性能方面,它們完全相同(至少在SQL Server中)。

PS:請注意,自SQL Server 2005以來,不推薦使用IMPLICIT OUTER JOIN語法。(問題中使用的IMPLICIT INNER JOIN語法仍然受支持)

棄用“舊式”JOIN語法:只有部分內容


您給出的第一個答案使用了所謂的ANSI連接語法,另一個是有效的,並且可以在任何關係數據庫中工作。

我同意grom你應該使用ANSI連接語法。 正如他們所說,主要原因是為了澄清。 而不是使用包含很多謂詞的where子句,其中一些連接表和其他連接限制使用ANSI連接語法返回的行,使您明確地清楚哪些條件正在用於連接表以及哪些條件用於限制結果。



第二種語法具有交叉連接的不必要的可能性:您可以將表添加到FROM部分而不需要相應的WHERE子句。 這被認為是有害的。





join