ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle分页

2019-07-07 13:35:21  阅读:169  来源: 互联网

标签:分页 查询 start Oracle ROWNUM 数据 SELECT


Oracle分页相比较MySQL麻烦一点,但是也不复杂

首先学习分页之前需要知道一个东西,那就是ROWNUM:

   ROWNUM:它是一个伪列,用来给查询返回的行编号,其实也就是行号,它是从1开始计的。

其次,非常重要的一点,ROWNUM数值起初是空的,只有在查询到的数据满足选择条件时才会赋值。什么意思呢,

  举个例子:SELECT ROWNUM, ename FROM EMP WHERE ROWNUM > 5;

  这句sql是查询不到数据的,why? because当查询到第一条数据时,ROWNUM还是空的,所以where条件是不满足的,所以第一条数据不符合条件,ROWNUM不会赋值为1,依然为空,以此类推,直到查询完成也没有符合条件的数据,最后返回空。

所以,在Oracle分页时,需要先给数据编号,即先查ROWNUM,然后把查询到的数据当作一张表(即写在from子句中),再用需要查询的数据的ROWNUM的范围再查询一次即可。

因此:Oracle分页需要两步:

  1.编号

  2.取数据

  例:

  SELECT * FROM (SELECT ROWNUM r, column1, column2, ... FROM table) WHERE r >= start AND r <= size

  或者:

 SELECT * FROM (SELECT ROWNUM r, column1, column2, ... FROM table) WHERE r BETWEEN start AND size

但是,有时候我们在分页查询的时候可能有新的数据插入,所以可能导致第一页之后的查询出现重复的列,所以一般在分页之前我们会加上一步排序,防止数据重复:

  例:SELECT * FROM ( --取数据
 SELECT ROWNUM r, t.* FROM ( --编号
  SELECT column1, column2, ... FROM table ORDER BY column --排序
 ) t  
) WHERE r BETWEEN start AND end;

 

最后再介绍一下分页的两个小算法:

  page:页数 

  pageSize:每页显示的行数

 start=(page - 1) * pageSize + 1

  由于在Hibernate框架中,数据下标从0开始,所以start=(page - 1) * pageSize 

标签:分页,查询,start,Oracle,ROWNUM,数据,SELECT
来源: https://blog.csdn.net/q1059997113/article/details/76473769

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有