我有时读到它相当于写“左连接b”和“b右连接a”。我以为我会理解这一点,但我在一本书中读到情况并非如此。它说结果元组是相同的,但它们可能是不同的顺序。我无法找到解释。我也尝试在我的本地MySQL服务器上重现这种差异,但我不能。 唯一的区别似乎是属性的顺序。 任何人都可以向我解释元组顺序发生差异的时间或原因吗?
答案 0 :(得分:2)
我有时会读到返回元组的顺序是微不足道的。真实数据库返回记录的顺序可能会发生变化,因为引擎决定它找到了更好的路径,是否使用了索引,因为数据块已被移动,...关系之间存在很大差异理论和您选择的数据库。我并不是说MySQL。
答案 1 :(得分:0)
这比听起来更复杂。第一:
select *
from a left join b on . . . ;
和
select *
from b right join a on . . . ;
可能会产生两种不同的结果集:
这些都不会从集理论的角度影响结果集的等价性。但它们可能具有实际效果。一般来说,如果你关心订购,那么分别是:
order by
。更重要的一点是,当有多个连接时,left join
和right 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
中的每一行都将是结果集。但结果可能会有所不同,具体取决于三个表格之间的重叠。