3

我主要在 Oracle 和 PostgreSQL 数据库中工作,但我很好奇是否有任何通用标准。正如标题所示,我一直在寻找有关Order BySQL 语句子句的问题的答案。例如,如果我有一些基本表Users

-------------------------------------------
| id |     name     | birth_date | gender |
-------------------------------------------
|  1 |  xx_coolKid  | 12-DEC-1960|   M    |
-------------------------------------------
|  2 |  def@test.co | 24-JUN-1976|   F    |
-------------------------------------------
|  3 |    NULL?     | 30-AUG-1990|   M    |
-------------------------------------------
|  4 |    JeffR     | 12-DEC-1960|   M    |
-------------------------------------------
|  5 |    lol19     | 12-DEC-1960|   F    |
-------------------------------------------

我要运行查询:

SELECT * FROM Users ORDER BY gender, birth_date;

gender返回的与和都匹配的行是否有任何特定顺序birth_date?还是不能保证那些匹配行的返回顺序,就好像没有ORDER BY定义子句一样?

4

1 回答 1

4

不保证退货单。这方面没有明确的标准。键具有相同值时的返回顺序是任意的,并且在同一数据库上相同数据的运行之间可能会发生变化。

一些排序算法是稳定的,这意味着输入上的记录顺序是隐式的最终顺序键。但是,数据库通常不实现稳定的排序。

Microsoft SQL文档order by实际上很好地解释了这一点:

要在使用 OFFSET 和 FETCH 的查询请求之间获得稳定的结果,必须满足以下条件:

(1) 查询使用的基础数据不得更改。也就是说,查询所涉及的行没有更新,或者查询中的所有页面请求都使用快照或可序列化事务隔离在单个事务中执行。有关这些事务隔离级别的详细信息,请参阅 SET TRANSACTION ISOLATION LEVEL (Transact-SQL)。

(2) ORDER BY 子句包含保证唯一的列或列组合。

这些条件在大多数数据库中都是正确的。

于 2013-02-28T01:59:26.963 回答