如果未指定“排序依据”,查询会为您的记录集选择啥顺序?

Posted

技术标签:

【中文标题】如果未指定“排序依据”,查询会为您的记录集选择啥顺序?【英文标题】:When no 'Order by' is specified, what order does a query choose for your record set?如果未指定“排序依据”,查询会为您的记录集选择什么顺序? 【发布时间】:2013-12-01 18:05:47 【问题描述】:

我一直认为没有指定“排序依据”规则的查询会按照 where 子句中指定的结果排序。

例如,我的 where 子句指出:

WHERE RESULTS_I_AM_SEARCHING_FOR IN
ITEM 1
ITEM 2
ITEM 3

我原以为第 1、2 和 3 项返回的结果将按照 where 中指定的顺序,但事实并非如此。有谁知道在未指定时它按什么顺序排序?

感谢和抱歉这个非常基本的问题!

达蒙

【问题讨论】:

基本上,如果您不太关心指定 ORDER BY 子句,则不应该关心选择了什么顺序。如果您确实关心结果顺序,请通过添加与您期望的匹配的 ORDER BY 子句来告诉 SQL Server。请注意,ORDER BY 子句可以通过引入可能低效的排序操作使查询变得更加昂贵。 请记住,如果没有 explicit 顺序规范,在更改表上的索引、更新到 SQL Server 之后,顺序可能会发生变化,...。这是为下一个选择维护代码的受害者留下定时炸弹的好方法。 【参考方案1】:

如果您没有指定ORDER BY,则定义了NO ORDER

结果可以以任意顺序返回 - 而且这也可能随着时间而改变。

在关系数据库中没有“自然顺序”或类似的东西(至少在我所知道的情况下)。获得可靠排序的唯一方法是明确指定 ORDER BY 子句。

更新:对于那些仍然不相信我的人 - 这里有两篇很好的博客文章说明了这一点(带有代码示例!):

Conor Cunningham(Core SQL Server 引擎团队的架构师):No Seatbelt - Expecting Order without ORDER BY Alexander Kuznetsov:Without ORDER BY, there is no default sort order(发布在网络档案中)

【讨论】:

非常感谢,感谢您对一些琐碎问题的回答! @Muhammed Ali 这是我的第一个假设,但在这种情况下,我必须使用的列上明显缺少主键!不幸的是,嘿! @MuhammedAli:它可能看起来像那样 - 但是没有ORDER BY没有订单保证。时期。习惯就好。 正确。喜欢 Conor Cunningham 的文章。 archive.org上有一个副本:web.archive.org/web/20130922121836/http://sqlblog.com/blogs/…【参考方案2】:

对于 SQL Server,如果未指定 ORDER BY,则以可能的最快方式返回结果。

因此,如果没有ORDER BY不对订单做任何假设

【讨论】:

【参考方案3】:

正如已经说过的,您永远不应该依赖“默认顺序”,因为它不存在。无论如何,如果你仍然想知道一些关于 sql server 实现的奇怪细节,你可以看看这个:

http://exacthelp.blogspot.co.uk/2012/10/default-order-of-select-statement-in.html

【讨论】:

感谢 Javier 的链接,我去看看。

以上是关于如果未指定“排序依据”,查询会为您的记录集选择啥顺序?的主要内容,如果未能解决你的问题,请参考以下文章

性能改进:左外连接、排序依据、子查询:主查询未拾取索引

访问选择查询记录集不可更新

10查询结果排序

路由策略

pycharm安装之后说未确认怎么办

为啥tplogin.cn老是域名解析错误