精华内容
下载资源
问答
  • ORACLE分页查询SQL语句(最有效的分页)

    万次阅读 多人点赞 2018-11-01 16:18:24
    对于第一个查询语句,第二层的查询条件WHERE ROWNUM 就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。 而第二个查询语句,由于查询条件BETWEEN 21 AND 40...

    一、效率高的写法

    1.无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;
    

    2.有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;
    

    二、效率垃圾但又似乎很常用的分页写法

    3.无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;
    

    4.有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;
    

    5.另类语法。(有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;
    
     
    
    --6另类语法 。(无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;
    

    三、分析

    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
    
    展开全文
  • MySQL分页 Oracle分页 SQL Server分页 MySQL,ORACLE,SQL SERVER 分页查询语句 一、MySQL SELECT * FROM table_name LIMIT 0,5 ; 二、ORACLE SELECT * FROM ( SELECT t.* , rownum r FROM table_name...

            MySQL分页 Oracle分页 SQL Server分页 MySQL,ORACLE,SQL SERVER 分页查询语句 

     

    一、MySQL 

    SELECT * FROM table_name 
    LIMIT 0,5 ; 

     

    二、ORACLE

    SELECT * FROM 
    (
     SELECT t.* , rownum r FROM table_name t WHERE rownum <= end_page
    )
    WHERE r > start_page ;

     

    三、SQL Server

    SELECT TOP start_page , end_page * FROM table_name ;

     

    (注意:这些是最简单的实现,请根据实际业务需求,进行调整!)

    展开全文
  • MySQL分页SQL和ORACLE分页SQL  (2009-09-10 11:46:52) 转载▼ 标签:  mysql   oracle   分页sql   it 分类: Oracle/Mysql MySQL: select * ...

    MySQL分页SQL和ORACLE分页SQL

      (2009-09-10 11:46:52)
    标签: 

    mysql

     

    oracle

     

    分页sql

     

    it

    分类: Oracle/Mysql

    MySQL:

    select * from table(表名) limit startPos,pageSize

    注:

    1,startPos:定义当前页起始位置 注意:当前页的起始位置只能在当前页确定之后才能定义

    2,pageSize:定义每页显示数据的条数

    3,举例说明:


    public List findAll(String lfrxm, String xsxm) {

       List infoList = null;
       StringBuffer sql = new StringBuffer();

       sql
         .append("select l.djid,l.lfrxm,l.lfrxb, f_get_syscode('xingbie',l.lfrxb) lfrxbname,x.xsxm,z.ssid,l.yyfrgx ,f_get_syscode('guanxi',l.yyfrgx) yyfrgxname,l.lfsj,l.lksj,l.zjmc ,f_get_syscode('zhengjianmingcheng',l.zjmc) zjmcname,l.zjh from lfrydj as l,xsrz as z,xsjbxx as x");
       sql.append(" where l.xh = x.xh and l.xh = z.xh ");
       if (lfrxm != null && !lfrxm.equals("")) {
        sql.append(" and w.lfrxm='").append(lfrxm).append("' ");
       }
       if (xsxm != null && !xsxm.equals("")) {
        sql.append(" and x.xsxm='").append(xsxm).append("' ");
       }

       try {
        infoList = dbutil.selectMapList(sql.toString());

       } catch (DAOSystemException e) {
       } catch (DAONoRecordException e) {
       } catch (Exception e) {
        e.printStackTrace();
        Log.add_info("查询数据失败");
       }
       return infoList;
    }

     


    public List search(String lfrxm, String xsxm, int startPos, int pageSize) {
       List infoList = null;
       StringBuffer sql = new StringBuffer();
       sql
         .append("select l.djid,l.lfrxm,l.lfrxb, f_get_syscode('xingbie',l.lfrxb) lfrxbname,x.xsxm,z.ssid,l.yyfrgx ,f_get_syscode('guanxi',l.yyfrgx) yyfrgxname,l.lfsj,l.lksj,l.zjmc ,f_get_syscode('zhengjianmingcheng',l.zjmc) zjmcname,l.zjh from lfrydj as l,xsrz as z,xsjbxx as x");
       sql.append(" where l.xh = x.xh and l.xh = z.xh");
       if (lfrxm != null && !lfrxm.equals("")) {
        sql.append(" and w.lfrxm='").append(lfrxm).append("' ");
       }
       if (xsxm != null && !xsxm.equals("")) {
        sql.append(" and x.xsxm='").append(xsxm).append("' ");
       }

       sql.append(" limit " + startPos + " , " + pageSize + "");

       System.out.println("sql=====================" + sql.toString());

       try {
        infoList = dbutil.selectMapList(sql.toString());
       } catch (DAOSystemException e) {
       } catch (DAONoRecordException e) {
       } catch (Exception e) {
        Log.add_info("查询数据失败");
       }
       return infoList;
    }

    }

     

    public static void search(String lfrxm, HttpServletRequest request,
        String xsxm) {

       WlryglEntity entity = new WlryglEntity();

       // 查询所有数据
       List totalList = entity.findAll(lfrxm, xsxm);

       System.out.println(totalList + "777777777777777777777777777777");
       // 定义总共有多少条数据
       int totalRecords;
       try {
        totalRecords = totalList.size();
       } catch (Exception e) {
        totalRecords = 1;
       }

       // 定义每页显示数据的条数
       int pageSize = 6;
       // 定义当前页
       int pageNO;
       String pageNumber = String.valueOf(
         request.getParameter("pageNO") != null ? request
           .getParameter("pageNO") : "").trim();
       if (pageNumber == null || pageNumber.equals("")) {
        pageNO = 1;
       } else {
        try {
         pageNO = Integer.parseInt(pageNumber);
        } catch (NumberFormatException e) {
         pageNO = 1;
        }
        if (pageNO <= 0) {
         pageNO = 1;
        }
       }
       // 定义总共有多少页
       int totalPages = totalRecords % pageSize == 0 ? totalRecords / pageSize
         : totalRecords / pageSize + 1;
       // 当前页大于总页数的时候
       if (pageNO > totalPages) {
        pageNO = totalPages;
       }
       // 定义当前页起始位置注意:当前页的起始位置只能在当前页确定之后才能定义
       int startPos = (pageNO - 1) * pageSize;

       List infoList = entity.search(lfrxm, xsxm, startPos, pageSize);
       request.setAttribute("pageNO", pageNO);
       request.setAttribute("totalPages", totalPages);
       request.setAttribute("totalRecords", totalRecords);
       request.setAttribute("pageSize", pageSize);
       request.setAttribute("infoList", infoList);

    }

    Oracle:

    "select * from (select asTable.*,rownum row_id from ("
         + SQL+ ") asTable where rownum<=" + endRow
         + ") where row_id>" + startRow"

    注:

    1,rownum是oracle的伪列,在sql语句中标记行号;但是简单的把它认为是行号也是不正确的,因为使用rownum=1或者rownum>1或者用上between and是无效果的。我们只能在语句中使用rownum<10这样的语句来返回结果集,它的作用可以看作类似于mssql中的top。

    3,startRow:当前页开始位置 endRow:当前页的结束位置

    4,SQL:她才是你要真正查询的SQL。

    5,举例说明:


    public List findcjbgxx(String zkzh, String czry, String czrq,
        String usercode, HttpServletRequest request) {
       StringBuffer sql = new StringBuffer();
       String fenyesql = null;
       List fenyeList = null;

       // 分页处理
       int pageSize = 6; // 每页记录数
       int currentPage = 1; // 当前页数
       int startRow; // 开始位置
       int endRow; // 结束位置
       if (request.getParameter("page") != null
         && request.getParameter("page").trim().length() > 0) {// 默认为首页
        currentPage = Integer.parseInt(request.getParameter("page"));
       }
       startRow = (currentPage - 1) * pageSize;
       endRow = currentPage * pageSize;

       sql
         .append("select zkzh,kcdm,ksqh,kszcj,hgbj,wjbj,qkbj,qxdm,czry,to_char(czrq,'yyyy-mm-dd') czrq,spry,to_char(sprq,'yyyy-mm-dd') sprq from kj_kscj_bg ");
       sql.append(" where 1=1 ");
       if (zkzh != null && !zkzh.equals("")) {
        sql.append("and zkzh='").append(zkzh).append("' ");
       }
       if (czry != null && !czry.equals("")) {
        sql.append("and czry='").append(czry).append("' ");
       }
       if (czrq != null && !czrq.equals("")) {
        sql.append("and to_char(czrq,'yyyy-mm-dd') ='").append(czrq)
          .append("' ");
       }

       fenyesql = "select * from (select asTable.*,rownum row_id from ("
         + sql.toString() + ") asTable where rownum<=" + endRow
         + ") where row_id>" + startRow;

       try {

        fenyeList = dbutil.selectMapList(fenyesql);
       } catch (DAOSystemException e) {

       } catch (DAONoRecordException e) {
        e.printStackTrace();
        Log.logtxt_warn(usercode, "查询数据异常", e);
       }

       request.setAttribute("pageSize", new Integer(pageSize));

       request.setAttribute("currentPage", new Integer(currentPage));
       return fenyeList;

    }

    展开全文
  • ORACLE 分页SQL

    2017-09-27 15:53:53
    ORACLE 分页SQL 这个sql的分页很简单,但是由于十分常用,且通常用于查询大量数据的情况。 SELECT * FROM(  SELECT A.*,ROWNUM RN  FROM   (SELECT * FROM TABLE_XX ) A  WHERE ROWNUM ) TL  WHERE ...
     
    
    这个sql的分页很简单,但是由于十分常用,且通常用于查询大量数据的情况。
    SELECT * FROM(
            SELECT A.*,ROWNUM RN
            FROM 
                        (SELECT * FROM TABLE_XX ) A
            WHERE ROWNUM<=20
    )  TL 
    WHERE RN >=11
     
    这个sql高效的原因在于优化模式下,
    Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。
    故此查询中,查询条件WHERE ROWNUM<=20就可以被Oracle推入到内层查询中,
    这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询,将结果返回。
    展开全文
  • Oracle分页SQL

    千次阅读 2015-01-20 02:19:15
    Oracle 分页功能的实现
  • oracle分页查询sql

    2019-01-15 23:03:22
    oracle分页查询语句sql
  • oracle分页sql

    2019-03-12 14:47:23
    SELECT * FROM ( SELECT * FROM ( SELECT row_number() OVER (ORDER BY t1.OBJECTID) AS sort, t1.* FROM T_SJCZRZ t1 WHERE t1.OBJECTID BETWEEN 100 AND 600 ) t2 WHERE t2.sort &...
  • oracle分页sql语句

    千次阅读 2012-12-21 10:11:10
    oracle分页技术的重要性,不用我来废话吧,直接切入正题吧!嘿嘿、、、 方法一: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM ) -- 40 = currentPage * pageSize ...
  • Oracle分页Sql

    千次阅读 2012-03-22 00:17:44
    1.根据ROWID来分 select * from t_xiaoxi where rowid in(select rid from (select rownum rn,ridfrom(select rowid rid,cid from t_xiaoxi order by cid desc) where rownum9980)order by cid desc;...
  • oracle分页Sql

    2012-02-29 17:18:05
    对于第一个查询语句,第二层的查询条件WHERE ROWNUM 就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。 而第二个查询语句,由于查询条件 BETWEEN 21 AND...
  • sql oracle分页sql语句

    千次阅读 2009-03-12 09:52:00
    使用sql,和oracle数据库进行分页可以有以下三种方法! 下面让我们看一看如果我们要在数据库中取第1000条到第1010条的数据这两种方法是怎么实现的. 1. 使用临时表的方法. (在系统中主要是直接写Sql语句来做) a) 按所需...
  • my sql分页 select * from userdetail where userid limit 0,20 SQLServer分页 select top 10 * from table1 where id not in( select top 开始的位置 id from table1) ... oracle分页 SE
  • ORACLE分页SQL语句

    千次阅读 2007-11-08 08:40:00
    一个非常好的ORACLE分页SQL语句 select * from (select my_table.*, rownum as my_rownum from ( select yhbh, yhmc from yysf_tb_yonghxx order by yhbh) my_table where rownum =10---------------------------...
  • 简单oracle分页sql语句

    千次阅读 2012-07-25 14:17:48
    环境选择在oracle scott用户下的emp表 根据rownum分页: 1. rownum 分页 SELECT * FROM emp;  2. 显示rownum[oracle分配的] SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e; rn相当于Oracle分配的行的ID号 ...
  • oracle分页sql优化语句

    2014-01-17 12:53:05
    常规的分页思路: select *  from (select a.*, rownum as rnum  from (select * from burgess) a  where rownum where rnum >= 5000 有较高效率的分页思路 select *  from (select *  from (sel
  • –①之所以oracle需要三层嵌套来实现分页原因如下: – 因为在查询的时候,order by 的执行是在 select 之后的, – 所以如果在第一层查询中查出ROWNUM,再按某一字段排序后, –会导致查出得到的ROWNUM值顺序...
  • Oracle 分页存储过程 SQL Oracle 分页存储过程 SQL
  • ORACLE 分页SQL语句

    千次阅读 2006-08-07 20:42:00
    总结了一下几种方法 具体在MSSQL SYBASE下面用top 来分页 POSTGRESQL MYSQL就直接用limit更简单了在oracle 下面想了4总方法minus差分页 select * from table where rownumrownum伪列select * from (select rownum ...
  • Oracle分页SQL,3种分页SQL方法比较
  • ORACLE分页查询SQL语法

    2012-10-08 20:50:12
    ORACLE分页查询SQL语法,学学习习。学习
  • oracle mysql sqlserver分页

    2012-09-14 13:00:03
    oracle分页 mysql分页 sqlserver分页
  • //获取Oracle分页语句 传入参数:strsql:查询所有记录的语句 pageno:当前页 pagesize:一页显示的记录数) public static String getOnePageSql(String strSql, int pageSize, int pageNo) { return new ...
  • sql 分页 针对oracle mysql sqlserver 等数据库的通用类
  • * Sql优化 - Oracle数据库 sql优化 - Oracle数据库 Sql优化目的 Sql优化原则 绑定变量 where 条件 索引 排序和分页 其他问题 优化目的 将每一次操作需要占用的数据量(IO)和资源 (cpu,内存等)减少到最低,即在最短的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,004
精华内容 21,201
关键字:

oracle分页sql带条件