数据库分页

数据库分页:
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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值