SQL: 查询的默认 OrderBy 是什么?

当没有使用 ORDER BY时,查询的默认顺序是什么?

68457 次浏览

没有。根据您查询的内容以及查询的优化方式,您可以获得任何订单。甚至不能保证两个看起来相同的查询将以相同的顺序返回结果: 如果不指定它,就不能依赖它。

There is no such order present. Taken from http://forums.mysql.com/read.php?21,239471,239688#msg-239688

  • 当 ORDERBY 丢失时,不要依赖于顺序。

  • 如果需要特定的顺序,始终指定 ORDERBY ——在某些情况下,引擎可以消除 ORDERBY,因为它是如何 做一些其他的步骤

  • 按兵力分组。(这是违反标准的。使用 ORDERBYNULL 可以避免这种情况。)

SELECT * FROM tbl-这将做一个“表扫描”。如果表有 没有任何 DELETE/REPLACE/UPDATE,记录碰巧是 在插入顺序中,因此你观察到。

If you had done the same statement with an InnoDB table, they would 已按主键顺序交付,而不是按插入顺序交付, 这是底层实现的一个工件,而不是 依赖。

默认顺序将取决于查询中使用的索引以及它们的使用顺序。它可以随着数据/统计信息的变化和优化器选择不同的计划而变化。

如果希望数据按特定顺序排列,请使用 ORDERBY

我发现 SQLServer 的默认顺序几乎是随机的(取决于数据的年龄和复杂性) ,这很好,因为它迫使您指定所有的顺序。

(我依稀记得 Oracle 在这方面类似于 SQLServer。)

默认情况下,MySQL 似乎是按照磁盘上的记录结构排序的(由于删除和优化,它可能包含不按顺序的条目) ,但是它最初常常愚弄开发人员,让他们不必费心使用 order-by 子句,因为数据似乎是默认的主键排序,这就是 没有的情况!

今天我惊讶地发现,MySQL 5.6和4.1隐式次序记录是按照分辨率有限的 朝相反的方向列排序的。我的一些结果具有相同的排序值,并且总体顺序是不可预测的。例如,在我的例子中,它是一个按日期时间列排序的 DESC,并且一些条目在同一秒内,因此它们不能被显式排序。在 MySQL 5.6中,他们按照一个顺序(插入的顺序)选择,但是在4.1中,他们向后选择!这导致了一个非常恼人的部署错误。

我还没有找到关于这个更改的文档,但是找到了 notes on on implicit group order in MySQL:

默认情况下,MySQL 对所有 GROUP BY col1,col2,... 查询进行排序,就像在查询中指定 ORDERBYcol1,col2,... 一样。

然而:

不推荐使用 MySQL 5.5中的隐式 GROUP BY 排序。要实现分组结果的特定排序顺序,最好使用显式的 ORDERBY 子句。

因此,与其他答案一致——永远不要依赖于任何数据库中的默认或隐式排序。