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如何運行它們或者在查詢計劃中?
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如何運行它們或者在查詢計劃中?
一個是舊的風格,一個是新的(ANSI)風格。我發現你爲什麼想要使用新風格的主要原因是標準支持外部聯接。以舊式,外連接是供應商特定的。新風格有它的標準:
select * from t1 left outer join t2 on t1.f1 = t2.f2
在你的例子中,SQL 1是新的和SQL 2是舊的風格,順便說一句。
你可能想指出哪個是'舊式',哪個是'新式'。 –
好點。更新 –
確實是供應商特定的意思,它取決於不同的SQL產品(如sqlserver和oracle)? – SleeplessKnight
基本上,兩個查詢在操作上沒有區別。
但是,兩者都具有相同的執行計劃並具有相同的成本,這意味着兩個查詢需要相同的時間執行(相同的性能)。
使用連接運算符是一種現代的方式。
這兩者在語義上相同(主題上的其他變體)。一個不同之處在於,Stackoverflow上的許多用戶非常樂於表達他們對「舊式」內部聯接(您的SQL 2)的不容忍,以至於任何發佈信息的人都有可能在評論中被警告而被低估。你也可能會看到應用「反模式」這個詞,這是無稽之談。我沒有遇到過SO社區以外的這種風格不容忍。事實上,「舊式」內部連接在SQL文獻中很常見。
可能是因爲任何活動在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'語法避免。 –
@MartinSmith:你的邏輯是有缺陷的:我一直活躍在SO SQL標籤中一段時間,並沒有發展出對這種風格的不寬容;)我寧願認爲它是由於心理原因而發展的;我可以用'SELECT *'和'NATURAL JOIN'來描述相似之處,「如果......的話可能會發生不好的事情」 – onedaywhen
http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference –