【问题标题】:MySQL - Left Joins are Officially Preferred Over Right Joins?MySQL - 左连接正式优先于右连接?
【发布时间】:2012-07-11 18:18:52
【问题描述】:

MySQL documentation for joins,一位同事今天向我指出了这颗宝石:

RIGHT JOIN 的工作方式类似于 LEFT JOIN。为了保持代码跨数据库的可移植性,建议您使用LEFT JOIN 而不是RIGHT JOIN

有人能解释一下吗?这让我觉得这可能是过去时代的残余——也许文档的意思是说“为了保持代码与早期版本的 MySQL 反向兼容......”

是否有不支持RIGHT JOIN 的现代RDBMS?我知道RIGHT JOINLEFT JOIN 的语法糖,任何RIGHT JOIN 都可以表示为LEFT JOIN,但是如果您朝那个方向编写查询,有时可读性会受到影响。

这个建议仍然现代有效吗?是否有充分的理由避免使用RIGHT JOIN

【问题讨论】:

  • 我倾向于避免右连接,因为我更习惯于考虑左连接,但有时它们很有用。相关Does anyone use Right Outer Joins?.
  • 我也倾向于使用左连接 - 在构建查询时,您倾向于从一个方向思考,从数据的内核开始,然后扩展,使左连接更多两者自然。但我很惊讶地看到 MySQL 文档说存在可移植性问题。
  • 我觉得很有趣的是,MySQL 手册关心可移植性,而他们在许多其他地方都忽略了它。
  • 使用从右到左语言的人是否倾向于更频繁地使用右连接?
  • Mathieu - 这是一个很好的问题 =) 我不确定他们是否这样做,因为并不是真正的 LtoR 与 RtoL 让左加入更自然,但更多的是倾向于从记录开始你想显示所有,然后用引用加入,这是左连接的方向。

标签: mysql


【解决方案1】:

至少有一个 SQL 引擎不支持RIGHT JOINSQLite。也许这就是兼容性被列为关注点的原因。可能还有其他 SQL 引擎。

【讨论】:

  • 了解有用 =)。尽管如此,正如 a_horse_with_no_name 所观察到的,当 MySQL 在许多其他领域无视连接之类的东西时,它会谈论可移植性,这很奇怪——我怀疑该建议可能更多地基于与早期 MySQL 版本的兼容性。
【解决方案2】:

因此,RIGHT 和 LEFT JOIN 在典型的 SQL 引擎中执行相同的操作。 LEFT JOIN 表a 到表b 返回a 中存在或不存在于b 中的所有内容。 RIGHT JOIN 表a 到表b 返回b 中存在或不存在于a 中的所有内容。在优化查询之前,LEFT 和 RIGHT 关键字仅指要对哪个表执行的操作。 MySQL 优化器将始终规范化查询并使 JOIN 有效地成为 LEFT JOIN。因此,编写查询以使用 LEFT JOIN 而不是 RIGHT 将在优化器中花费更少。

【讨论】:

    【解决方案3】:

    这是一个明智的约定,因此应该首选它,除非您想向以后可能会阅读它的任何人(重要的是,包括您自己)表达一些独特或与众不同的东西。

    您的问题是有效的,但要完成它需要:

    1) RIGHT JOIN 不运行或运行有显着差异的反例

    -或-

    2) 证明不存在这种情况:1

    我认为这些将很难获得。您认为该建议可能已被弃用,因为它的写作是可能的。这也可能是由于 MySQL 支持多个数据库后端的一些问题。也许其中之一是 RIGHT JOIN 不宽容?

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 2012-05-28
      • 2012-08-05
      • 2013-02-13
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      相关资源
      最近更新 更多