日期:2014-05-16  浏览次数:20374 次

oracle rownum总结

1、概念理解

????? 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。

?

2、例子

(1)创建table grade

create table grade(
   id  NUMBER(16),
   name VARCHAR2(32),
   value NUMBER(19),
   primary key (id)
);

?(2)插入数据

------------------------------------
id         name           value
------------------------------------
101       语文             86
102       数学             89
103       英语             73
104       马哲             82
-----------------------------------

?(3)rownum 对于等于某值的查询条件

SQL>

select rownum,id,name,value from grade where rownum=1

?结果>

-----------------------------------------------
rownum      id         name           value
-----------------------------------------------
1               101       语文             86

?

SQL>

select rownum,id,name,value from grade where rownum=2

?结果>

-----------------------------------------------
rownum      id         name           value
-----------------------------------------------

?

总结原因:rownum是在得到结果集的时候产生的,用于标记结果集中结果顺序的一个字段,这个字段被称为“伪数列”,也就是事实上不存在的一个数列。它的特点是按顺序标记,而且是逐次递加的,换句话说就是只有有rownum=1的记录,才可能有rownum=2的记录。

?

(4)rownum对于大于某值的查询条件

SQl>

select rownum,id,name,value from grade where rownum>2

?结果>

-----------------------------------------------
rownum      id         name           value
-----------------------------------------------

原因同上!!!

>>那如何解决?

>>rownum不是个“伪数列”么,那我们现在把它弄成一个实在的字段就可以了。

>>具体做法就是利用子查询,在构建临时表的时候,把rownum也一起构造进去。

>>注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

SQL>

select * from (select rownum num,id,name,value from grade) where num>2;

?结果>

-----------------------------------------------
rownum      id         name           value
-----------------------------------------------
3               103          英语             73
4               104          马哲             82

?

(5)rownum对于小于某值的查询条件

SQL>

select rownum,id,name,value from grade where value>80 and rownum<3;

?结果>

-----------------------------------------------
rownum      id         name           value
-----------------------------------------------
1               101          语文             86
2               102          数学             89

>>rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。

?

(6)rownum和排序

????? Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

SQL>

select rownum,id,name,value from grade order by value

?结果>

-----------------------------------------------
rownum      id         name           value
-----------------------------------------------
3               103          英语             73
4               104          马哲             82
1               101          语文             86
2               102          数学             89

????? 可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询。

SQL>

select rownum ,id,name,value from (select * from grade order by value)

?结果>

-----------------------------------------------
rownum      id         name           value
-----------------------------------------------
1               101          语文             86
2