对于具有相同键值的多行,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
列表中包含一个唯一键作为最后一个键。
假设我有一个 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
列表中包含一个唯一键作为最后一个键。