当多个记录对“Order By”子句中定义的列具有相同的值时,是否存在从数据库返回的行的隐式顺序?

时间:2013-02-28 01:56:42

标签: sql database select sql-order-by

我一直专注于Oracle和PostgreSQL数据库,但我很好奇是否有任何通用标准。正如标题所示,我一直在寻找有关SQL语句的Order By子句的问题的答案。例如,如果我有一些基本表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;

对于genderbirth_date匹配的返回行,是否有任何特定顺序?或者是否保证那些匹配行的返回顺序,就好像没有定义ORDER BY子句一样?

1 个答案:

答案 0 :(得分:4)

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

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

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

  

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

     

(1)基础数据   查询使用的一定不能更改。也就是说,要么触摸行   由查询未更新或来自查询的所有页面请求   使用快照或在单个事务中执行   可序列化的事务隔离。有关这些的更多信息   事务隔离级别,请参阅SET TRANSACTION ISOLATION LEVEL   (处理SQL)。

     

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

在大多数数据库中都会出现这些情况。