2012-04-20 26 views
9

可能重複:
Explicit vs implicit SQL joins
Is there a difference using join andselect from multi-tables?
SQL Joins: Future of the SQL ANSI Standard (where vs join)?簡單的SQL加入理解?

之間的區別是什麼JOIN和申報多個表FROM子句?

如:

SELECT * 
FROM table1 AS t1, 
     table2 AS t2 
WHERE t1.id = t2.id 

相比:

SELECT * 
FROM table1 AS t1 
INNER JOIN table2 AS t2 ON t2.id = t1.id 
+9

在第一個語法中更容易忘記添加=語句導致的問題..第二個語句更容易讀取和更難以得到錯誤... – 2012-04-20 14:47:44

+0

可能重複[SQL連接:未來的SQL ANSI標準(其中vs join)?](http://stackoverflow.com/questions/3684259/sql-joins-future-of-the-sql-ansi-standard-where-vs-join)或[MySQL:Inner join vs Where]( http://stackoverflow.com/questions/5273942/mysql-inner-join-vs-where)你把SQL-Server和MySQL放入你的標籤或通用的[Explicit vs implicit SQL joins](http:// stackoverflow。com/questions/44917/explicit-vs-implicit-sql-joins) – 2012-04-20 14:51:52

回答

8

的第二個版本,有明確JOIN和連接條件是標準化的SQL。

帶有WHERE子句的隱式連接語法是過時的語法(或者相反,認爲是不好的) - 部分原因是因爲很容易忘記WHERE子句並導致笛卡爾積。

2

兩者都會輸出相同的結果,只是寫入查詢的不同變體。

SELECT * 
FROM table1 AS t1 
INNER JOIN table2 AS t2 ON t2.id = t1.id 

是優選的加入方法,你正在明確說明使用的是哪種類型的連接,即LEFT,OUTER,INNER。

3

爲什麼使用新的語法?

正如其他人所說,新的語法已成爲首選的約定。在較大的查詢新語法更易於閱讀,調試,並確保連接標準添加(意味着沒有意外CROSS JOINS

是舊語法棄用(用於內部連接)?

不按ANSI - 兩者都是有效的,即使第一個是不合法的。儘管在舊語法中執行外部連接已被棄用 - 主要是因爲它可能不明確。

10「共同使用新語法」查看?

+0

你能爲這個答案定義一個「意外CROSS JOIN」的例子嗎? – KDawg 2013-02-02 19:06:41

+0

我也讀過這個「基本上,舊的語法相當於一個CROSS JOIN--當你想要一個INNER JOIN時,爲什麼要編寫一個CROSS JOIN?」這裏>>> http://www.sqlservercentral.com/blogs/brian_kelley/2009/09/30/the-old-inner-join-syntax-vs-the-new-inner-join-syntax/ 但是我仍然無法看到這可能導致「交叉連接」 – KDawg 2013-02-02 19:10:14

+1

@KDawg - 對於新語法在語法上是正確的,它*必須*具有'on'關鍵字(即'INNER JOIN tableA ** ON **') 。在舊的語法中,即使沒有where子句,查詢也會編譯並運行,更不用說正確的連接標準了。在這個簡單的例子中,很容易說出「你怎麼會錯過連接標準?」,但是在較大的複雜查詢中很容易,特別是當表的列表和where可以被11-gazillion的sql行分隔時。 – EBarr 2013-02-03 04:54:08