oracle分页查询及原理分析(总结)

  oracle分页查询是开发总为常用的语句之一,一般情况下公司框架会提供只需套用,对于增删改查而言,查是其中最为关键也是最为难的一块,其中就有使用率最高的分页查询。本人菜鸟,不足之处还望各位大神多多指导,谢谢各位看官!!!

  假定我们有一个sys_user用户表,具体如下:

字段 user_Id login_name password org_id create_time
注释 用户主键 登陆名 密码 单位id 创建时间

  

--srcSql,最底层sql
select * from SYS_USER t where t.org_id='402881e54c40d74d014c40d8407a0016' order by t.create_time desc;

  

  1、使用between ... and ... (不建议,数据量大情况下速度慢)
  如果使用between ... and ...  ,则对最底层进行再次封装成带行号的数据结果集,即下面sql语句,sqlA是最底层的sql。

--sql1.1
select rownum num, tmp.* from (srcSql) tmp

  因此得到了带行号的一个结果集,对此结果集进行区间帅选。

select *from (sql1.1) where num between 4 and 5

  全部的sql展示为:

select *
from (select rownum num, tmp.*
from (select *
from SYS_USER t
where t.org_id = '402881e54c40d74d014c40d8407a0016' order by t.create_time desc
) tmp) where num between 4 and 5

  2、熟悉行号生成机制,多层嵌套分页查询

  先放代码后说原因,不足之处还望多指导指导!!!  

--sql2.1 ,,,因行号rownum只能<=,<,!=,<>不能>=,>,=(=1是可以得),因此对所有的结果集先进行上限界定
select rownum num,tmp.* from (srcSql) tmp where rownum<=5

  对sql2.1查询的结果集作为一张表再进行下限界定,这样就可以更快的逐步缩小范围,范围小了,数据量少了,查询当然会更快!!!

select * from (sql2.1) where num>2;

  总共为三层,不知道你是否看明白???,全部的sql展示为:

select *
from (select rownum num, tmp.*
from (select *
from SYS_USER t
where t.org_id = '402881e54c40d74d014c40d8407a0016' order by t.create_time desc
) tmp where rownum <= 5) where num > 2;

  对比两种方法

  第一种方法是查出全局结果集,然后在全局结果集中在进行范围缩小,而第二种方法是一步一步的进行范围缩小,直到得到需求的结果集。。。不难看出第二种方法更为合适,在数据量大的情况下速度更为快一点。。。

  原理分析

  在两种方法中我们都用到了行号rownum,对于oracle的行号而言,这是一个动态的变量, 如果你去运行下面这个sql语句,你会发现无结果。为什么?

select * from SYS_USER t where t.org_id='402881e54c40d74d014c40d8407a0016' and  rownum>='3' and rownum<='5' order by t.create_time desc ;

  rownum是oracle中的一个伪列(pseudo column),其目的就是给查询出来的结果集标注行号。可以实现查询前n行(top-n),中间几行(middle-n),最后几行(bottom-n)的功能。但是rownum又是一个很特殊的列,使用过程中,首先要弄清楚oracle rownum的原理,然后加以分析。

  1.rownum不可以直接在前面加上表名或别名等。其他伪列如level,rowid等一样。

  2.rownum和where在同一层查询中,where条件之后使用rownum比较,只能使用<=,<,!=,<>,不能使用>,>=(>=1,>=0,>0和不加效果一样),=(使用=,只能是where rownum=1才可以,rownum>1不可以)。否则不返回任何数据。如果使用!=或<>,那么只是返回前n-1行,其他按照rownum工作原理推算。

  3.当rownum和order by在一个语句级别中(同一层)使用的时候.看这个查询的数据是否从索引中获取(或者根据索引先得到rowid然后定位行)的,并且获取的顺序和order by一致(注意索引可以自己desc获取的),如果不是,那么就是先查询出来,每行标上rownum,然后order by将结果重新排序,那么rownum的顺序是乱的,并且不是按照排序后获取TOP-N结果的,而是先查询的TOP-N,再排序

  java封装sql分页查询

  最底层sql,即本篇中的srcSql,先根据需求自己写出全部满足条件的结果集。

  我是一个j搞java的,下面是我简单的封装,基本满足大多数分页查询需要。

/**
**srcSql 原sql
**pageNo 页码
**pageSize 每页数量
**/
private String getPageQuerySql(String srcSql, int pageNo, int pageSize){
return "select * from (select tmp.*,rownum num from (", srcSql,
") tmp where rownum <= "+ pageNo*pageSize +
") where num >"+(page-1)*pageSize;
}

  开心一刻

  某大厦楼顶。
  女:“我们分手吧。”
  男:“为什么?我那么爱你?”
  女:“我爸知道我们的事之后一直反对,你又不是不知道,现在都不让我回家了!”
  男:“我相信我们的爱可以感动你爸的,你是知道的,我是真心爱你的!”
  女:“我知道!但是我们真的不能在一起,我们的爱不会得到祝福的,就算我老爸同意,等我老公 回来,他一定会跟你拼了的。”
  男:“我儿子什么脾气我会不知道?他没那个胆子!”
  哎,这一家人!

oracle分页查询及原理分析(总结)的更多相关文章

  1. Oracle分页查询语句的写法(转)

    Oracle分页查询语句的写法(转)   分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的 ...

  2. Oracle分页查询语句的写法

    分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. AD:2013云计算架构师峰会精彩课程曝光 Oracle分页查询语句使我们最常用 ...

  3. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

  4. mysql和oracle 分页查询(转)

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...

  5. oracle 分页查询数据重复问题

    最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照 ...

  6. mysql和oracle分页查询

    MYSQL分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实现分 ...

  7. 工作中遇到的oracle分页查询问题及多表查询相关

    在工作中,有时,我们会用到oracle分页查询.这时,就需要先了解oracle的rownum.rowmun是oracle的伪列,只能用符号(<.<=.!=),而不能用这些符号(>,& ...

  8. ORACLE分页查询SQL语法——最高效的分页

    --1:无ORDER BY排序的写法.(效率最高)--(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT  ...

  9. ORACLE 分页查询

    Oracle之分页查询 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SE ...

随机推荐

  1. Navicat for MySQL定时备份数据库及数据恢复

    在做数据库修改或删除操作中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库.本篇文章主要讲述Navicat for MySQL定时备份数据库和数据恢复等功能,同时可以定时播放电 ...

  2. MongoDB数据库详解

    第1章 数据库管理系统 1.1 前言 01.数据的定义:文字.图像.地理位置信息(坐标.经纬度)等 02.数据库管理系统的定义:建立.存取和管理数据,保证数据安全和完整性的软件 03.常见的数据库管理 ...

  3. 教你如何安装配置Windows7系统 IIS IIS7.5本地浏览测试网站 完整版介绍

    大家都知道网站建设前期测试于浏览网站都喜欢用iis本地浏览来操作 那么为了方便大家自己来安装和配置Internet信息服务 相信大家,对于Windows 7有了相应的了解,从操作上,使用上,内置功能上 ...

  4. C# .net中json字符串和对象之间的转化方法

    http://blog.csdn.net/xuexiaodong009/article/details/46998069 json作为作为一种最常用的数据,应用很广泛,在.net中如何把一个对象转化为 ...

  5. thinkinginjava学习笔记05_访问权限

    Java中访问权限等级从大到小依次为:public.protected.包访问权限(没有关键词).private: 以包访问权限为界限,public.protected分别可以被任意对象和继承的对象访 ...

  6. SQLServer 发布订阅(Replication)造成的Memroy压力(cmemthread等待)

    深入了解下发布订阅:     数据复制:允许一个数据源向一个或多个目标数据库分发数据,只需要OLE DB 访问接口即可访问: 整个复制框架包含:复制组件,复制代理,复制类型: 复制组件: 发布服务器: ...

  7. Qt Creator简单计算器的Demo

    小编在期末数据结构课设中遇到要做可视化界面的问题,特意去学习了一下Qt的用法,今天就来给大家分享一下. 我用的是Qt5.80,当然这只是一个简易的计算器Demo,,请大家勿喷. 首先我创建了一个Qt ...

  8. chrome浏览器解决ajax跨域问题

    方法一 1.右键谷歌快捷方式,选择"属性". 2.打开属性窗口,切换到"快捷方式"选项卡. 3.在目标路径的后面添加[ --disable-web-securi ...

  9. checkbox对齐-复选框图标

    checkbox对齐-复选框图标 一般开发过程中,我们直接使用<input type="checkbox"/>这样出现的复选框,设计师一般都说不好看 而让我们按照设计稿 ...

  10. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...