内连接与普通查询

时间:2012-11-27 17:03:30

标签: sql join

  

可能重复:
  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

在后一种情况下使用连接有什么好处?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

一般来说,使用join会更灵活,除了inner join您还有left outer joinright outer joincross join

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

答案 2 :(得分:1)

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

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

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

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

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

我发现SQL-92 JOIN语法更清晰。如果您有许多表的连接,则可以将连接表达式放在连接表的旁边。如果使用旧语法,WHERE子句会被许多术语弄得乱七八糟,并且很难理清每个术语所使用的连接表。

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