2013-02-02 99 views
0

可能重複:
INNER JOIN ON vs WHERE clauseSELECT * FROM人,people_emails,成員或INNER JOIN

我有以下兩個代碼:

SELECT * FROM people,people_emails,members 
WHERE people_emails_person=people_id 
AND members_person=people_id 

SELECT * FROM people 
INNER JOIN people_emails ON people_id = people_emails_person 
INNER JOIN members ON people_id = members_person 

它們都可以產生相同的結果,但哪個是正確的/更好的查詢使用?

+0

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 用ANSI - ** 92 ** SQL標準(** 20年前**!)廢止舊式*逗號分隔的表*樣式列表。 ***請停止使用它 –

回答

2

就目前來看,這兩個查詢是完全一樣的。第一個使用連接的「舊式」。

這是非常「過時」,使用第一種樣式。我認爲這種風格不太清楚,當這種風格被用來表達外部和右邊的連接時,這種風格就變得清晰起來。

有些人總是在第一個樣式做了,我敢肯定他們會說這樣的風格更清晰。

1

第二個是兩個更好,但兩者改善的餘地。通過選擇*您將自動選擇比您需要的更多字段。在你的情況下,因爲people_emails_person,people.people_id和members_person.people_id將始終具有相同的值,所以你只需要其中的一個。

回到你的問題,第二個是更好的原因是,它可能會運行得更快。

0

都是正確的,但是第一個查詢應該是更好,因爲WHERE語法是面向更關係模型。 無論如何,隱式JOIN ANSI語法較舊,不​​太明顯,不推薦使用。

+0

當你說「隱式JOIN ANSI語法」時,你指的是第一個例子(某些讀者可能不清楚)。 – Hogan

1

他們都是技術上等同,但如果你不是情侶對錶加入更多的(特別是如果他們是大表),你所遇到的查詢花費很長的時間來完成,它有時會有助於控制計劃順序,這可以通過顯式連接完成(第二個,使用INNER JOIN s)以及一些設置調整。

例如,如果您使用的是PostgreSQL,則可以設置join_collapse_limit=1以確保查詢按您指定的確切順序進行連接。這隻在使用顯式連接時才起作用。有時候這個計劃會做一些奇怪的,意想不到的事情,這會讓查詢變得非常緩慢,但是如果你知道你的方式會更快,並且想要告訴規劃者按照你的方式去做,你可以指定它。請閱讀this article about explicit joins in postgres瞭解更多信息。當然,這取決於你使用的是什麼SQL。