oracle ROWNUM的使用

 

由于Oracle中没有像MySql中limit函数以及SQLServer中的top关键字等,所以只能通过伪列的方式去满足分页功能

ROWNUM的使用注意:

 

(1)对 <=  操作,rownum是支持的,表示输出结果的前XX条数据

 

SELECT ROWNUM,empno,ename,job FROM emp WHERE ROWNUM < 10;

 

(2)不能对ROWNUM进行>、=、>=、操作,否则无结果

SELECT ROWNUM,empno,ename,job FROM emp t  WHERE ROWNUM > 10;
SELECT ROWNUM,empno,ename,job FROM emp WHERE ROWNUM =10;
SELECT ROWNUM,empno,ename,job FROM emp WHERE ROWNUM >= 10;

这是因为:

1、ROWNUM是伪列,必须要要有返回结果后,每条返回记录就会对应产生一个ROWNUM数值;

2、ROWNUM是Oracle首先进行查询获取到结果集之后在加上去的一个伪列,这个伪列对符合条件的结果添加一个从1开始的序列号,第一条始终是1;

这样,当查询到第一条记录时,该记录的ROWNUM为1,但条件要求ROWNUM>1,因此不符合,继续查询下一条;因为前面没有符合要求的记录,因此下一条记录过来后,其ROWNUM还是为1,如此循环,就不会产生结果

 


则进行一下优化后可以进行(rownum作为子查询,并起别名):
SELECT * FROM (SELECT ROWNUM nums,emp.* FROM emp) WHERE nums > 10 ;
SELECT * FROM (SELECT ROWNUM nums,emp.* FROM emp) WHERE nums = 10 ;
SELECT * FROM (SELECT ROWNUM nums,emp.* FROM emp) WHERE nums > 5 AND nums <= 10;
select *
from (select rownum rno, t.* from emp t) t
where rno >= 100
and rno <= 200
order by t.logid desc;

(3)分页查询--以每页输出10个结果的方式分页输出:

select *
from (select a.*, rownum as rn
from (select * from emp ) a
where rownum <= 10)
where rn >= 1;

select *
from (select a.*, rownum as rn
from emp  a
where rownum <= 20)
where rn >= 11;

select *
from (select a.*, rownum as rn
from emp a)
where rn between 11 and 20;

--备份表/一次插入大数据

CREATE TABLE emp_bak AS SELECT * FROM emp;
INSERT INTO emp_bak SELECT * FROM emp;

posted @ 2018-07-02 17:43  向着太阳出发  阅读(235)  评论(0编辑  收藏  举报