2011-10-18 127 views
5

我一直在尋找無遠弗屆,但我無法找到答案,可能是因爲我無法找出正確的方式來問這個問題。所以在這裏:是否有任何理由更喜歡這兩個查詢中的任何一個?JOIN的VS選擇從多個表中

SELECT * FROM table1, table2 WHERE table1.id = table2.id; 

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; 

這個問題從我試圖優化一個更復雜的查詢梗,但我認爲這兩個查詢包含了問題的實質,並希望通過要求在此方式對其他人更有用。提前致謝。

+0

第一個查詢是否工作?如果是這樣,我認爲它默默地進行某種形式的連接,但我不知道是什麼類型。 – eykanal

+0

它確實有效,我在發佈之前對它進行了測試。 ;) – Sophivorus

回答

4
SELECT * FROM table1, table2 WHERE table1.id = table2.id; 

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; 

將返回相同的結果。但是在這種情況下,你應該更喜歡第二個。第一種形式仍然廣泛遇到,因爲Oracle很長一段時間不支持第二種形式。

然而,說明INNER JOIN攜帶意圖,迫使你寫的條件,因爲INNER JOIN需要ON條款。對於較大的查詢,它使得查詢更具可讀性,並且使跳過連接謂詞更加困難。

另外請注意,我會傾向於讀第一種形式爲:採取兩個表的笛卡爾積,並且只保留有它在SQL表示爲SELECT * FROM table1 CROSS JOIN table2 WHERE table1.id = table2.id;兩個表相等IDS行。

5

其實這兩個查詢是一樣的,只是兩種不同的寫它的方式。我個人認爲後者爲用戶提供了更多的可讀性。

+0

更不用說我相信前者是[被棄用](http://blogs.technet.com/b/wardpond/archive/2008/09/13/deprecation-of-old-style-join-syntax-僅-A-局部thing.aspx)。 –

2

what I gather他們都是相同的。一個是另一個語法糖。

它被稱爲外顯與隱式連接符號。

+0

+1表示「顯式」與「隱式」。 – Benoit

2

它們是相同的。

大部分在基本格式看到的差異經常是不同的數據庫,例如Oracle和MySQL之間。傳統上,甲骨文聯接僅僅使用table.foreign_id = table2.id而MySQL的將使用table1 join table2 on table1.foreign_key = table2.id

是做同樣joininner joinleft inner joinleft join歷來變化,以實現從數據庫實現一點點,所以最好要檢查手工/文檔,以供目前的數據庫實施,以確保它正在做你想做的。

在最近時期的語法更加規範與ANSI標準,但人們使用什麼往往顯示他們的根!
這寫得很好的文章 -
http://www.google.com/url?sa=t&source=web&cd=4&ved=0CD8QFjAD&url=http%3A%2F%2Fwww.kingtraining.com%2Fconfdownloads%2Fdownloads%2FOracle9iJoin_paper.pdf&ei=LOGdTpfiFOrV0QH4zpmECQ&usg=AFQjCNHjicW-tWmJfZcXwNi220LxjGvNhg&sig2=4tdM2lfgQ6AqiYudWWTirg

給出了大量的詳細信息和歷史記錄並解釋各種內部和外部連接的非常好。