由于SQL中没有默认顺序,如果未指定Order By,则返回的订单行是什么?

时间:2014-12-08 14:25:31

标签: mysql sql sorting

我知道如果SQL查询没有按Order By参数排序,它根本就没有排序。在没有订单依据的情况下运行查询时,我希望以不同的顺序看到相同的结果。

然而,结果 仍然按顺序返回(即有第1行,第2行等等),只是不可靠 - 所以如果它们不是排序,决定(可能根据具体情况)返回行的顺序。

具体来说,我的经验是MySQL,但我从理论角度对此感到好奇,而不是试图解决具体问题。

编辑:如果我真的想订购查询,我总是使用订单依据 - 这只是好奇心。

3 个答案:

答案 0 :(得分:2)

由于显而易见的原因,数据库供应商不会发布有关无序结果集中的行顺序的信息(这只会导致人们依赖于不可靠的当前实现)。

然而,常识告诉我们,导致明显秩序的最可能因素包括:

  1. 行的顺序顺序,无论它们存储在何种格式中(可能是聚集索引,在SAM类型文件中存储不变长度记录段的数据库的行添加顺序,或者使用可变长度机制,如XML,或者用于存储可变长度记录的数据库的行添加 - 除了移动行,并且当行大小增加时将它们移动到存储文件的末尾),至少对于需要进行表扫描的搜索而言。
  2. 存在覆盖索引并且从不咨询实际表的实例的索引顺序。
  3. 上述基于索引的搜索中的一个或另一个,需要根据实施情况从表中获取其他数据。

答案 1 :(得分:1)

在没有指定ORDER BY时确定行顺序的答案是:许多内部考虑因素可能取决于数据如何存储在磁盘(或内存中),哪些类型的操作db会执行您的查询(例如JOIN s),以及许多因数据库引擎而异的因素。

最重要的是,SQL标准都说dbms不必保证任何关于排序结果集的内容,除非你使用ORDER BY。所以,没有理论上的默认。如果您需要以某种方式对数据进行排序,总是使用ORDER BY

答案 2 :(得分:0)

它取决于数据库:under some curcunmstances如果没有指定ORDER BY,SQL Server将对聚簇索引进行排序,因为它近似于行如何存储在磁盘上。

对于其他数据库,所有投注都已关闭,您可以看到原因:即使其他供应商不一定采用与SQL Server相同的机制,他们当然希望能够自由地重新设计光盘/缓冲区/日志/块级别,无需重写部分数据/查询解析引擎。

其次,SQL作为声明性语言与您(用户)达成协议,您告诉它您想要什么,并决定 如何获取它。如果您没有指定排序,那么您就不能对您获得的数据的顺序做出任何假设。

编辑:在评论中指出的附带条款中添加。