2012-04-20 71 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