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

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

    万次阅读 2016-10-25 14:43:07
    1.oracle中的分页查询sql语句基本可以按照如下的模板来改写:SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM ) WHERE RN > 20 其中的SELECT * FROM TABLE_NAME 表示没有...

    1.oracle中的分页查询sql语句基本可以按照如下的模板来改写:

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

    其中的SELECT * FROM TABLE_NAME 表示没有进行分页时的sql查询语句,而ROWNUM 和RN 限定了查询数据的范围。

    2.使用时的代码如下所示:

    /** 查询码号相关信息的sql语句 **/
    String sql_query = "SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT c.codename, case when (c.isopen = 0) then '不可用'"
                + " when (c.isopen = 1) then ((case when (c.codestatus = 0) then '空闲'"
                + " when (c.codestatus = 1) then '预占' when (c.codestatus = 2) then '占用'"
                + " when (c.enddate > sysdate) then '保留期' end)) end as status,t.name,( select p."
                + " party_name from CRM.PARTY p"
                + " where p.party_id=c.custid) as partyname, c.deviceid,(select l.name FROM"
                + " lgc_codetoclass_tbl l)as codeFeature,(SELECT g.name FROM LGC_CODEGRADE_TBL g"
                + " WHERE g.id=c.gradeid) as gradename,(select g.value "
                + " from LGC_CODEGRADE_TBL g where g.id = c.gradeid) as codePrice, c.comments"
                + " FROM LGC_CODESEG_TBL t, LGC_CODENUMBER_TBL c WHERE t.ID = c.CODESEGID and c.codename=?"
                + " ) a WHERE ROWNUM <= ?) WHERE rn > ?";
    /** 用来查询码号查询页面数据的方法的实现 **/
    public NumberRsp queryRecords(NumberEvt evt,int pageNo,int pageSize) {
            Map<String, Object> map = jdbcTemplate.queryForMap(sql_count);
            List<NumberVo> list = jdbcTemplate.query(sql_query, new Object[] { evt.getCode(),pageNo*pageSize,(pageNo-1)*pageSize}, new RowMapper<NumberVo>() {
                public NumberVo mapRow(ResultSet rs, int rowNum) throws SQLException {
                    // TODO Auto-generated method stub
                    NumberVo numberVo = new NumberVo();
                    numberVo.setPhone(rs.getString(1));
                    numberVo.setStatus(rs.getString(2));
                    numberVo.setCodePartName(rs.getString(3));
                    numberVo.setUnit(rs.getString(4));
                    numberVo.setFacility(rs.getString(5));
                    numberVo.setCodeFeature(rs.getString(6));
                    numberVo.setPricingLevel(rs.getString(7));
                    numberVo.setCodePrice(rs.getShort(8));
                    numberVo.setRemark(rs.getString(9));
                    return numberVo;
                }
            });
            NumberRsp numberRsp = new NumberRsp();
            if (map.get("total") != null) {
                numberRsp.setTotal(Integer.parseInt(map.get("total").toString()));
            }
            if (map.get("ky") != null) {
                numberRsp.setUsableNum(Integer.parseInt(map.get("ky").toString()));
            }
            if (map.get("bky") != null) {
                numberRsp.setUnUsableNum(Integer.parseInt(map.get("bky").toString()));
            }
            if (map.get("youhao") != null) {
                numberRsp.setYouhaoNum(Integer.parseInt(map.get("youhao").toString()));
            }
            if (map.get("puhao") != null) {
                numberRsp.setPuhaoNum(Integer.parseInt(map.get("puhao").toString()));
            }
            if (list != null) {
                numberRsp.setRecords(list);
            }
            return numberRsp;
        }
    展开全文
  • ORACLE分页查询SQL语句(最有效的分页)

    万次阅读 多人点赞 2018-11-01 16:18:24
    ** 一、效率高的写法 ** 1.无ORDER BY排序的写法。...即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM emp t WHERE hire_date BETWEEN TO_DATE ...

    一、效率高的写法

    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
    
    展开全文
  • oracle sql分页语句

    2019-03-22 01:49:01
    NULL 博文链接:https://yan578351314.iteye.com/blog/911307
  • Oracle中的SQL分页查询原理和方法详解

    万次阅读 多人点赞 2016-05-29 21:26:10
     本文分析并介绍Oracle中的分页查找的方法。  Oracle中的表,除了我们建表时设计的各个字段,其实还有两个字段(此处只介绍2个),分别是ROWID(行标示符)和ROWNUM(行号),即使我们使用DESCRIBE命令查看表的...

    转载请注明出处:http://blog.csdn.net/anxpp/article/details/51534006,谢谢!

        本文分析并介绍Oracle中的分页查找的方法。

        Oracle中的表,除了我们建表时设计的各个字段,其实还有两个字段(此处只介绍2个),分别是ROWID(行标示符)和ROWNUM(行号),即使我们使用DESCRIBE命令查看表的结构,也是看不到这两个列的描述的,因为,他们其实是只在数据库内部使用的,所以也通常称他们为伪列(pseudo column)。

        下面我们先建表并添加一些数据来验证上面的说明。

        建表:

     
    1. create table users(
    2. id integer primary key,
    3. name nvarchar2(20)
    4. )

        插入数据:

    
      
    1. insert into users(id,name) values(1,'tom');
    2. insert into users(id,name) values(2,'cat');
    3. insert into users(id,name) values(3,'bob');
    4. insert into users(id,name) values(4,'anxpp');
    5. insert into users(id,name) values(5,'ez');
    6. insert into users(id,name) values(6,'lily');

        使用describe命令查看表结构:

        01

        可以看到,确实只有建表时的两个字段。

        但我们可以查询的时候,查找到伪列的值:

    
      
    1. select rowid,rownum,id,name from users;

        结果:

        02

        这个rowid我们一般用不到,Oracle数据库内部使用它来存储行的物理位置,是一个18位的数字,采用base-64编码。

        而这个rownum,我们也正是使用它来进行分页查询的,它的值,就是表示的该行的行号。

        对于分页,我们只要想办法可以查询到从某一起始行到终止行就可以的,分页的逻辑可以放到程序里面。

        于是,我们理所当然会想到如下语句查询第2页的数据(每页2条数据,页码从1开始,所以起始行的行号为 (页码-1)*每页长度+1=3,终止行的行号为 页码*每页长度=4):

    
      
    1. select * from users where rownum>=3 rownum <= 4;

        哈哈!是不是发现没有任何结果,原因很简单,Oracle机制就是这样的:因为第一条数据行号为1,不符合>=3的条件,所以第一行被去掉,之前的第二行变为新的第一行(即这个行号不是写死的,可以理解为是动态的),如此下去,一直到最后一行,条件始终没法满足,所以就一条数据也查不出来。

        既然找到了原因,解决方法也就很明显了,我们只要将行号查询出来生成一个结果集,然后再从这个结果集中,选择行号大于我们设定的那个值就可以了,上面的分页查找正确的写法应该是这样:

    
      
    1. select id,name from(
    2. select rownum rn,u.* from users u) ua
    3. where ua.rn between 3 and 4;

        上面的语句还可以优化:>=不能用,但是<=是可以的,我们不需要在子查询中将结果全部查出来,首先使用终止行筛选子查询的结果,SQL如下:

    
      
    1. select id,name from(
    2. select rownum rn,u.* from users u where rownum<=4) ua
    3. where ua.rn >= 3;

        结果:

        03

        很多时候,我们并不是盲目的分页查找的,二十按某一个或多个字段的升序或降序分页,即包含 order by 语句的分页查询,我们先看一下 order by 的查询结果中rownum是怎样的:

    
      
    1. select rownum,id,name from users order by name;

        结果:

        04

        可以看到,我们说行号完全是动态的,也是不准确的,这时候的行号并不是经过 order by 后新结果的增序行号。

        但有了上面的嵌套查询的经验,这里也可以好好应用一下,怎么做呢:先查找出排序好的结果集,然后应用上面的方法得到最终结果,sql如下:

    
      
    1. select id,name from(
    2. (select rownum rn,uo.* from
    3. (select * from users u order by name) uo
    4. where rownum<=4)) ua
    5. where ua.rn>=3;

        按照上面的结果,正确的分页结果应该是id为2和5的,看下结果:

        05

        OK,结果正确。

        其实连表查询之类的,也是差不多的,多点嵌套而已,掌握了原理,随便分析一下就能写出对应的SQL了,而编写SQL时,我们也得动动脑子,毕竟SQL也是由优劣之分的。

    展开全文
  • 一、SqlServe下载 分页语句 String sql = select top +pageRecord + * from addressbook where id not in (select top +(currentPage-)*pageRecord + id from t_user); // (currentPage-)*pageRecord : 是指从第几...
  • ORACLE SQL 分页查询

    2019-04-05 21:50:26
    有时候我们想对数据访问的控制或者查询一部分数据的时候,这时我们可以用分页查询数据,在一定程度上提高了查询的速度,或者说简化查询,那么我们在ORACLE里面怎么实现分页查询呢?下面是实现分页查询的两种方法; ...

    有时候我们想对数据访问的控制或者查询一部分数据的时候,这时我们可以用分页查询数据,在一定程度上提高了查询的速度,或者说简化查询,那么我们在ORACLE里面怎么实现分页查询呢?下面是实现分页查询的两种方法;
    例子1:查询SRUDENTS表的成绩由高到低的5-10名的学生;

    1. 使用ROWNUM 伪列 进行分页查询,伪列的缺点就是只能使用<或<=,而不能使用=,>,>=都不能返回任何数据,所以对于列子来讲只能结合用子查询来分页了:
    1. 首先对学生的成绩由高到低进行排序:
      SELECT * FROM STUDENTS ORDER BY SCORE DESC
      在这里插入图片描述
    2. 然后对排序后的学生添加一个伪列:
      SELECT ID,NAME,SCORE,ROWNUM R FROM (SELECT * FROM STUDENTS
      ORDER BY SCORE DESC)WHERE ROWNUM <=10
      在这里插入图片描述
    3. 最后,由于ROWNUM的缺点,所以我们只能嵌套子查询,把伪列变成真实的数据,这个时候我们就可以拿这一列来过滤条件,从而进行分页查询:
      SELECT * FROM(SELECT ID,NAME,SCORE,ROWNUM R FROM (SELECT * FROM
      STUDENTS ORDER BY SCORE DESC)WHERE ROWNUM <=10)WHERE R BETWEEN 5
      AND 10;
      在这里插入图片描述
    1. 使用ROW_NUMBER()OVER()进行分页查询:
    2. 通过ROW_NUMBER()OVER进行排序编号:
      SELECT ID,NAME,SCORE,ROW_NUMBER()OVER(ORDER BY SCORE DESC)R FROM STUDENTS;
      在这里插入图片描述
    3. 通过WHERE 语句来进行过滤:
      SELECT * FROM(SELECT ID,NAME,SCORE,ROW_NUMBER()OVER(ORDER BY SCORE DESC)R FROM STUDENTS)
      WHERE R BETWEEN 5 AND 10
      在这里插入图片描述
      例子2:查询SRUDENTS表,按不同性别且成绩排前3名的学生;
      同样使用ROW_NUMBER()OVER(PARTITION BY … )来查询:
      SELECT * FROM(SELECT ID,NAME,SEX,SCORE,ROW_NUMBER()OVER(PARTITION BY SEX ORDER BY SCORE DESC)R FROM STUDENTS)WHERE R <=3
      在这里插入图片描述
    展开全文
  • 分页查询格式 SELECT * FROM ( SELECT A, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询 SELECT * FROM TABLE_NAME 表示不进行翻页的原始查询语句 ...
  • mysql的分页查询是最简单的,借助关键字limit即可实现查询查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句 * firstIndex:其实的索引 * pageSize:每页显示的记录数 */ select o.* ...
  • Oracle分页查询语句

    2018-05-26 23:54:03
    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看。Oracle分页查询语句基本上可以按照本文给出的格式来进行套用。Oracle分分页查询格式:...
  • 如果我们是通过JDBC的方式访问数据库,那么就有必要根据数据库类型采取不同的SQL分页语句,对于MySql数据库,我们可以采用limit语句进行分页,对于Oracle数据库,我们可以采用rownum的方式进行分页. (1)MySql的Limit m,n...
  • 分页功能是我们的基本功,必须要牢固掌握。通过对分页算法的整理,希望对实现分页功能更得心应手了,需要的朋友可以参考下
  • Oracle分页查询语句

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

    千次阅读 2019-04-16 11:11:31
    ORACLE SQL _分页查询 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:Oracle sql * plus PLSQL Developer 作者:叶 撰写时间:2019年01月01日 ~~~~~~~...
  • 最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询语句贴出来供大家学习….. (一)、mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询查询语句通式: ...
  • msql和oracle分页查询语句笔记
  • Oracle与MySQL的分页查询sql语句格式

    千次阅读 2018-03-13 23:00:10
    Oracle使用rownum进行分页,rownum是从1开始的: select * from (select rownum as rn, a.* from table_name a where rownum <= pageIndex * pageSize) where rn > (pageIndex - 1) * pageSize 其中,...
  • 一个分页语句引发的思考执行计划显示耗时是2.491秒,这是Oracle预估时间,实际在PL/SQL中的执行时间是大于20s。2.优化分析过程全表查询单列进行排序与对全列进行排序的效率对比运用单列排序分页3.Rownum和Rowid的...
  • 本文实例汇总了Oracle实现分页查询SQL语法,整理给大家供大家参考之用,详情如下: 1.无ORDER BY排序的写法。(效率最高) 经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响...
  • Oracle和Mysql的分页查询语句

    千次阅读 2017-07-17 15:59:56
    我们在进行分页查询业务时,不同数据库的sql语句可能不同,我在这里总结了Oracle和Mysql的sql语句。其本质都用到了子查询,这所以用到子查询,可能是行号作为新添加的字段,需要我们起别名来调用。 这里的sql语句...
  • 1、Oracle分页查询: 使用rownum,两种如下: 第一种: select * from (select t.,rownum row_num from mytable t) b where b.row_num between 1 and 10 第二种: select * from ( select a., rownum rn from ...
  • MySQL分页 Oracle分页 SQL Server分页 MySQL,ORACLESQL SERVER 分页查询语句 一、MySQL SELECT * FROM table_name LIMIT 0,5 ; 二、ORACLE SELECT * FROM ( SELECT t.* , rownum r FROM table_name...
  • <select id = "listQueryDpcInfoDO" resultMap ="getListDpcInfoDO" > select * from ( SELECT A.*, ROWNUM RN # from后为具体查询表语句 FROM ( select * from DPC...
  • * Sql优化 - Oracle数据库 sql优化 - Oracle数据库 Sql优化目的 Sql优化原则 绑定变量 where 条件 索引 排序和分页 其他问题 优化目的 将每一次操作需要占用的数据量(IO)和资源 (cpu,内存等)减少到最低,即在最短的...
  • Oracle, SQL Server 和MySQL的分页SQL语句如下:  oracle:方法1  SELECT * FROM   (  SELECT A.*, ROWNUM RN   FROM (SELECT * FROM TABLE_NAME) A   WHERE ROWNUM  )  WHERE RN >
  • oracle 分页 很棒的实现方法,大家可以分析下。
  • mybatis中mapper.xml分页查询oraclesql语句,按字段查询

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,516
精华内容 16,606
关键字:

oraclesql分页查询语句