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 ;
原文地址:https://www.cnblogs.com/64Byte/p/12694730.html