2012-11-27 38 views
1

可能重复:
ANSI joins versus “where clause” joins内部联接与正常查询

我们可以通过下面的方法正确查询两个表?

SELECT customer.name 
FROM customer 
INNER JOIN order 
ON customer.cus_id=order.cus_id 
ORDER BY customer.name 


SELECT c.name 
FROM customer c, order o 
WHERE 
c.cus_id=o.cus_id 
ORDER BY c.name 

将join用于后者的优点是什么?

+0

它们都是连接 - 后者只是使用隐式连接符号。请参阅:http://en.wikipedia.org/wiki/Join_(SQL)#Inner_join – nickhar

回答

4

执行没有区别。这两个是刚刚写入不同的相同查询。

2

对于这两个确切的查询没有区别。查询计划员将为他们创建完全相同的查询计划。

一般来说,使用join更加灵活,除了inner join你也有left outer joinright outer joincross join

有针对“旧风格”加入这些变化的语法,但毕竟是非标准的,例如在SQL Server 2005中

1

弃用对于什么是值得的INNER JOIN的区别与“正常“查询不准确。

逗号样式连接语法在ANSI SQL-89标准中定义。然后他们意识到他们不能用这种语法做一些类型的连接。正如@Guffa提到的,Oracle和Sybase发明了自己专有的增强功能来加入句法来处理外连接。

在ANSI SQL-92中,标准引入了INNER/OUTER JOIN语法选项。但为了向后兼容,旧语法仍然受支持,至今仍在规范中。所以他们都是标准。

自从显式连接语法成为官方SQL标准的一部分以来,它已经有20年了。现在是时候您接受作为“正常”语法。

哪种性能更好?他们都表现完全一样。所有合理的SQL实现都以相同的方式处理连接,并且这两种语法形式都调用相同的代码。

我发现SQL-92 JOIN语法更清晰。如果您有多个表的联接,则可以将联接表达式放置在联接表的旁边。如果你使用旧的语法,你的WHERE子句会混杂许多术语,而且很难理清每个术语使用哪个连接表。

有些人坚持旧的SQL-89风格更清晰,但他们错了。 :-)