Mysql 由于SQL中没有默认的顺序,如果未指定order By,将如何确定返回的顺序行?

Mysql 由于SQL中没有默认的顺序,如果未指定order By,将如何确定返回的顺序行?,mysql,sql,sorting,Mysql,Sql,Sorting,我知道,如果一个SQL查询没有按Order by参数排序,它就根本没有排序。当运行没有ORDERBY的查询时,我希望以不同的顺序看到相同的结果 但是,结果仍然是按顺序返回的(即,有第1行、第2行等等),只是不可靠——因此,如果没有对结果进行排序,那么是什么决定了(可能是根据具体情况)返回行的顺序 具体来说,我的经验是使用MySQL,但我从理论角度对此感到好奇,而不是试图解决一个特定的问题 编辑:如果我真的想对查询进行排序,我总是使用Order By,这只是好奇而已。这取决于数据库:如果没有指定O

我知道,如果一个SQL查询没有按Order by参数排序,它就根本没有排序。当运行没有ORDERBY的查询时,我希望以不同的顺序看到相同的结果

但是,结果仍然是按顺序返回的(即,有第1行、第2行等等),只是不可靠——因此,如果没有对结果进行排序,那么是什么决定了(可能是根据具体情况)返回行的顺序

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


编辑:如果我真的想对查询进行排序,我总是使用Order By,这只是好奇而已。

这取决于数据库:如果没有指定
Order By
,SQL Server将根据聚集索引进行排序,因为这与磁盘上存储行的方式近似

对于其他DBs,所有的赌注都没有了,您可以看到原因:尽管其他供应商不一定采用与SQL Server相同的机制,但他们当然希望能够在磁盘/缓冲区/日志/块级别上自由地重新设计内容,而无需重新编写部分数据/查询解析引擎

第二,SQL作为一种声明性语言,与用户有一个协议,即您告诉它您想要什么,它决定如何获得它。如果不指定排序,则无法对返回的数据的顺序进行任何假设


编辑:添加在注释中指出的但书中。

当未指定“按排序”时,关于如何确定行顺序的答案是:许多内部注意事项取决于数据如何存储在磁盘(或内存)中,db执行查询的操作类型(例如,
JOIN
s),以及其他许多因数据库引擎而异的因素


总之,SQL标准都说dbms不必保证任何关于结果集排序的东西,除非您使用
orderby
。因此,理论上不存在违约。如果您需要以某种方式对数据进行排序,请始终使用
ORDER BY

,原因很明显,数据库供应商不会发布无序结果集中出现的订单行的信息(这只会导致人们依赖不可靠的当前实现)

然而,常识告诉我们,促成表面秩序的最可能因素包括:

  • 以任何格式存储的行的顺序(可能是聚集索引,对于存储SAM类型文件中记录的不变长度段或使用XML等可变长度机制的数据库,可能是行添加顺序,或者对于存储可变长度记录并在行大小增加时将其移动到存储文件末尾的数据库,可能是移动行添加的行),至少对于需要表扫描的搜索
  • 存在覆盖索引且从不查阅实际表的实例的索引顺序
  • 上述一项或另一项用于基于索引的搜索,这些搜索需要表中的附加数据,具体取决于实现

  • 不是一个落选的选民,但可能重复和许多others@LittleBobbyTables-谢谢,但这是在问是否有隐藏的默认顺序。我知道没有,但我只是想知道是什么决定了给定行的顺序-它只是数据库中相当于52张卡片的拾取?所有类似的问题都是这样说的“通过以下方式添加订单:",这当然是我在现实生活中所做的-这只是我想了解它背后的理论,而不是修复它。另外,用户名不错!也不是向下投票人,但对于DBA堆栈交换来说,这可能是一个更好的问题,因为它与编程无关。您要问的是官方未定义的行为,它允许每个实现者以尽可能便宜的方式返回行,即以经过所有前一阶段(筛选、联接、聚合等)处理后的方式返回行。不能保证它们将以物理、索引或任何其他顺序进行com。“如果没有指定顺序,SQL Server将按聚集索引排序”@Mike:谢谢你的链接:我站直了!只是出于兴趣:这是真的吗?或者这只是那些因草率而永久化的神话之一(正如我上面所展示的:))只是一个神话。您可以构建通常以聚集索引顺序返回行的表和查询,而无需使用
    orderby
    子句。这足以使这个神话永存。