• 技术文章 >数据库 >Oracle

    oracle分页查询原理是什么

    长期闲置长期闲置2022-01-25 16:59:31原创178

    oracle的分页查询原理:1、利用ORACLE的rownum字段的特性查询;2、查询指定数量N条数据;3、从指定数量N条查询结果中,取出M条数据;4、在web开发中将M、N作为参数进行传递,就可以得到分页的结果。

    本教程操作环境:Windows10系统、Oracle 11g版、Dell G3电脑。

    oracle分页查询原理是什么

    分页的原理:

    1.借助ORACLE的rownum这个字段的特性查询。

    2. 查询前N条数据

    3.从第2步的查询结果中取M到N条数据

    4.在web开发中将M,N作为参数进行传递,就可以得到分页的结果。

    例子: 查询表中20~30条记录,sql语句如下。

    select *   from( 
     select   rownum  as  pageNo,  A.*   from    tableName     A   where   rownum   <=   30)  B  where B.pageNo >=20;

    示例:

    --如何获取雇员表中薪水最高的前5人?

    SELECT * FROM(
    SELECT * FROM emp ORDER BY sal DESC)
    WHERE Rownum<6

    --如何获取雇员表中薪水排名第5的雇员信息

    SELECT * FROM(
    SELECT * FROM emp ORDER BY sal DESC)
    WHERE Rownum=5

    --结果查询不出内容

    --同样ROWNUM>=5查询5名之后的成绩也失败

    --这里就涉及到ROWNUM只能小于不能大于等于。所以--oracle数据库分页查询的一个重要障碍就是这个。

    --至于原理因为ROWNUM是一个每一次都要从1开始排列的伪列。于是ROWNUM>=n。比如1大于任何n(第几条)都不成立。倒是可以ROWNUM=1.可以查到。因为1>=1成立。N=2,1>=2就不成立了。所以大于等于只能查第一条。加上小于等于。只能查这些了。所以这个困难算是增加了分页查询的难度与障碍。

    --方法一 最简单的查询

    --第五条到第十条。

    --只有一层嵌套,一个子查询,

    SELECT * FROM
    (SELECT ROWNUM rn ,e.* FROM emp e WHERE ROWNUM<=10)
    WHERE rn>=5;

    --这样其实就是下面的方法转化而来。

    --也就是子查询得到的新表再次被查询。

    --关键的一步就是ROWNUM rn。

    --而且不要忘了e.*,不然没有完整数据。

    SELECT * FROM (SELECT ROWNUM rn, e.*
              FROM emp e
             WHERE ROWNUM <= 10) table_1
     WHERE table_1.rn>= 5;

    --上面的没有排序,下面进行排序

    --因为要先排序,才能查询,所以表越大,效率越慢。

    --方法二

    SELECT * FROM
    (SELECT ROWNUM rm ,e.* FROM emp e order by sal DESC )
    WHERE rm>=5 AND rm<=10

    --下面是用分析函数的方法;

    --方法三

    SELECT * 
    FROM (SELECT emp.*,
       ROW_NUMBER () OVER (ORDER BY sal DESC) rank 
        FROM emp)   
    WHERE rank >=6 AND rank<=10;

    --可是我们实际查询看一下结果,发现完全不一样。

    --人工查看了一下。分析函数的方法结果是正确的。不理解。

    --有没有谁能解释一下。

    --下面来一个没有意义的

    SELECT * FROM 
    (SELECT e.*, ROWNUM AS rn from 
    ( SELECT * FROM emp ORDER BY sal DESC) e
    )ee 
    WHERE ee.rn>=5 AND ee.rn<=10

    --方法四(海量数据查询,如百度,天猫查询)

    SELECT * FROM(
    SELECT e.* ,ROWNUM rn
    FROM (
    SELECT *
    FROM emp
    ORDER BY sal DESC
    ) e
    WHERE  ROWNUM<=10
    )WHERE rn>=6;

    --分解步骤

    --第一步:

    SELECT * FROM emp ORDER BY sal DESC

    --第二步:

    SELECT e .*,ROWNUM rn FROM
    (SELECT * FROM emp ORDER BY sal DESC) e

    --第三步:

    SELECT e .*,ROWNUM rn FROM
    (SELECT * FROM emp ORDER BY sal DESC) e
    WHERE ROWNUM<=10

    --第四步:

    SELECT * FROM(
    SELECT e .*,ROWNUM rn FROM
    (SELECT * FROM emp ORDER BY sal DESC) e
    WHERE ROWNUM<=10)
    WHERE rn>=5

    --猜测错误。

    SELECT e .*,ROWNUM rn FROM
    (SELECT * FROM emp ORDER BY sal DESC) e
    WHERE rn<=10

    --起别名必须查询出数据表才行,

    --而查询条件用还不存在的条件去判断,自然失败。

    --方法五,闲的无聊的用法

    WITH ee AS (
      SELECT e.*, ROWNUM rn FROM
     ( SELECT * FROM emp ORDER BY sal DESC )e
      )
      SELECT ee.*
      FROM ee
      WHERE ee.rn>=5 AND ee.rn<=10

    推荐教程:《Oracle视频教程

    以上就是oracle分页查询原理是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:oracle
    上一篇:oracle存储过程中赋值给变量的方法有哪些 下一篇:oracle怎么修改索引

    相关文章推荐

    • oracle中行转列函数是什么• oracle怎样修改sga• oracle怎样增加表空间文件• oracle怎样查询前10条记录• oracle怎样行列转置

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网