精华内容
下载资源
问答
  • ORACLE分页查询

    千次阅读 2018-06-27 11:22:45
    ORACLE分页查询 转自:ORACLE分页查询SQL语法——最高效的分页 无ORDER BY排序的写法。(效率最高) 经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然! ...

    ORACLE分页查询

    转自:ORACLE分页查询SQL语法——最高效的分页

    无ORDER BY排序的写法。(效率最高)

    经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!

    SELECT *
      FROM (SELECT ROWNUM AS rowno, t.*
              FROM emp t
             WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
                                 AND TO_DATE ('20060731', 'yyyymmdd')
               AND ROWNUM <= 20) table_alias
     WHERE table_alias.rowno >= 10;

    有ORDER BY排序的写法。(效率最高)

    经过测试,此方法随着查询范围的扩大,速度也会越来越慢哦!

    SELECT *
      FROM (SELECT tt.*, ROWNUM AS rowno
              FROM (  SELECT t.*
                        FROM emp t
                       WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
                                           AND TO_DATE ('20060731', 'yyyymmdd')
                    ORDER BY create_time DESC, emp_no) tt
             WHERE ROWNUM <= 20) table_alias
     WHERE table_alias.rowno >= 10;

    无ORDER BY排序的写法。(建议使用方法1代替)

    此方法随着查询数据量的扩张,速度会越来越慢哦!

    SELECT *
      FROM (SELECT ROWNUM AS rowno, t.*
              FROM k_task t
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
                                   AND TO_DATE ('20060731', 'yyyymmdd')) table_alias
     WHERE table_alias.rowno <= 20 AND table_alias.rowno >= 10;
    --TABLE_ALIAS.ROWNO  between 10 and 100;

    有ORDER BY排序的写法.(建议使用方法2代替)

    此方法随着查询范围的扩大,速度会越来越慢哦!

    SELECT *
      FROM (SELECT tt.*, ROWNUM AS rowno
              FROM (  SELECT *
                        FROM k_task t
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
                                             AND TO_DATE ('20060531', 'yyyymmdd')
                    ORDER BY fact_up_time, flight_no) tt) table_alias
     WHERE table_alias.rowno BETWEEN 10 AND 20;

    另类语法。(有ORDER BY写法)

    语法风格与传统的SQL语法不同,不方便阅读与理解,为规范与统一标准,不推荐使用。

    WITH partdata AS
         (
            SELECT ROWNUM AS rowno, tt.*
              FROM (  SELECT *
                        FROM k_task t
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
                                             AND TO_DATE ('20060531', 'yyyymmdd')
                    ORDER BY fact_up_time, flight_no) tt
             WHERE ROWNUM <= 20)
    SELECT *
      FROM partdata
     WHERE rowno >= 10;

    另类语法 。(无ORDER BY写法)

    WITH partdata AS
         (
            SELECT ROWNUM AS rowno, t.*
              FROM k_task t
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
                                   AND TO_DATE ('20060531', 'yyyymmdd')
               AND ROWNUM <= 20)
    SELECT *
      FROM partdata
     WHERE rowno >= 10;

    yangtingkun分析:

    转自: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 *
      FROM (SELECT a.*, ROWNUM rn
              FROM (SELECT *
                      FROM table_name) a
             WHERE ROWNUM <= 40)
     WHERE rn >= 21
    展开全文
  • Oracle分页查询

    2018-09-14 14:28:33
    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看。 Oracle分页查询语句基本上可以按照本文给出的格式来进行套用。 Oracle分分页查询...

    Oracle中分页查询语句

    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看。

    Oracle分页查询语句基本上可以按照本文给出的格式来进行套用。
    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控制分页查询的每页的范围。

    上面给出的这个Oracle分分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在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最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

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

     

    分页计算方式:

    <select id="getDcsLSpPriceRuleId" parameterClass="java.util.Map" resultClass="java.lang.Long">
            <dynamic>
                <isEqual property="isPaging" compareValue="true">
                    SELECT *
                      FROM (SELECT ROW_.*, ROWNUM ROWNUM_
                             FROM (    
                </isEqual>
            </dynamic>  
            SELECT DISTINCT T.RULE_ID 
            FROM DCS_L_SP_PRICE T
            <isNotEmpty property="beginDate">
               where t.time_stamp >= to_date(#beginDate#,'yyyy-mm-dd hh24:mi:ss')
            </isNotEmpty>
            order by T.RULE_ID
            <dynamic>
                <isEqual property="isPaging" compareValue="true">
                      )ROW_
                 <![CDATA[    WHERE ROWNUM <= #end#)  ]]>
                 WHERE ROWNUM_ > #start#        
                 </isEqual>
            </dynamic>   
         </select>
         
         


    SELECT *
      FROM (SELECT ROW_.*, ROWNUM ROWNUM_
              FROM (
                    
                    SELECT *
                      FROM DCS_L_SP_PRICE T
                     where t.time_stamp >=
                           to_date(#beginDate#, 'yyyy-mm-dd hh24:mi:ss')
                     order by T.RULE_ID) ROW_
             WHERE ROWNUM <= #end#)
     WHERE ROWNUM_ > #start#


    出错 sql


      select count(1)
            from cq_flights_segment_head a, CQ_FLIGHTS b
           where a.local_std  >=  trunc(sysdate - 1)
             and a.flights_id = b.flights_id  
             and origin_std  >=  to_date("2018-09-06 00:00:00")
             and  origin_std <=  to_date("2018-09-24 23:59:59");

    展开全文
  • oracle分页查询

    2007-10-19 14:20:26
    oracle分页查询
  • oracle 分页查询

    2021-04-29 16:28:20
    oracle 分页查询 SELECT * FROM (SELECT tt.*, ROWNUM AS rowno FROM ( SELECT t.* FROM table_name t WHERE apply_date BETWEEN TO_DATE ('20210429', 'yyyymmdd') AND TO_DAT

    oracle 分页查询

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT t.*
    
                        FROM table_name t
    
                       WHERE apply_date BETWEEN TO_DATE ('20210429', 'yyyymmdd')
    
                                           AND TO_DATE ('20210429', 'yyyymmdd')
    
                    ORDER BY create_time DESC, emp_no) tt
    
             WHERE ROWNUM <= 15) table_alias
    
     WHERE table_alias.rowno >= 1;
    
    
    
    展开全文
  • Oracle分页查询Oracle分页查询Oracle分页查询Oracle分页查询
  • oracle分页查询sql语句,oracle分页查询sql语句详解,Oracle分页查询sql语句Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点,Oracle中分页使用rownum ,相对复杂一点。sql语句如下...

    oracle分页查询sql语句,oracle分页查询sql语句详解,Oracle分页查询sql语句

    Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点,Oracle中分页使用rownum ,相对复杂一点。

    sql语句如下:

    SELECT *

    SELECT t.*, rownum rn

    FROM

    SELECT * FROM USER;

    WHERE

    rn (currentPage-1)*pageSize

    AND rn = currentPage*pageSize;

    Oracle中rownum是虚拟列,是得出结果后,再进行计算的。所以,只能是小于的,无法大于,要使用的大于,就必须使用别名,如上代码中的rn就是使用别名的写法。

    oracle分页查询sql语句的相关网页热门搜索词

    oracle分页查询sql语句详解|oracle数据库分页查询sql|oracle高效分页查询|oracle并发查询sql|oracle并行查询sql语句|oracle并行查询|sql语句性能优化|mysql分页查询sql语句|oracle简单分页|

    本文标题:oracle分页查询sql语句,oracle分页查询sql语句详解

    http://www.jianglexinxi.cn/yanergaozhi/329682.html

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,172
精华内容 2,068
关键字:

oracle分页查询