在sql语句中,ORDERBY子句的功能是()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在sql语句中,ORDERBY子句的功能是()相关的知识,希望对你有一定的参考价值。

ORDER
BY是对查询的结果进行排序,默认是按顺序排序
ORDER
BY
字段
DESC
是按倒序排序
参考技术A 排序
ORER
BY
子句一般位于SELECT语句的最后,它的功能是对查询返回的数据进行重新排序。
用户可以通过ORER
BY
子句来指定查询结果的输出训序,如升序(ASC)或降序(DESC)
eg:检查客户表中所有客户的信息,如按客户编号的降序显示。
SELECT
*
客户表
ORER
BY
客户编号
DESC

没有 Order By 子句的 SQL Select 语句的顺序

【中文标题】没有 Order By 子句的 SQL Select 语句的顺序【英文标题】:The order of a SQL Select statement without Order By clause 【发布时间】:2012-04-21 07:32:01 【问题描述】:

据我所知,从关系数据库理论来看,没有order by 子句的select 语句应该被认为没有特定的顺序。但实际上在 SQL Server 和 Oracle 中(我已经在这两个平台上进行了测试),如果我从没有 order by 子句的表中多次查询,我总是以相同的顺序得到结果。这种行为可以依赖吗?谁能帮忙解释一下?

【问题讨论】:

不,不能依赖。在 SQL Server 中,如果您不指定顺序,那么您可能会获得索引扫描或分配有序扫描。另外,您可能还会遇到“高级扫描”/旋转木马扫描功能。 添加 ORDER BY 子句。故事结束。 是的,可以信赖。可以依靠它在最不合时宜的时候不能像以前依靠它工作的方式工作:-) 如果您知道您想要和期望的顺序,那么省略ORDER BY 有什么意义?这些击键真的值得在可预测性上进行交易吗? 【参考方案1】:

不,不能依赖这种行为。顺序由查询计划器决定构建结果集的方式确定。像select * from foo_table 这样的简单查询可能会按照它们存储在磁盘上的顺序返回,这可能是主键顺序或创建顺序,或其他随机顺序。更复杂的查询,例如select * from foo where bar < 10,可能会根据索引读取或表顺序按不同列的顺序返回,以进行表扫描。更复杂的查询,具有多个 where 条件、group by 子句、unions,将按照规划器决定最有效的生成顺序。

仅仅因为两个查询之间的数据发生了变化,两个相同查询之间的顺序甚至可能发生变化。 “where”子句可能会满足一个查询中的索引扫描,但后来的插入可能会降低该条件的选择性,并且规划器可以决定使用表扫描执行后续查询。


更详细地说明它。 RDBMS 系统的任务是尽可能高效地准确为您提供您所要求的。这种效率可以采取多种形式,包括最小化 IO(到磁盘以及通过网络向您发送数据)、最小化 CPU 并保持其工作集的大小较小(使用需要最少临时存储的方法)。

如果没有ORDER BY 子句,您将不会确切地询问特定的顺序,因此 RDBMS 会以某种顺序为您提供那些(可能)与某些巧合方面相对应的行查询,基于 RDBMS 期望以最快速度生成数据的算法。

如果您关心效率而不是顺序,请跳过ORDER BY 子句。如果您关心顺序而不关心效率,请使用ORDER BY 子句。

既然您真的关心BOTH,请使用ORDER BY,然后仔细调整您的查询和数据库,使其高效。

【讨论】:

始终包含ORDER BY 的另一个原因是称为 SQL Server 企业高级扫描(又名旋转木马扫描)的功能。 (在 Dmitri Korotkevitch 的优秀 Pro SQL Server Internals 中提到)【参考方案2】:

不,您不能依赖每次都以相同的顺序返回结果。我在处理带有分页网格的网页时发现了这一点。当我转到下一页,然后再回到上一页时,上一页包含不同的记录!我完全被迷惑了。

为了获得可预测的结果,您应该包含ORDER BY 即使这样,如果那里的指定列中有相同的值,您可能会得到不同的结果。您可能必须 ORDER BY 字段,而您并不认为自己真的需要,只是为了获得可预测的结果。

【讨论】:

【参考方案3】:

Tom Kyte 有一个pet peeve about this topic。无论出于何种原因,人们都对此着迷,并不断尝试提出可以依赖特定订单而不指定 ORDER BY 的案例。正如其他人所说,你不能。这是 AskTom 网站上有关该主题的another amusing thread。

【讨论】:

【参考方案4】:

正确答案

这是为更正旧答案而添加的新答案。我从 Tom Kyte 那里得到了答案,我把它贴在这里:

如果您想要对行进行排序,您必须使用订单。不,如果,并且,或但是关于它。时期。 http://tkyte.blogspot.ru/2005/08/order-in-court.html您需要在该物联网上订购。行在叶块中排序,但叶块未排序存储。快速全扫描=未排序的行。

https://twitter.com/oracleasktom/status/625318150590980097

https://twitter.com/oracleasktom/status/625316875338149888


错误的答案

(注意!原题的答案放在下面,只是为了历史,是错误的答案,正确的答案放在上面)

正如汤姆凯特在之前提到的文章中所写:

您应该将堆组织表视为一个大的无序表 行的集合。这些行将以看似随机的方式出现 顺序,并取决于使用的其他选项(并行查询, 不同的优化器模式等等),它们可能会以不同的方式出现 使用相同的查询订购。永远不要指望行的顺序 一个查询,除非您的查询中有 ORDER BY 语句!

但请注意,他只谈论堆组织表。但也有索引组织表。在这种情况下,您可以在没有ORDER BY 的情况下依赖选择的顺序,因为顺序由主键隐式定义。对于甲骨文来说确实如此。

用于默认创建的 SQL Server 聚集索引(索引组织表)。 PostgreSQL 存储信息也可以按索引对齐。更多信息可以找到here

更新: 我明白了,有人对我的回答投了反对票。所以我会试着稍微解释一下我的观点。 在 Overview of Index-Organized Tables 部分中有一句话:

在索引组织表中,行存储在表的主键上定义的索引中...当相关的数据必须存储在一起或数据必须物理存储在具体顺序。

http://docs.oracle.com/cd/E25054_01/server.1111/e25789/indexiot.htm#CBBJEBIH

因为有索引,所有的数据都是按照特定的顺序存储的,我相信Pg也是如此。 http://www.postgresql.org/docs/9.2/static/sql-cluster.html

如果您不同意我的观点,请给我一个文档链接。我很高兴知道有一些东西要学。

【讨论】:

您能否指出 oracle 或 postgres 文档中的文档表明即使没有 ORDER BY 子句,这些存储类型的选择顺序也是确定的?我相当肯定不存在这样的承诺。 @SingleNegationElimination 我已经引用了 oracle 文档。很遗憾看到我的回答被否决了…… 我也在推特上问过Tom Kyte这个问题,希望他能发布答案,然后我会发布链接。 不要忘记二级索引。访问 IOT 的方法不止一种。 你们都是对的。我有点困惑:|汤姆凯特已经回答了我的问题。我已将汤姆的答案放在我的答案的顶部。但为了历史,我不想删除我原来的答案。所以我也把它留在这里了,标题是错误的答案。也许我的错误有时会帮助某人。

以上是关于在sql语句中,ORDERBY子句的功能是()的主要内容,如果未能解决你的问题,请参考以下文章

在SQL语句中,分组用啥子句,排序用啥子句

简述SELECT语句中的FROM、WHERE以及ORDER BY子句的作用。SQL Server

没有 Order By 子句的 SQL Select 语句的顺序

SQL-W3School:SQL ORDER BY 子句

SQL Order By 子句详解

SQL Server MERGE 语句和 ORDER BY 子句