分页 + 排序
一.简单分页:
需求:分页查询台账表T_ACCOUNT,每页10条记录
分析:我们在ORACLE进行分页查询,需要用到伪列ROWNUM和嵌套查询
我们首先显示前10条记录,语句如下:
select rownum,t.* from T_ACCOUNT t where rownum<=10
显示结果如下:
好像没有问题~
那么我们显示第11条到第20条的记录呢?编写语句:
select rownum,t.* from T_ACCOUNT t
where rownum>10 and rownum<=20
查询结果:
可能查询的结果就为空查不到了,为什么这样? 该如何解决呢?
这是因为rownum是在查询语句扫描每条记录时产生的,所以不能使用“大于”符号,只能使用“小于”或“小于等于” ,只用“等于”也不行。
那怎么办呢?我们可以使用子查询来实现,分步骤编写:
--基本分页
--1.查询所有台账表
select * from t_account;
--2.查询所有的台账表,含rownum (注意;显示数据要加自定义名称如: a.* 否则报错)
select rownum,a.* from t_account a;
--3.第一页,前10条
select rownum,a.* from t_account a where rownum<10;
--如果直接使用>会查不出结果
--这是因为rownum是在查询语句扫描每条记录时产生的,所以不能使用“大于”符号,只能使用“小于”或“小于等于” ,只用“等于”也不行。
--4.第二页, rownum在处理每行数据时,不能使用大于号>
select * from (select rownum r,a.* from t_account a) t
where t.r > 10 and t.r <=20;
(二)分页+排序
需求:分页查询台账表T_ACCOUNT,每页10条记录,按使用字数降序排序。
我们查询第2页数据,如果基于上边的语句添加排序,语句如下:
select * from (select rownum r,a.* from t_account a order by a.usenum desc
) t
where t.r > 10 and t.r <=20 ;
得到的结果可能是这样的:
你会发现排序后的R是乱的。
这是因为ROWNUM伪列的产生是在表记录扫描是产生的,而排序是后进行的,排序时R已经产生了,所以排序后R是乱的。
怎么解决呢?
so easy~~~
我们只要再嵌套一层循环(一共三层),让结果先排序,然后对排序后的结果再产生R,这样就不会乱了。
总的来说分三步; 第一步先查询排序,第二步然后根据排序结果原基础上加一列rownum,第三步最后根据加了rownum的结果进行分页, 否则一句话写完的话,就会导致rowNum的排序是乱的,不能进行分页 )
--分页+排序 (分三步; 第一步先查询排序,第二步然后根据排序结果原基础上加一列rownum,第三步最后根据加了rownum的结果进行分页, 否则一句话写完的话,就会导致rowNum的排序是乱的,不能进行分页 )
--1.查询所有 + 排序
select * from t_account order by usenum desc;
--2.结果--> + rownum
select rownum,t.* from
(select * from t_account order by usenum desc)t;
--3.结果--->分页条件
select * from (
select rownum r,t.* from
(select * from t_account order by usenum desc)t
)t2 where t2.r>10 and t2.r<=20;
结果如下:
这样就没问题了,今天的你get到了吗~~~~~~嚯嚯
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!