oracle中select查询的默认行排序

sen*_*ngs 42 oracle sql-order-by

在Oracle中,如果未指定"order by"子句,则select查询的行的缺省排序是什么.

是吗

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

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的SELECT必然会访问所有块在表中按照相同的顺序创建它们. (4认同)
  • 如果您创建一个包含100条记录的表,删除前50条,然后再插入另外10条,Oracle将倾向于重新使用已删除行中的空格(受许多ifs,buts等影响).因此,即使Oracle以相同的顺序访问块,插入的最后10条记录也往往会在没有ORDER BY的查询中出现 (4认同)
  • 是的,本身并不保证.但我会很难创建一个不能像那样工作的场景. (2认同)

Rob*_*ijk 5

已经有人说,当您不指定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子句。

  • +1表示“职业限制移动”,具体取决于来自无序查询的排序。 (3认同)