首页 > 数据库 >Oracle分页查询语句

Oracle分页查询语句

时间:2023-06-04 13:06:20浏览次数:59  
标签:语句 分页 查询 Oracle ROWNUM 内层 SELECT


Oracle分页查询语句(一)



作者: yangtingkun  



    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。

分页查询格式:


SELECT
            
             
            
            *
            
             
            
            FROM
            
            
(
            
            SELECT
            
             A.
            
            *
            
            , ROWNUM RN
            
            FROM
            
             (
            
            SELECT
            
             
            
            *
            
             
            
            FROM
            
             TABLE_NAME) A
            
            WHERE
            
             ROWNUM 
            
            <=
            
             
            
            40
            
            
)
            
            WHERE
            
             RN 
            
            >=
            
             
            
            21


其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。


上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。


选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:


SELECT              
               
              
              *
              
               
              
              FROM
              
              
(
              
              SELECT
              
               A.
              
              *
              
              , ROWNUM RN
              
              FROM
              
               (
              
              SELECT
              
               
              
              *
              
               
              
              FROM
              
               TABLE_NAME) A
)
              
              WHERE
              
               RN 
              
              BETWEEN
              
               
              
              21
              
               
              
              AND
              
               
              
              40


对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。


这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。


而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。


上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。


这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。


因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:


SELECT                                 
                
                /*+ FIRST_ROWS */
                
                 
                
                *
                
                 
                
                FROM
                
                
(
                
                SELECT
                
                 A.
                
                *
                
                , ROWNUM RN
                
                FROM
                
                 (
                
                SELECT
                
                 
                
                *
                
                 
                
                FROM
                
                 TABLE_NAME) A
                
                WHERE
                
                 ROWNUM 
                
                <=
                
                 
                
                40
                
                
)
                
                WHERE
                
                 RN 
                
                >=
                
                 
                
                21


标签:语句,分页,查询,Oracle,ROWNUM,内层,SELECT
From: https://blog.51cto.com/u_13538361/6410375

相关文章

  • oracle 分页 存储过程
    createorreplacepackagetestpackageastypetest_cursorisrefcursor;endtestpackage;createorreplaceprocedurefenye(tableNameinvarchar2,pageSizeinnumber,pageNowinnumber,myRowCountoutnumber,myPageCountoutnumber,p_cursorouttestpack......
  • Map 接收 @RequestBody,Controller 层可以打印值,但是 mybatis 编译 SQL 语句显示 NULL
    mybatis#{}获取的key是否一致;前端发送请求类型是否与后端接口定义的请求类型一致;前端发送请求与接口请求的类型一致的情况下,检查post请求封装data时是否以get形式传递数据。我的问题是第三个,尤其是后端不报任何错误的情况下,第三种情况极有可能。我把axios.post......
  • Oracle 12c/19c PDB数据库配置自动启动
    Oracle12c/19cPDB数据库配置自动启动在Oracle12c/19c多租户环境中,默认情况下,使用startup命令启动数据库实例后,你会发现PDB数据库的状态为MOUNT状态,PDB不会随着CDB启动而启动。如下例子所示:SQL>startupORACLEinstancestarted.TotalSystemGlobalArea2432695872by......
  • Oracle partition by 用法及函数
    Oraclepartitionby--函数row_number、rank、dense_rank--row_number:序号,不重复;例如:1,2,3,4,5--rank:排序,重复;例如:1,2,2,2,5--dense_rank:排序,不重复;例如:1,2,2,2,3--sum:求和,本行排名之前(包括本行排名)的总和--count:技术,包括本行排名一共有多少名SELECTt.*FROM(S......
  • Oracle 死锁与慢查询总结
    查看死锁SELECTs.sid"会话ID",s.lockwait"等待锁",s.event"等待的资源/事件",--最近等待或正在等待的资源/事件DECODE(lo.locked_mode,0,'尚未获得锁',1,NULL,2,'行共享锁',3,'行排它锁',4,'共享表锁',5,'共享行排它锁',6,......
  • php新闻分页代码
    以下是一个简单的PHP新闻分页代码示例:<?php$servername="localhost";$username="username";$password="password";$dbname="news";//创建连接$conn=newmysqli($servername,$username,$password,$db......
  • 一个多功能(聚合)查询接口,实现模糊、分页、主键、排序以及多条件查询
    一个多功能(聚合)查询接口,实现模糊、分页、主键、排序以及多条件查询前言写的啰嗦了点,看效果请直接忽略中间,直接看后半部分。引个流,公众号:小简聊开发概念瞎编的名字,哈哈哈,我就勉强称之为聚合查询吧,不知道概念符不符合。大家好,我是小简,很久没写文章了,确实是太忙了,今天我......
  • 2014.4.19.12.27_switch_8.28_java switch语句使用注意的四大细节_0.01
    javaswitch语句使用注意的四大细节很多朋友在使用javaswitch语句时,可能没有注意到一些细节,本文将详细介绍使用javaswitch语句四大要点,需要的朋友可以参考下。switch语句的格式如下:(它的功能是选出一段代码执行)switch(整数选择因子){case整数值1:语句;break;case整数值......
  • 最新SQL手工注入语句&SQL注入大全
    最新SQL手工注入语句&SQL注入大全 (转载)看看下面的1.判断是否有注入;and1=1;and1=22.初步判断是否是mssql;anduser>03.判断数据库系统;and(selectcount(*)fromsysobjects)>0mssql;and(selectcount(*)frommsysobjects)>0access4.注入参数是字符'and[查询条件]an......
  • goto语句
    跳转语句C语言的跳转语句主要包括continue,break,retuen,还有就是goto啦goto语句goto语句是在所有跳转语句中最自由的一种,但在大型工程和多人协作工程中并不推荐,原因就在于它太过于自由,会导致代码的可读性变得较差但这也无法撼动goto语句的地位合理的使用goto会大大简......