标签:错误 分页 编号 HERE acl color 而不是 判断 sele
在学习Mysql时,我们对于查询结果显示可以使用limit来达到显示前几条数据或者分页的效果,例如查询员工表中编号前10的员工为
select * from emp e order by e.id limit 0,10;
(注意0是开始index,10代表显示10条)
所以在实际应用中应该是这样用的:
select * from table limit (pageNo-1)*pageSize, pageSize;
(pageNo为页码,pageSize是显示的条数)
在这里说了这么多,接下来就是Oracle数据库中关于分页查询的知识点,首先,在Oracle中是没有用limit来达到该效果的可能,要想达到分页的效果,首先需要知道rownum的使用,这里就依次为大家介绍rownum的作用。第一种为非排序Top-N(就是用rownum时没有order); 第二种为排序Top-N(就是rownum和order by 一起使用);最后也就是常用的Oracle分页查询了。
查询员工表中的前10条数据:
select dept.department_id, rownum
from departments dept
where rownum <=10
由于rownum从1开始,所以是<=10
select dept.department_id, rownum
from departments dept
where rownum >10
我这里的理解是这样的:查不到数据,在第一条数据查出来之后,给赋值为rownum为1,但是rownum的约束条件为>10,所以该条数据不满足要求,从下一条数据开始rownum为0,这样一直下去,所以一直查不到数据
select dept.department_id, rownum
from departments dept
where rownum !=10
对于如何查询后面多少条的数据,就是接下来Top-N查询要实现的功能了
例如此处要查询职业为’IT_PROG’的员工中工资最低的三位,这里肯定就要使用到order by了,但是在使用order by和rownum的时候可能出现一些问题。
--错误写法
select e.employee_id, e.salary
from employees e
where job_id =‘IT_PROG‘ and rownum <= 3
order by salary asc
--正确写法
select rownum,m.r,m.employee_id, m.salary
from (select e.*,rownum r
from employees e
where job_id =‘IT_PROG‘
order by salary asc) m
where rownum <= 3
根据以上代码可以知道,由于order by一直在where条件之后执行,但是rownum又是在where中执行的,所以按照需求,rownum的判断应该在order by之后
--查询员工工资(降序排序)在第五页的,每页4条内容
select *
from (select A.*, rownum r
from (select *
from employees e
order by salary) A)
where r between 17 and 20
类似于上面的Top-N查询,就是内层排序,外层设定范围(可能中间还会有一层来选出rownum的值用来最后设置范围)
标签:错误 分页 编号 HERE acl color 而不是 判断 sele
原文地址:https://www.cnblogs.com/YffCeShi/p/12239075.html