日期:2014-05-16 浏览次数:20397 次
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