1

可能重复:
ANSI 连接与“where 子句”连接

我们可以使用以下方法查询两个表,对吗?

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 有什么优势?

4

3 回答 3

4

执行上没有区别。这两个是相同的查询,只是写法不同。

于 2012-11-27T17:05:31.250 回答
2

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

一般来说,使用join比较灵活,除了inner join你还有left outer join,right outer joincross join

“旧式”连接的这些变体有语法,但这是非标准的,例如在 SQL Server 2005 中已弃用。

于 2012-11-27T17:24:48.337 回答
1

对于它的价值,INNER JOIN与“正常”查询的区别是不准确的。

逗号样式的连接语法在 ANSI SQL-89 标准中定义。然后他们意识到他们无法使用该语法进行某些类型的连接。正如@Guffa 所提到的,Oracle 和 Sybase 发明了他们自己的专有增强来连接语法来处理外连接。

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

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

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

我发现 SQL-92 JOIN 语法更清晰。如果您有多个表的连接,您可以将连接表达式放置在连接的表旁边。如果您使用旧语法,您的 WHERE 子句会被许多术语弄得杂乱无章,并且很难区分每个术语与哪个连接表一起使用。

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

于 2012-11-27T17:51:20.013 回答