SQL a left join b -> b right join a:顺序不同

use*_*037 3 mysql sql database join

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

Gor*_*off 5

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

select *
from a left join b on . . . ;
Run Code Online (Sandbox Code Playgroud)

和:

select *
from b right join a on . . . ;
Run Code Online (Sandbox Code Playgroud)

可能会产生在两个方面有所不同的结果集:

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

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

  • 明确列出列。
  • 包括一个order by.

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

在下文中,我将省略这些on条款。考虑:

from a left join b left join c
Run Code Online (Sandbox Code Playgroud)

您可能会认为右连接的等价物是:

from c right join b right join a
Run Code Online (Sandbox Code Playgroud)

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

from (a left join b) left join c
Run Code Online (Sandbox Code Playgroud)

第二个是:

from (c right join b) right join a
Run Code Online (Sandbox Code Playgroud)

但与 s 等效的right join是:

from c right join (b right join a)
Run Code Online (Sandbox Code Playgroud)

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