2011-11-24 65 views
5

SQL 1:select * from t1 join t2 on t1.f1 = t2.f2這兩個SQL連接符號有什麼區別?

SQL 2:select * from t1,t2 where t1.f1 = t2.f2

結果,他們返回相同。他們之間有什麼不同嗎?例如,DBMS如何運行它們或者在查詢計劃中?

+5

http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference –

回答

11

這兩個查詢之間沒有操作差異。

但是,顯式連接符號是學習和使用的更好的樣式;遺留另一個遺留代碼(仍未更改)。

+1

感謝您的edit.my英語不夠好。 – SleeplessKnight

6

一個是舊的風格,一個是新的(ANSI)風格。我發現你爲什麼想要使用新風格的主要原因是標準支持外部聯接。以舊式,外連接是供應商特定的。新風格有它的標準:

select * from t1 left outer join t2 on t1.f1 = t2.f2 

在你的例子中,SQL 1是新的和SQL 2是舊的風格,順便說一句。

+0

你可能想指出哪個是'舊式',哪個是'新式'。 –

+0

好點。更新 –

+0

確實是供應商特定的意思,它取決於不同的SQL產品(如sqlserver和oracle)? – SleeplessKnight

1

基本上,兩個查詢在操作上沒有區別。

但是,兩者都具有相同的執行計劃並具有相同的成本,這意味着兩個查詢需要相同的時間執行(相同的性能)。

使用連接運算符是一種現代的方式。

1

這兩者在語義上相同(主題上的其他變體)。一個不同之處在於,Stackoverflow上的許多用戶非常樂於表達他們對「舊式」內部聯接(您的SQL 2)的不容忍,以至於任何發佈信息的人都有可能在評論中被警告而被低估。你也可能會看到應用「反模式」這個詞,這是無稽之談。我沒有遇到過SO社區以外的這種風格不容忍。事實上,「舊式」內部連接在SQL文獻中很常見。

+0

可能是因爲任何活動在SO SQL標記中的人都會[見](http://stackoverflow.com/q/7442344)[lots](http://stackoverflow.com/q/3056271)[of](of http://stackoverflow.com/q/7330433)[例子](http://stackoverflow.com/q/6156757)無意中的笛卡爾聯接,可以通過顯式的'JOIN'語法避免。 –

+0

@MartinSmith:你的邏輯是有缺陷的:我一直活躍在SO SQL標籤中一段時間​​,並沒有發展出對這種風格的不寬容;)我寧願認爲它是由於心理原因而發展的;我可以用'SELECT *'和'NATURAL JOIN'來描述相似之處,「如果......的話可能會發生不好的事情」 – onedaywhen