我有时读到写“a left join b”和“b right join a”是等价的。我以为我能理解这一点,但是我在一本书中读到这不是这样的。它说结果元组是相同的,但它们可能是按不同顺序排列的。我找不到对此的解释。我也尝试在我的本地MySQL服务器上重现这种顺序差异,但我无法做到。 唯一的区别似乎是属性的顺序。 有人可以向我解释何时或为什么会出现元组顺序的差异吗?
这比听起来要复杂得多。首先:
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
的等效语句是:
from c right join (b right join a)
a
中的每一行都将出现在结果集中。但是根据三个表之间的重叠情况,结果可能会有所不同。我有时会看到一些文章说,元组返回的顺序并不重要。实际数据库返回记录的顺序可能会发生变化,因为引擎决定使用索引或不使用索引找到更好的路径,或者因为数据块已经移动等等。关系理论和您选择的数据库之间存在很大差异。这并不是指MySQL。
b right join a
在幕后被视为a left join b
。但是是的,只要没有使用ORDER BY语句,服务器可以以任何顺序返回行。 - undefined