mysql - SQL a left join b -> b right join a : difference in order

标签 mysql sql database join

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

最佳答案

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

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

和:

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

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

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

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

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

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

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

from a left join b left join c

你会认为与 right join 等价的是:

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 joins 等价的是:

from c right join (b right join a)

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

关于mysql - SQL a left join b -> b right join a : difference in order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48730898/

相关文章:

PHP Pdo 数组中没有列名

MySQL order by count子查询

php - 在 TIMESTAMP 字段中存储一个已经是 UTC 的时间戳,而无需在 MySQL 中进一步转换

php - 获取mysql中列的总和

sql - 如何从 SQL Server 2005 函数中抛出异常?

sql-server - 恢复数据库备份时出错

sql - Oracle 中的合并表,删除条件引用源表

sql - 获取指定列为空的第一组行

python - 无法使用 cur.execute 更新数据库?

sql - 作为Sqlplus中的系统,我如何查询另一个用户的表?