行号rownum是个伪列
实现oracle的分页查询一定需要嵌套子查询来实现
和mysql 的 limit方式不同---
select rownum,r,empno,ename,sal
from (select rownum r,empno,ename,sal
from (select rownum,empno,ename,sal from emp order by sal desc) e1
where rownum<=8) e2
where r>=5;
案例一:分页显示员工信息
Oracle数据库是行式数据库,只能先取第一条数据才能取第二条数据
e1表中可以查询出前8个,(rownum只能写<=,不能写>=,另外这里排序完rownum也是乱的),
e2表把e1查出的rownum别名为r,此时作为e2表的第一列数值,可以查询r>=5 的,则得到查询结果。
案例一:分页查询显示员工信息:显示员工号,姓名,月薪
--每页显示四条记录
--显示第二页的员工
--按照月薪降序排列
select empno,ename,sal from emp order by sal desc;
--rownum 行号(永远从1开始,所以不能使用>,>=),只能使用<,<=,不能使用>,>=
--r是e2表的第一列,不是伪列行号的值;e1表rownum行号与e2表rownum字段重名,e2表 rownum并不是真正意义上的行号,所以e2表的rownum字段可以使用 >= 5
rownum分页
rownum使用
分页查询显示员工信息:显示员工号,姓名,月薪
-每页显示四条记录
-显示第二页的员工
-按照月薪降序排列
----------------------------------------------------------------
rownum 行号(顺序是默认的,只能使用<,<=,不能使用>,>=)
e1 表,按照工资降序排列顺序
select rownum,empno,ename,sal from emp order by sal desc
-----------------------------------------
e2 表 1-8号的员工按照员工工资降序排列
select rownum ,empno,ename,sal from (select rownum ,empno,ename,sal from emp order by sal desc) e1 where rownum <=8) e2
--------------------------------------------
rownum r ,r是e2表的第一列,e1表的行号
e3 表 为8-5号员工按薪水降序排列
select rownum r,empno,ename,sal
from (select rownum r,empno,ename,sal from (select rownum,empno,ename,sal from emp order by sal desc) e1 where rownum<=8) e2 where r>=5;
也可以写成
select r,empno.ename,sal
from (select rownum r,empno,ename,sal
from (select empno,ename,sal from emp order by sal desc ) e1
where rownum<=8)e2
where r>=5;
自己消化的:
rownum(行号)只能使用<,<= ,不能使用>,>=
嵌套子查询
分页查询(查询5~8数据):
select * from (
select a.empno,a.ename,a.deptno,a.sal, rownum as rn from (
select t.empno,t.ename,t.deptno,t.sal from emp t order by t.sal desc)a)b
where b.rn >=5
and b.rn <=8;
rownum(行号)只能使用<,<= ,不能使用>,>=
嵌套子查询
分页查询(查询5~8数据):
select r,empno,ename,sal
from (select rownum r,empno,ename,sal
from (select rownum,empno,ename,sal from emp order by sal desc) e1
where rownum<=8) e2
where r>=5;
SQL> select r,empno,ename,sal
2 from (select rownum r,empno,ename,sal
3 from (select rownum,empno,ename,sal from emp order by sal desc) e1
4 where rownum<=8) e2
5 where r>=5;
R EMPNO ENAME SAL
---------- ---------- ---------- ----------
5 7698 BLAKE 2850
6 7782 CLARK 2450
7 7499 ALLEN 1600
8 7844 TURNER 1500
SQL> select rownum,r,empno,ename,sal
2 from (select rownum r,empno,ename,sal
3 from (select rownum,empno,ename,sal from emp order by sal desc) e1
4 where rownum<=8) e2
5 where r>=5;
ROWNUM R EMPNO ENAME SAL
---------- ---------- ---------- ---------- ----------
1 5 7698 BLAKE 2850
2 6 7782 CLARK 2450
3 7 7499 ALLEN 1600
4 8 7844 TURNER 1500
SQL> select rownum,r,empno,ename,sal
2 from (select rownum r,empno,ename,sal
3 from (select rownum,empno,ename,sal from emp order by sal desc) e1
4 where rownum<=8) e2
5 where rownum>=5;
未选定行
行号只能使用<,<=, 而不能使用>, >=。跟Oracle数据库的行号生成机制有关系,取了第一行才能取第二行,取了第二行才能取第三行
示例一
rownum 只能使用<,<=,不能使用> , >=
行号的生成机制:oracle数据库是一个行式数据库(即:取了第一行才能取第二行,取了第二行才能取第三行,以此类推)
oracle实现分页查询是通过嵌套子查询实现的
--分页查询,先排序,每页4行,查询第二页(就是行号从5~8)
select r,empno,sal
from (select rownum r,empno,ename,sal
from (select rownum,empno,ename,sal from emp order by sal desc) e1
where rownum<=8) e2
where r>=5;
r不是伪劣而是一列
oracle分页功能使用子查询嵌套,mysql有分页的关键字;
rownum 伪列形成时间在查询之后,排序之前;
rownum可以作为下一级select表的列加入查询
rownum只能使用<,<=,不能使用>,>=
oracle分页查询
1嵌套子查询方式实现2 rownum只能< <=,不能> >=,
实例分页查询员工信息每页最多显示四条信息,显示第二页信息
select r,empno,ename,sal
from ( select rownum r,empno,ename,sal
from ( select rownum,empno,ename,sal from emp order by sal desc) e1
where rownum<=8) e2
where r>=5;
分页查询:
select r,empno,ename,sal
from (select rownum r,empno,ename,sal
FROM (select ROWNUM,E.* from emp E order by sal desc) e1
where rownum <=8)e2
where r>5;
1oracle分页是通过嵌套子查询完成的
select rownum,r,empno,ENAME,sal from
(select rownum r , empno,ENAME,sal
from (select rownum,empno,ENAME,sal from emp order by sal desc ) a1 where rownum<=8) a2
where r>=5
select r,empno,empname,sal from
(select rownum r , empno,empname,sal
from (select rownum,empno,empname,sal from emp where order by sal desc ) a1 where rownum<=8) a2
where r>=5
分页查询,4条每页,并显示第二页数据
select rownum ,rr,fhiino,fspno,fprocseq
from (
select rownum rr,fhiino,fspno,fprocseq
from
(
select rownum,fhiino,fspno,fprocseq from ilapplym am where am.FAPPLYTM >to_date('2017-01-01','yyyy-mm-dd')
order by am.FPROCSEQ desc
)
e1 where rownum <=8 ) e2
where rr>5