在Oracle中,如果未指定“order by”子句,则select查询的行的默认顺序是什么。
是吗
答案 0 :(得分:41)
根据Tom Kyte的说法:“除非你在查询中添加”order by“,否则你不能说任何关于返回的行的顺序。嗯,没有'你不能依赖于返回的行的顺序”“。
请在asktom.com上查看this question。
至于ROWNUM,它实际上并不存在,因此无法“释放”。从表中检索记录后分配ROWNUM,这就是为什么“WHERE ROWNUM = 5”将始终无法选择任何记录。
@ammoQ:您可能想要阅读GROUP BY订购的this AskTom article。简而言之:
Query Gaurantee中的Group By子句是否为输出数据 按“分组依据”列排序 订单,即使没有订单依据 条款?
我们说...
绝对不,
从来没有,从来没有,它永远不会 将
答案 1 :(得分:21)
没有明确的默认排序。出于显而易见的原因,如果您创建一个新表,插入几行并执行“select *”而不使用“where”子句,它(很可能)将按照它们插入的顺序返回行。
但是你永远不应该依赖发生的默认订单。如果您需要特定订单,请使用“order by”子句。例如,在最高9i的Oracle版本中,执行“group by”也会导致行按组表达式排序。在10g中,这种行为不再存在!升级Oracle安装因此导致了一些工作。
答案 2 :(得分:4)
已经有人说过,当你没有指定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已经说得很好:如果需要排序的行,请使用ORDER BY子句。
答案 3 :(得分:2)
除非您指定order by
,否则您绝对不能依赖任何排序。特别是对于Oracle,我实际上已经看到完全相同的查询(没有连接),在几秒内彼此运行两次,在一个没有在过渡期间改变的表,返回一个完全不同的顺序。当结果集很大时,这似乎更有可能。
Rob van Wijk提到的并行执行可能解释了这一点。另请参阅Oracle的Using Parallel Execution doc。
答案 4 :(得分:-2)
它受到指数的影响, 如果有索引,它将返回升序, 如果没有任何索引,它将返回插入的订单。
答案 5 :(得分:-2)
您可以通过INSERT使用CREATE TABLE语句的ORGANIZATION子句修改数据存储到表中的顺序
答案 6 :(得分:-3)
虽然它应该是rownnum(你的#2),它确实无法保证,你不应该信任它100%。
答案 7 :(得分:-6)
我相信它使用了Oracle隐藏的Rownum属性。
所以你的#1可能是正确的,假设没有删除可能已经释放rownums供以后使用。
编辑:正如其他人所说,你真的不应该依赖于此。除了删除了许多可能影响默认排序行为的不同条件。