总结Oracle数据库与MySQL数据库中分页的实现

一.MySQL数据库

先从MySQL数据库说起,MySQL数据库中实现分页相对简单,因为MySQL数据库中提供了非常好用的limit函数

limit 使用语法:
limit [a],[b]

a:代表从第几个数开始向后查询(0对应的是数据库的第一行)
b:代表每次查询返回的总条数

一般来说
a设置为(当前页数 - 1)* 单页数据大小
b设置为 单页数据大小

二.Oracle数据库

Oracle数据库实现分页相对MySQL数据库较为繁琐,因为Oracle数据库不支持limit函数,所以我们使用rownum来控制
方法一:

–第一步,查询出所有信息,并根据工资排序
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。

猜你喜欢

转载自blog.csdn.net/WziH_CSDN/article/details/109386425