oracle中select查询的默认行排序

时间:2009-05-22 19:11:11

标签: oracle sql-order-by

在Oracle中,如果未指定“order by”子句,则select查询的行的默认顺序是什么。

是吗

  1. 插入行的顺序
  2. 根本没有默认排序
  3. 以上都不是。

8 个答案:

答案 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供以后使用。

编辑:正如其他人所说,你真的不应该依赖于此。除了删除了许多可能影响默认排序行为的不同条件。