由于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;