在oracle中select查询的默认行sorting
在Oracle中,如果没有指定“order by”子句,那么select查询的行的默认sorting是什么。
是吗
- 行插入的顺序
- 根本没有默认的sorting
- 以上都不是。
根据Tom Kyte的说法:“除非你直接给查询添加”order by“,否则你不能说任何有关返回行的顺序,那么你就不能依赖于被返回的行的顺序。
在asktom.com看到这个问题 。
至于ROWNUM,它并不存在,所以它不能被“释放”。 ROWNUM是在从表中检索logging后分配的,这就是为什么“WHERE ROWNUM = 5”将始终无法select任何logging。
@ammoQ:你可能想阅读关于GROUP BY命令的这篇AskTom文章 。 简而言之:
查询中的Group By子句是否按照顺序对输出数据按Group By列进行sorting(即使没有Order By子句)?
我们说…
绝对不,
它从来没有,它从来没有,它永远不会。
没有明确的默认sorting。 出于显而易见的原因,如果您创build一个新表,插入几行,并执行“select *”而不带“where”子句,它将(很可能)按照它们插入的顺序返回行。
但是,你永远不应该依靠默认的顺序发生。 如果您需要特定订单,请使用“order by”条款。 例如,在高达9i的Oracle版本中,执行“group by”也会导致按照组expression式对行进行sorting。 在10g中,这种行为不再存在! 升级Oracle安装已经使我有一些工作,因为这个。
已经有人说过,当你不指定一个ORDER BY子句的时候,Oracle允许你以任何顺序给你所需的行。 当你不指定ORDER BY子句时,推测什么顺序是毫无意义的。 在你的代码中依靠它,是一个“职业限制的举动”。
一个简单的例子:
SQL> create table t as select level id from dual connect by level <= 10 2 / Tabel is aangemaakt. SQL> select id from t 2 / ID ---------- 1 2 3 4 5 6 7 8 9 10 10 rijen zijn geselecteerd. SQL> delete t where id = 6 2 / 1 rij is verwijderd. SQL> insert into t values (6) 2 / 1 rij is aangemaakt. SQL> select id from t 2 / ID ---------- 1 2 3 4 5 7 8 9 10 6 10 rijen zijn geselecteerd.
而这只是简单的删除+插入之后。 还有其他许多可以想象的情况。 并行执行,分区,索引组织表等等。
底线,ammoQ已经说得很好:如果你需要sorting的行,使用ORDER BY子句。
你绝对肯定不能依赖任何顺序,除非你指定order by
。 特别是对于Oracle来说,我已经看到了完全相同的查询(没有连接),在几秒钟内两次运行,在一个没有改变的表上,返回一个非常不同的顺序。 当结果集很大时,这似乎更可能。
Rob van Wijk提到的并行执行可能解释了这一点。 另请参阅此文档 。
它受索引影响,如果有索引,它将返回一个升序,如果没有任何索引,它将返回插入的命令。
虽然,它应该是rownnum(你的#2),它确实不能保证,你不应该相信它的100%。
我相信它使用了Oracle隐藏的Rownum属性。
所以你的#1可能是正确的,假设没有删除可能已经释放rownums供以后使用。
编辑:正如其他人所说,你真的不应该依靠这个,永远。 除了删除可能影响默认sorting行为的许多不同的条件。