Oracle数据库实现分页

什么是分页?

为了便于在网页显示数据,常常要将数据量大的数据进行分页显示。例如淘宝页面搜索出的商品信息,往往一个关键字搜索出的结果就有几百万上千万条数据。在一个页面不可能将所有数据查出,只能通过分页查询不同区间的数据。搜索结果第一页显示的是第1~20条数据,当用户点击下一页时再搜索第21~40条数据,以此类推。总之,分页就是根据给出的区间查询不同区间的数据,让数据呈现出一页一页的形式。

Oracle数据库实现分页

rownum简介

Oracle中通过rownum实现分页,rownum是一个伪列,在普通的查询中是不可见的,需要取出数据后rownum才会有值。
例如我们需要查询员工表中的员工信息,并且显示出数据的序号。*

SELECT rownum AS 序号, ename AS 姓名, sal AS 工资

这里的rownum可以根据意思看成行号。

实现分页

知道了rownum是什么,我们就很容易使用这个伪列来对查询的结果集进行分页。
查询工资从高到低的员工信息,以一页5条数据分页,查询出第二页

-- 第一步,查询出所有信息,并根据工资排序
SELECT sal, ename, FROM emp WHERE sal IS NOT NULL order by sal

-- 第二步,取得排序后的序号,过滤掉10行以后的数据

SELECT  rownum AS rn, sal, ename 
 FROM(
    SELECT sal, ename, FROM emp WHERE sal IS NOT NULL order by sal
 ) x 
 WHERE rownum <= 10

--第三步,在前10行数据中再过滤掉6行以前的数据
SELECT rn AS 序号, ename AS 姓名, sal AS 工资
FROM(
    SELECT rownum AS rn, sal, ename 
    FROM(
        SELECT sal, ename, FROM emp WHERE sal IS NOT NULL order by sal
    ) 
    WHERE rownum <= 10
)
WHERE rn >= 6

--另外一种写法
SELECT rn AS 序号, ename AS 姓名, sal AS 工资
FROM(
    SELECT rownum AS rn, sal, ename 
    FROM(
        SELECT sal, ename, FROM emp WHERE sal IS NOT NULL order by sal
    )
) a
WHERE a.rn between 6 and 10

在这里为什么不直接在第一步就取出rownum呢?因为如果第一步就取出rownum

SELECT rownum as rn, sal, ename, FROM emp WHERE sal IS NOT NULL order by sal

这条查询语句执行的顺序是:先取出数据(包括rownum),再排序。所以取出来的数据可能是这样的:

   rn     sal    ename
------- ------- ---------
      1    3000       TOM
      4    2888     JONES
     15    2560      FORD
     21    1300     ADAMS
      3     900     SIMTH

      ...

在第二步中取出rownum能保证rownum为排序后的rownum(1,2,3,4,…),而不是排序之前的rownum。

与MySQL相比

与MySQL相比相对比较麻烦,MySQL中只要使用关键字limit就能指定数据的开始下标和条数。

--从第六条开始,取五条数据
SELECT * FROM emp limit(6,5);

你可能感兴趣的:(数据库)