SQL左连接b - > b右加入a:顺序不同

时间:2018-02-11 11:15:38

标签: mysql sql database join

我有时读到它相当于写“左连接b”和“b右连接a”。我以为我会理解这一点,但我在一本书中读到情况并非如此。它说结果元组是相同的,但它们可能是不同的顺序。我无法找到解释。我也尝试在我的本地MySQL服务器上重现这种差异,但我不能。 唯一的区别似乎是属性的顺序。 任何人都可以向我解释元组顺序发生差异的时间或原因吗?

2 个答案:

答案 0 :(得分:2)

我有时会读到返回元组的顺序是微不足道的。真实数据库返回记录的顺序可能会发生变化,因为引擎决定它找到了更好的路径,是否使用了索引,因为数据块已被移动,...关系之间存在很大差异理论和您选择的数据库。我并不是说MySQL。

答案 1 :(得分:0)

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

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

但是,join被分组,因此第一个被解释为:

from (a left join b) left join c

第二个是:

from (c right join b) right join a

但与right join s的等价物是:

from c right join (b right join a)

在这两种情况下,a中的每一行都将是结果集。但结果可能会有所不同,具体取决于三个表格之间的重叠。