对于具有相同键值的多行,ORDER BY 是否稳定?

Is ORDER BY stable for several rows with the same key values?

假设我有一个 table friends 比如:

name   | age
-------+----
Xi     | 60
Joel   | 34
Kanna  | 10000
Gawr   | 10000

我做了类似 SELECT * FROM friends ORDER BY age DESC LIMIT 1 的东西,结果将是 Kanna, 10000。但还有另一位候选人——高尔。认为结果绝对总是 Kanna, 10000 是否正确(因此,对于具有相同排序键 的行, 排序为 stable)?所有 RDBMS 都是这样吗?如果 - 仅针对其中一些,至少对 Postgres 来说是这样吗?

您的 ORDER BY 逻辑应该始终 足够具体以按照您想要的方式进行排序。所以如果你想让Kanna的记录在limit查询中排在第一位,你应该在name上添加降序排序级别:

SELECT * FROM friends ORDER BY age DESC, name DESC LIMIT 1;

即使 Postgres 的排序在某种顺序方面看起来是稳定的,但行为可能会随着基础数据的变化而变化。而且行为几乎肯定会因不同的数据库而异。

如果它在某些情况下是稳定的,那取决于实现。实现者没有义务使关系的顺序稳定。

例如,即使它在当前版本的 PostgreSQL 中是稳定的,他们也可以在下一个版本中以某种方式自由更改他们的代码,以更改默认顺序,或者使其因一次调用而变得不稳定查询下一次调用。他们这样做不会违反任何承诺或标准。

所以您不应该依赖它在同一品牌 RDBMS 的不同版本之间或不同品牌之间的稳定性。

ORDER BY 不是 stable。期间.

为什么不呢? SQL table 和结果集表示 无序 集(好吧,技术上是多集,因为它们可以有重复项)。

因此,没有可以依赖的“默认”排序。事实上,运行 相同数据的相同 ORDER BY 可能会导致不同的排序。

例如,排序可能甚至没有使用任何复杂的算法;它可能使用索引。 table 可以重新索引——并且 index 中的顺序可以更改,具体取决于重新索引算法。

排序可能“看起来”stable 因为它产生相同的结果。但是,如果没有默认顺序,您真的不能在任何数据库中调用它 stable 。如果您想要 stable 排序,请在 ORDER BY 列表中包含一个唯一键作为最后一个键。