【问题标题】:Are INNER JOIN and OUTER JOIN necessary?INNER JOIN 和 OUTER JOIN 有必要吗?
【发布时间】:2013-10-28 23:12:33
【问题描述】:

我了解任何连接都可以通过 CROSS 连接和 WHERE 子句来完成。

我做了一些实验,看起来将相等谓词放在 where 子句中或作为内部连接的参数会产生相同的结果和相同的性能。

此外,使用内部连接不会节省任何输入,因为仍然必须指定连接谓词。

我想各种外连接也是如此。只需指定值可以为 null 或不为 null。

我可以只使用交叉连接吗?

【问题讨论】:

  • 答案是性能可能不会受到影响,但是,当您有经验丰富的开发人员查看交叉连接时,它们实际上是内部连接时,可读性和代码清晰度会受到阻碍。
  • 不,它们不是必需的。一切都只能基于笛卡尔积+联合和适当的 where 子句来实现。和性能无关,在大多数情况下,查询优化器比人类读者更能理解您的查询。可读性比击键次数更重要,你的代码只输入一次,但会被阅读数百次。

标签: sql database join


【解决方案1】:

CROSS 连接和 WHERE 子句不能完成任何连接。交叉、内部和外部的每个连接都有其自身的逻辑意义。

  1. 交叉连接仅适用于一个阶段——笛卡尔积。
  2. 内连接应用两个阶段——笛卡尔积和过滤器。
  3. 外连接应用三个阶段 - 笛卡尔积、过滤器和添加外行。

包含 OUTER JOIN 子句的查询的一个令人困惑的方面是是否在 ON 过滤器或 WHERE 过滤器中指定逻辑表达式。两者的主要区别在于 ON 在添加外部行之前应用,而 WHERE 在之后应用。 ON 过滤器从保留表中删除一行(指定为左外或右外)不是最终的,因为它将被添加回来; 相比之下,WHERE 过滤器对一行的删除是最终的。

ON 和 WHERE 子句之间的这种逻辑差异仅在使用外部子句时存在 当您使用内部联接时,无论您在 ON 子句中使用内部联接表运算符还是在 Where 子句中使用交叉联接表运算符指定逻辑表达式,都无关紧要。

希望对你有帮助!!!

【讨论】:

    【解决方案2】:

    答案是性能可能不会受到影响,但是,当您有经验丰富的开发人员在查看交叉连接时,它们实际上是内部连接时,可读性和代码清晰度会受到阻碍。除此之外,这是个人喜好问题。

    【讨论】:

    • 我同意:当我的最终语义是 INNER JOIN 时,我从不使用 CROSS JOIN。我发现很容易不小心错过 WHERE 中的一个关键条件。
    【解决方案3】:

    你的问题对了一半。您说您测试并比较了JOINs 和 Dekart 产品。你得到的结果是它们是相等的,但是大约一年前我在 MySQL 数据库上进行了相同的测试,JOINs 更快。这是因为 SQL 标准指明了应该如何执行连接操作,并且 Dekart 产品输出必须与 INNER JOIN 相同。

    因此,出于某些原因,我的建议是使用标准方式编写查询:

    1. 在 DBMS(数据库管理系统)上运行良好的查询可能在另一个上运行不佳。
    2. 同一 DBMS 的先前版本可能无法像后者一样优化 Dekart 产品。
    3. 可能是最重要的。带有JOINs 的查询结构更易于阅读和理解,因此更容易修改查询。

    总而言之,我的建议是改用JOINs。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2013-10-16
      • 2013-05-02
      • 1970-01-01
      • 2015-01-10
      • 2013-03-10
      • 2019-09-03
      相关资源
      最近更新 更多