Oracle--分页查询
分页查询
不同数据库的sql 不一样 方言
数据量很大, 如果一次性显示, 用户的体验度差,
原因: 数据量越大, 查询的耗时越多, 用户等待时间越多
把数据分批查询, 分页
一页显示的多少行数据: 页容量: pageSize 固定 数字
查询第几页: 当前页: 数字 : pageIndex
Oracle: 关键值: rownum 行号, 动态产生, 查询结果集动态产生
rownum 从1开始, 每查询到一条, 加1, 有1才有2
rownum 只能小于某个值, 不能等于,大于某个值
查询第一页的数据: 前3条数据
--可以 select * from emp where rownum < 3;
查询第二页数据: 4,--> 6
-- 查到到第一条数据: 1 1>=4 false,不满足 -- 查询到第二条数据 1 -- 不可以 select * from emp where rownum >=4 and rownum <= 6;
查询第三条数据
-- 查询不到数据 -- 一直返回的是第一条数据 select * from emp where rownum = 3;
解决办法:
想办法把rownum值固定
外层select --> 产生自己的rownum
内层select --> 产生自己的rownum
--效率低: 子查询已经把表的所有数据查询出来了 select rownum,t.* from (select rownum rn, e.* from emp e) t where t.rn >=4 and t.rn <=6;
--改进版: 提交效率 select rownum,t.* from (select rownum rn, e.* from emp e where rownum <=6 ) t where t.rn >=4 ;
正确写法
需要,把 sql的比较数字使用pageSize与pageIndex 替换
小数(大于等于符号后面的数字) = (pageIndex-1)*pageSize+1
大数(小于等于符号后面的数字) = pageIndex * pageSize
-- 第一页,每页三条数据 select rownum,t.* from (select rownum rn, e.* from emp e where rownum < = 1*3 ) t
where t.rn >= (1-1)*3+1 ;
添加排序
正确顺序: 先排序, 在筛选指定页的数据
--根据sal降序排序, 查询第二页的数据, pageSize = 3 -- select rownum rn, e.* from emp e where rownum <=6 order by sal desc -- 先 from --> where --> order by -- 1) select rownum rn, e.* from emp e where rownum <=6 得到前6条数据 -- 2) order by sal desc ; 对前面查询到的前6条数据进行排序 -- 嵌套两层子查询 select * from ( select rownum rn, t1.* from (select * from emp order by sal desc )t1 where rownum <=6 ) t2 where t2.rn >=4 ;