Oracle分页及实例说明为何要嵌套两层或三层

Oracle分页和MySQL分页有点不一样,MySQL利用limit分页,Oracle利用rownum关键字来进行分页。

–rownum关键字:oracle对外提供的自动给查询结果编号的关键字,与每行的数据没有关系。
–注意:rownum关键字只能做< <=的判断,不能进行> >=的判断,所以外层我们用内层查出的rownum放到外层去比较

接下来就用这张表来尝试分页,这张表一共有31条数据

select * from table t

在这里插入图片描述

1.无排序写法

--第几页:page
--每页大小:size

SELECT t2.*,rownum
  FROM (SELECT ROWNUM AS rowno, t.*
          FROM table t
         WHERE ROWNUM <= size*page) t2
WHERE t2.rowno > size*(page-1);

例:

--第几页:page=1
--每页大小:size=10

SELECT t2.*,rownum
  FROM (SELECT ROWNUM AS rowno, t.*
          FROM table t
         WHERE ROWNUM <= 10*1) t2
WHERE t2.rowno > 10*(1-1);

在这里插入图片描述

--第几页:page=2
--每页大小:size=20

SELECT t2.*,rownum
  FROM (SELECT ROWNUM AS rowno, t.*
          FROM table t
         WHERE ROWNUM <= 20*2) t2
WHERE t2.rowno > 20*(2-1);

在这里插入图片描述

看到上面的查询语句你可能会想到为什么不直接用一层来解决呢
SELECT ROWNUM AS rowno, t.* FROM table t WHERE ROWNUM <= size*page and rownum > size*(page-1);
你会发现明明是有数据的,但用这语句就是查不出来呢
SELECT ROWNUM AS rowno, t.* FROM table t WHERE ROWNUM <= 10*2 and rownum > 10*(2-1);
这样看的可能不是太清晰,那这样呢
SELECT ROWNUM AS rowno, t.* FROM table t WHERE ROWNUM > 10;
是不是发现了端倪,>或者>=对rownum无效,所以一层无法实现分页查询
在这里插入图片描述

2.有排序的写法

--第几页:page
--每页大小:size

SELECT t2.*
   FROM (SELECT ROWNUM AS rowno, t1.*
           FROM (SELECT t.* FROM table t
                  order by activity_id desc) t1
          WHERE ROWNUM <= size * page) t2
  WHERE rowno > size * (page - 1);

注意,用到order by的查询需要三层,这里肯定又会有疑问,两层为什么不行,我在内层加上order by排序不行吗,这我们需要考虑到SQL的执行顺序,select是要比order by先执行的,这意味着什么,我们先select了10条数据,然后再对这10条数据进行排序,这样好像不是我们想要的结果,所以为了让order by先执行,那我们就得再嵌套一层来解决这个问题。
例:

--第几页:page
--每页大小:size

SELECT t1.*
   FROM (SELECT ROWNUM AS rowno, t.*
           FROM table t
          WHERE ROWNUM <= 10 * 1
          order by activity_id desc) t1
  WHERE rowno > 10 * (1 - 1);

在这里插入图片描述

--第几页:page=1
--每页大小:size=10

SELECT t2.*
   FROM (SELECT ROWNUM AS rowno, t1.*
           FROM (SELECT t.* FROM table t
                  order by activity_id desc) t1
          WHERE ROWNUM <= 10 * 1) t2
  WHERE rowno > 10 * (1 - 1);

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值