sen*_*ngs 42 oracle sql-order-by
在Oracle中,如果未指定"order by"子句,则select查询的行的缺省排序是什么.
是吗
DCo*_*kie 42
根据Tom Kyte的说法:"除非你在查询中添加"order by",否则你不能对返回的行的顺序说什么.好吧,没有'你不能依赖于返回的行的顺序'."
请在asktom.com上查看此问题.
至于ROWNUM,它实际上并不存在,因此无法"释放".从表中检索记录后分配ROWNUM,这就是"WHERE ROWNUM = 5"始终无法选择任何记录的原因.
@ammoQ:你可能想阅读关于GROUP BY订购的这篇AskTom文章.简而言之:
Query Gaurantee中的Group By子句是否按顺序对Group By列进行排序,即使没有Order By子句?
我们说......
绝对不,
它从来没有,它从来没有,它永远不会.
Eri*_*ler 21
没有明确的默认排序.出于显而易见的原因,如果您创建一个新表,插入几行并执行"select*"而不使用"where"子句,它(很可能)将按照它们插入的顺序返回行.
但是你永远不应该依赖发生的默认订单.如果您需要特定订单,请使用"order by"子句.例如,在最高9i的Oracle版本中,执行"group by"也会导致行按组表达式排序.在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.
Run Code Online (Sandbox Code Playgroud)
这只是在简单的delete + insert之后。还有许多其他情况可以考虑。并行执行,分区,索引组织表等等。
底线,正如ammoQ所说的那样:如果需要对行进行排序,请使用ORDER BY子句。