我一直专注于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;
对于gender
和birth_date
匹配的返回行,是否有任何特定顺序?或者是否保证那些匹配行的返回顺序,就好像没有定义ORDER BY
子句一样?
答案 0 :(得分:4)
无法保证退货订单。这方面明确没有标准。键具有相同值时的返回顺序是任意的,并且可能在同一数据上的同一数据库上运行之间发生更改。
某些排序算法是稳定的,这意味着输入上的记录顺序是隐式最终订单键。但是,数据库通常不会实现稳定的排序。
order by
上的Microsoft SQL documentation实际上很好地解释了这一点:
使用OFFSET和查询请求之间获得稳定的结果 FETCH,必须满足以下条件:
(1)基础数据 查询使用的一定不能更改。也就是说,要么触摸行 由查询未更新或来自查询的所有页面请求 使用快照或在单个事务中执行 可序列化的事务隔离。有关这些的更多信息 事务隔离级别,请参阅SET TRANSACTION ISOLATION LEVEL (处理SQL)。
(2)ORDER BY子句包含列或组合 保证唯一的列。
在大多数数据库中都会出现这些情况。