oracle数据库中的正常select语句是基于rownum的吗?

时间:2014-07-01 14:40:47

标签: sql oracle

我在数据库中放置了正常的select语句而没有排序任何东西,

select * from PROFILE;

结果如下

 NAME

=====
a
c
b

我需要知道的是,没有排序选项的正常选择是基于行号还是以随机方式。

由于以下选择陈述而提出了这个疑问。

select rownum,name from PROFILE;

NAME ROWNUM
===========
a 1
c 2
b 3

2 个答案:

答案 0 :(得分:2)

Rownum是一个人工列,绝不是表格行的属性。

例如,查询

select rownum, x.* from  (select * from dba_users order by username desc) x;

select rownum, x.* from  (select * from dba_users order by username asc) x;

将不同的rownums分配给结果行(但在每种情况下,rownum都以1开头)。

请注意,在分配rownums后会处理order by,所以

select rownum, x.* from  dba_users x order by username asc;

可能会给你错误的印象,即该表(或视图)的特定行“具有”rownum。

如果没有order by子句,查询结果可以按任何顺序出现,不会做出任何承诺。没有删除的新表可能会按插入顺序返回行,但您甚至不应该依赖它。

答案 1 :(得分:1)

没有select的{​​{1}}语句既不是“随机”,也不是基于行号(或行ID)。在SQL中,表表示无序集。没有order by,结果可以是任何顺序。

事实上,在Oracle中,特别是在并行系统上,结果通常会以相同查询的不同顺序返回。这与底层线程首先返回数据以呈现给用户有关。

如果您希望数据按特定顺序排列 - 或者在您多次调用查询时只需按相同的顺序排列 - 那么请使用order by