【问题标题】:Is FROM x JOIN y ON x.a = y.b equivalent to FROM x,y WHERE x.a=y.b? [duplicate]FROM x JOIN y ON x.a = y.b 是否等同于 FROM x,y WHERE x.a=y.b? [复制]
【发布时间】:2014-12-15 15:07:53
【问题描述】:

我注意到一些表格查询的测试数据

SELECT *
FROM a
JOIN b ON a.x = b.y
WHERE [more conditions...];

返回与表单查询相同的数据

SELECT *
FROM a,b
WHERE a.x = b.y
AND [more conditions...];

直觉上它们看起来是等价的,但我不相信会是这样。

我更喜欢使用JOIN 的查询,因为它将查询的一般结构与查询的特定业务逻辑分开。即使用JOIN 的查询的WHERE 部分中的条件是可以参数化的。

这些查询在哪些其他方面(如果有)不相同?

【问题讨论】:

  • 什么数据库平台?
  • 是的,在大多数 RDBMS 中,它们不仅会返回相同的记录,还会具有完全相同的执行路径。
  • @PatrickHofman 我在 MySQL 中使用 ISAM 表,但我对所有适用平台和引擎的答案感兴趣。
  • @AndrewMartin 仅供参考,你搜索 lyk 笛卡尔积 vs 内部也加入这个

标签: sql performance join syntactic-sugar equivalent


【解决方案1】:

这两种形式是等价的,但另一个原因

SELECT *
FROM a
JOIN b ON a.x = b.y
WHERE [more conditions...];

通常首选的是,如果您需要以不同的方式过滤事物,它会提供更大的灵活性。例如,想象一下 x 可能是null。您只需将连接类型更改为left join

【讨论】:

    【解决方案2】:

    一般的答案是肯定的。

    但是,您必须考虑到,随着您的 SQL 语句的复杂性,解析它们并确定它们在数据库中的执行计划的复杂性将会增加,这使得 ANSI 样式连接和常规连接更有可能没有相同的执行计划、性能和输出。

    在 Oracle 中肯定是这种情况,在其 ANSI 连接解析中仍然存在一些严重的错误(在 Oracle 支持中存在一些待处理的错误)。

    【讨论】:

      【解决方案3】:

      是的,根据《数据库系统基础》/ Ramez Elmasri、Shamkant B. Navathe 这本书,这两种方式的功能相似。 Online book link

      【讨论】:

        【解决方案4】:

        这些查询在逻辑上是相同的。新的 JOIN 表单 (SQL-92) 和旧的 , 表单之间的逻辑差异在于外连接表达式的工作方式。

        它们的不同之处在于代码质量。 SQL-89 形式在 20 多年前被 SQL-92 取代,新形式因其清晰性、更好的外连接标准采用和更强大的外连接表达能力而备受青睐。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-18
          • 2015-07-31
          • 2019-06-26
          • 1970-01-01
          相关资源
          最近更新 更多