首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:查询的默认排序依据是什么?

问SQL:查询的默认排序依据是什么?
EN

Stack Overflow用户
提问于 2012-01-06 01:02:48
回答 4查看 59.6K关注 0票数 71

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

EN

回答 4

Stack Overflow用户

发布于 2012-01-06 01:18:34

没有这样的订单。摘自http://forums.mysql.com/read.php?21,239471,239688#msg-239688

当缺少order BY时,

  • 不依赖于ORDER。如果您想要一个特定的顺序,
  • 总是指定ORDER BY --在某些情况下,引擎可能会删除order BY,因为它会执行其他一些步骤。
  • GROUP BY强制ORDER BY。(这违反了标准。它可以通过使用ORDER by NULL来避免。)

SELECT * FROM tbl --这将执行“表扫描”。如果该表从未进行过任何删除/替换/更新,则记录将碰巧按插入顺序排列,这就是您所观察到的结果。

如果您对InnoDB表执行了相同的语句,则它们将按主键顺序而不是INSERT顺序传递。同样,这是底层实现的工件,而不是依赖的东西。

票数 68
EN

Stack Overflow用户

发布于 2012-01-06 01:11:09

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

票数 24
EN

Stack Overflow用户

发布于 2014-05-21 20:06:06

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

(我依稀记得Oracle在这方面与SQL Server相似。)

默认情况下,MySQL似乎是按照磁盘上的记录结构进行排序的(由于删除和优化,可能会包括无序的条目),但它通常会在一开始就欺骗开发人员,让他们不必使用order-by子句,因为数据似乎默认是主键排序,这种情况是!

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

我没有找到有关此更改的文档,但找到了notes on on implicit order in MySQL

默认情况下,MySQL按col1、col2、...对所有组进行排序。查询,就好像您指定了ORDER BY col1、col2、...在查询中也是如此。

但是:

MySQL 5.5中不推荐使用隐式GROUP BY sorting的

。要实现分组结果的特定排序顺序,最好使用显式order BY子句。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8746519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档