数据库分页:
1、按照每页显示5条记录,分别查询第1页,第2页,第3页信息,
要求显示员工姓名、入职日期、部门名称。
(1)、查询第1页 (rownum是伪列一直都存在的)。
select rownum,e.* from emp e
where rownum <=5;
(2)、查询第2页
执行顺序:from …where…select …
select *
from (select rownum rn, e.* from emp e where rownum <= 10)
where rn >= 6;
(3)、查询第3页
select *
from (select rownum rn, e.* from emp e where rownum <= 15)
where rn >= 11;
(4)、下面这个语句是错误的
错误原因:
执行顺序问题:from emp e–where rn<=5–select rownum,
from emp 表中没有rn,找不到rn 存在,因此where rn<=5这步就报错了
select rownum rn,e.* from emp e
where rn<=5;
2、按照每页显示5条记录,分别查询工资最高的第1页,第2页,
第3页信息,要求显示员工姓名、入职日期、部门名称、工资。
(1)、查询第1页
方法:先根据题目要求(工资最高)排好序,再将已经排好序的表当中新表,显示rownum伪列
select e.* from emp e
order by sal desc ; --先将工资降序排序
select rownum,e2.ename,e2.hiredate,d.dname,e2.sal
from(select e.* from emp e order by sal desc) e2,dept d
where rownum <=5 and (e2.deptno=d.deptno); --第1页
(2)查询第2页
select *
from (select rownum rn, e2.ename, e2.hiredate, d.dname, e2.sal
from (select e.* from emp e order by sal desc) e2, dept d
where rownum <= 10
and (e2.deptno = d.deptno))
where rn >= 6; --第2页
(3)、查询第三页
select *
from (select rownum rn, e2.ename, e2.hiredate, d.dname, e2.sal
from (select e.* from emp e order by sal desc) e2, dept d
where rownum <= 15
and (e2.deptno = d.deptno))
where rn >= 11; --第3页
3、总结:
(1)、rownum 伪列,虚拟存在 永远从1开始,对于rownum只能执行<、<=运算,不能执行>、>=或一个区间运算Between…And等,因次从查询第2页开始增加rowmun的别名 rn,但注意查询第1页是不能用别名,否则就会出现执行顺序的问题 如上例 1(4)
(2)、rowid 伪列,物理存在, 每一行数据的唯一标识 (这里分页暂时没有用到)
select rowid,e.* from emp e where rowid = ‘AAASp8AAEAAAEI1AAH’;
(3)、TOP-N查询(分页查询): 先排序,再根据rownum伪列获取限制数据
开始索引:当前页码 * 每页显示条数 -每页显示条数 +1 =(当前页码 -1)* 每页显示条数 +1
结束索引:当前页码 * 每页显示条数
公用查询语句 :
已知条件 1. 每页显示条数(5) 2.当前页码
select *
from (select rownum rn,e.* from emp e where rownum <= (当前页码 * 每页显示条数))
where rn >= ((当前页码-1) * 每页显示条数 + 1); --效率高,推荐这个
--或者
select *
from (select rownum rn,e.* from emp e)
where rn <= (当前页码 * 每页显示条数) and rn >= ((当前页码-1) * 每页显示条数 + 1);
先排序,再分页
select *
from (select rownum rn, e2.*
from (select e.* from emp e order by sal desc) e2
where rownum <= 5) e3
where rn >= 1;