Oracle分页查询

 

在学习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分页查询了。

  • 非TOP-N查询
  1. Rownum是虚列,值从1开始,不能用表名修饰(例如A.rownum是错的)

查询员工表中的前10条数据:

select dept.department_id, rownum

 from departments dept

where rownum <=10

由于rownum从1开始,所以是<=10

 

  1. 但类似的最后rownum判断是>10为什么查不到数据呢?

select dept.department_id, rownum

     from departments dept

where rownum >10

我这里的理解是这样的:查不到数据,在第一条数据查出来之后,给赋值为rownum为1,但是rownum的约束条件为>10,所以该条数据不满足要求,从下一条数据开始rownum为0,这样一直下去,所以一直查不到数据

 

  1. 同样的rownum !=10显示的是前九条数据,而不是不等于10的数据,在rownum为10的时候,该条数据不符合要求,但下一条的rownum还是10,所以一直没有数据。

select dept.department_id, rownum

     from departments dept

 where rownum !=10

 

对于如何查询后面多少条的数据,就是接下来Top-N查询要实现的功能了

 

 

 

  • 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的值用来最后设置范围)

posted @ 2020-01-28 22:02  不忈yff  阅读(555)  评论(0编辑  收藏  举报