【问题标题】:SQL a left join b -> b right join a: difference in orderSQL a left join b -> b right join a:顺序不同
【发布时间】:2018-02-11 11:15:38
【问题描述】:

我有时读到它相当于写“a left join b”和“b right jojn a”。我以为我会理解这一点,但我在一本书中读到事实并非如此。它表示结果元组是相同的,但它们的顺序可能不同。我找不到对此的解释。我也尝试在我的本地 MySQL 服务器上按顺序重现这种差异,但我做不到。 唯一的区别似乎是属性的顺序。 谁能向我解释一下何时或为什么会出现元组顺序的差异?

【问题讨论】:

  • 请引用书中的准确句子。此外,如果没有 ORDER BY 子句,则无法保证顺序,这适用于几乎所有查询。
  • 这是一本德文书籍。它说如果您在右连接中更改两个表并使用左连接,则返回的元组是相同的,但可以有不同的顺序。我认为 Gerard H. Pille 很好地回答了这个问题。
  • 我不同意这一点。至少在 MySQL 中,右连接被简化为左连接 (ref),因此 b right join a 在幕后被视为 a left join b。但是可以,只要没有 ORDER BY,服务器就可以按任何顺序返回行。
  • 这本书是德文的,这不是质量保证吗? ;-) 我发现阅读关系理论对于程序员来说非常令人耳目一新。这个是必须的:goodreads.com/book/show/6219481-sql-and-relational-theory
  • 本书没有参考数据库系统。所以尝试使用 MySQL 无法改变它。谢谢...谢谢你的书...会看看它。现在我会留下我的书,因为它是我们大学课程的参考书。读一本英文书肯定对我的英语技能有好处;)

标签: mysql sql database join


【解决方案1】:

这比听起来要复杂。第一:

select *
from a left join b on . . . ;

和:

select *
from b right join a on . . . ;

可能会产生两种不同的结果集:

  • 列的顺序不同。
  • 行的顺序可能不同。

从集合论的角度来看,这些都不影响结果集的等价性。但它们可能会产生实际影响。一般来说,如果您关心订购,那么分别:

  • 明确列出列。
  • 包括order by

更重要的一点是left joinright join 在有多个连接时不能互换,因为连接总是从左到右关联,无论类型如何。

在下文中,我将省略 on 子句。考虑:

from a left join b left join c

你会认为右连接的等价物是:

from c right join b right join a

但是,joins 被分组,所以第一个被解释为:

from (a left join b) left join c

第二个是:

from (c right join b) right join a

但与right joins 等价的是:

from c right join (b right join a)

在这两种情况下,a 中的每一行都将在结果集中。但根据三个表之间的重叠情况,结果可能会有所不同。

【讨论】:

    【解决方案2】:

    我有时读到返回元组的顺序无关紧要。现实生活中的数据库返回记录的顺序可能会改变,因为引擎决定它找到了更好的路径,使用索引或不使用索引,因为已经移动了一个数据块,......理论和您选择的数据库。我不是说MySQL。

    【讨论】:

    • 关系体是元组的集合,没有顺序。
    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2016-04-28
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多