【问题标题】:inner join vs normal query [duplicate]内连接与普通查询[重复]
【发布时间】:2012-11-28 01:51:20
【问题描述】:

可能重复:
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 有什么优势?

【问题讨论】:

标签: sql join


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      不管怎样,INNER JOIN 与“普通”查询的区别并不准确。

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

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

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

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

      我发现 SQL-92 JOIN 语法更清晰。如果您有多个表的连接,您可以将连接表达式放置在连接的表旁边。如果你使用旧的语法,你的 WHERE 子句会被很多术语弄得乱七八糟,而且很难区分每个术语与哪个连接表对应。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 2013-04-26
        • 1970-01-01
        • 2017-03-15
        • 2019-08-19
        相关资源
        最近更新 更多