oracle分页SQL(深入分析)

2 篇文章 0 订阅
订阅专栏

Oracle常用分页语句如下,但是这种分页写法,会随着查询的范围的扩大,而越来越慢。

有好的方法大家可以提出来交流一下。

1、带有排序的分页

select * from (
    select row_.*, rownum rn from (
        select * from 表名 t where 1=1
        order by #{排序字段}
    ) row_ where rownum <= #{pageEnd}
) where rn>=  #{pageStart}

2、不带排序的分页

select * from (
    select t.*,rownum rn from 表名 t where 1=1 and rownum <=#{pageEnd}
) where rn >=#{pageStart}

ps:

pageStart、pageEnd为传入参数,mybaits中的xml文件不支持>、<,需要用 &gt; 替换>、&lt; 替换<

 

此时你是不是有疑问,这种写法不是更好吗?

但是pageStart为大于1的记录时,下面查询结果就为空,原理分析在下面,有兴趣可以继续往下看看

select a.*,rownum from 表名 t a where rownum >=#{pageStart} and rownum <=#{pageEnd};

原理分析

实验数据

create table student_sorce(  
id   varchar2(32) primary key  not null,
name varchar2(32),
score number,
ranking varchar2(32)
);
insert all
into student_sorce values ('1','刘一','90','10')
into student_sorce values ('2','陈二','98','10')
into student_sorce values ('3','张三','91','10')
into student_sorce values ('4','李四','94','10')
into student_sorce values ('5','王五','93','10')
into student_sorce values ('6','赵六','92','10')
into student_sorce values ('7','孙七','97','10')
into student_sorce values ('8','周八','96','10')
into student_sorce values ('9','吴九','95','10')
into student_sorce values ('10','郑十','99','10')
SELECT 1 FROM DUAL;

在解读下面前,首先思考一下下面几条SQL的结果,结果下面会有:

select count(1) from student_sorce t where rownum =1;

select count(1) from student_sorce t where rownum =2;

select count(1) from student_sorce t where rownum=trunc(dbms_random.value(1,4));

select count(1) from student_sorce t where rownum>1;

select count(1) from student_sorce t where rownum<2;

 

上述分页查询用到伪列rownum,所以首先要理解伪列rownum

(1)什么是rownum

既然说了是伪列,顾名思义是不是实际存在的列,不能通过(表名.rownum)方式去访问

直接访问即可,例如:

select rownum from student_sorce t;

以下是错误的写法:

select t.rownum from student_sorce t;

(2)rownum的产生

首先要知道rownum总是从1开始;

然后规则,按我的理解每当结果集产生一条符合的记录,rownum+1;

这里论证一下上述观点:

select count(1)from student_sorce t where rownum =1;

查询为rownum=1,结果为1

select count(1) from student_sorce t where rownum =2;

到时查询rownum=2时,结果为0

 

但是下面SQL,实际返回结果是0-n条不等,这又是为什么呢?多执行几次,你会发现基本每次执行结果都不一样

select count(1) from student_sorce t where rownum=trunc(dbms_random.value(1,4));

 

查看一下执行计划,发现rownum=trunc(dbms_random.value(1,4)),是过滤谓词

trunc(dbms_random.value(1,4))的随机取值结果是1、2、3

数据库逐行扫描student_sorce表,此时rownum=1

扫描到第一条记录时,把rownum=1加在后面,假如trunc(dbms_random.value(1,4)不等于1,舍弃

扫描到第二条记录时,把rownum=1加在后面,假如trunc(dbms_random.value(1,4)等于1,保留,rownum+1,此时rownum=2

扫描到第二条记录时,把rownum=2加在后面,假如trunc(dbms_random.value(1,4)不等于2,舍弃

扫描到第三题记录时,把rownum=2加在后面,假如trunc(dbms_random.value(1,4)等于2,保留,rownum+1,此时rownum=3

...

故查询出来的记录是0-n条不等。

 

select * from tablet where rownum=trunc(dbms_random.value(1,n));

实际上,查询出来的结果记录数与tablet的总记录数和n的大小有关

若表的总记录数远大于n,则查询结果条数基本就是n-1条;(自己动手验证)

若n远大于表的总记录数,则查询结果基本为空;(自己动手验证)

 

现在你已经应该知道下面SQL的执行结果了

select count(1) from student_sorce t where rownum>1;

查询结果为0;

select count(1) from student_sorce t where rownum<2;

查询结果为1;

 

回归正题

到了这里,相信你也已经理解下面的分页语句为什么不能这么写了

select * from 表名 t where 1=1 and rownum >=  #{pageStart} and rownum <= #{pageEnd}

所以分页查询是 ,要先查询rownum <= #{pageEnd},再嵌套一层,再加查询 rownum >=  #{pageStart}

 

但是如果第一种写法改成下面的不是更好吗?

select * from (
    select t.*,rownum rn from 表名 t where 1=1 and rownum <=#{pageEnd}
    order by #{排序字段}
) where rn >=#{pageStart}

 

查询出,按成绩降序排序,前三条数据

我们先查询所有数据,手动排序一下,得到结果如下

然后用上面的SQL写的查询语句如下

select * from (
    select t.*,rownum rn from student_sorce t where 1=1 and rownum <=3
    order by score
) where rn >=1

查询结果如下,明显不对

看下执行计划,执行计划不懂的去度娘/google学习一下

其中执行计划的执行顺序:根据Operation缩进来判断,缩进最多的最先执行(缩进相同时,最上面的最先执行),即最右最上先执行原则;

rownum <=3比排序先执行故结果不正确,所以有order by时,rownum <=3要嵌套一层后再加

Oracle分页查询性能优化代码详解
09-09
本文将深入探讨Oracle分页查询的性能优化,并提供相关的代码示例。 首先,我们来看两种常见的分页查询方法: 1. **子查询与行号(ROWNUM)结合**: ```sql SELECT * FROM ( SELECT rownum RN, t.* FROM table t...
oracle的rownum深入解析
01-19
本人最近在使用oracle的rownum实现分页显示的时候,对rownum做了进一步的分析和研究。现归纳如下,希望能给大家带来收获。 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第...
oracle实现分页
weixin_45215156的博客
04-10 1985
oracle使用sql实现分页
oracle做分页的sql,Oracle 中的sql函数以及分页
weixin_39664456的博客
04-13 593
SELECT LPAD('Page 1',,'*.') "LPAD example" FROM DUAL;1.分页查询(1)方法一:使用 between and来实现分页select * from(select emp.*,rownum rn from emp)where rn between and(2)方法二:使用rownum来实现分页select * from(select e...
OracleSQL优化技巧(一):分页查询
最新发布
但行好事,莫问前程
04-06 1642
Oracle分页查询的进一步优化探索!✊
Oracle分页查询sql语句
weixin_30856725的博客
07-18 615
Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点,Oracle中分页使用rownum ,相对复杂一点。 sql语句如下: SELECT * FROM ( SELECT t.*, rownum rn FROM ( SELECT * F...
oracle分页查询sql语句
u014509493的博客
07-28 195
oracle分页查询sql语句 select a.empno, a.ename, a.job, a.mgr, a.hiredate, a.sal, a.comm, a.deptno from emp a where a.ename = 'SMITH' ; –1、无ORDER BY排序的写法。(效率最高) SELECT * FROM (SE...
oracle分页怎么查询,Oracle的分页查询详解
weixin_39825854的博客
04-02 1246
Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。分页查询格式:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (SELECT * FROM TABLE_NAME) AWHERE ROWNUM <= 40)WHERE RN >= 21其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM...
Oracle的分页查询详解及效率.doc
09-06
本文将深入探讨Oracle分页查询的两种常见方法,并分析它们的效率差异。 首先,基本的分页查询格式如下: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( SELECT * FROM TABLE_NAME ) A WHERE ROWNUM ) ...
Oracle数据库SQL语句的性能优化.pdf
09-19
这本"Oracle数据库SQL语句的性能优化.pdf"很可能提供了深入的指导,旨在帮助数据库管理员和开发人员理解如何写出高效、优化的SQL查询,以最大化数据库性能。 一、SQL性能优化的重要性 在大数据时代,数据库管理系统...
SQL查询的底层运行原理深入分析
09-08
6. **排序与分页 (Order by & Limit/Offset)**: 最后,对虚拟表vt4按照`city_name`进行升序排序,并使用LIMIT限制返回结果的数量,这里是2条记录。 在实际的数据库系统中,如MySQLOracle或PostgreSQL,这些步骤...
OracleSQL分页实践
07-26
OracleSQL分页实践
oracle一条sql语句分页
12-31
oracle 中没有像其他数据库那样用top来实现分页,但oracle提供了rownum 通过它也可以实现分页方法。
oracle中的分页语句怎么写,Oracle中实现分页的SQL语句
weixin_30395665的博客
04-09 1084
写了两个有关分页的SQL 语句,希望对大家有点帮助...记住,只能在Oracle下使用1 获取总页数SELECT DECODE(mod(COUNT(*),100),0,COUNT(*)/100,TRUNC(COUNT(*)/100,0)+1)AS pages FROM XZQH其中XZQH是表名,可以换成别的表格或者与别的表格相连或者加上查询条件....总之可以把XZQH换成FROM后的一切东西...
oracle分页查询sql语句的rn,SqlServer、Oracle实现数据分页查询显示
weixin_32035057的博客
04-02 1114
使用数据分页的目的:随着数据库数据的增加,查询结果所需的内存也就越来越大,导致终究会不够用;另外,大量数据的返回会极大的影响查询的响应效率。因此,对查询数据进行分页,每次返回一个分页的数据,是个比较好的选择。Ms SqlServer、Oracle实现分页的语句不同,以下为个人在项目中的总结。1. 要分页的数据查询所有数据的SQL语句为(后文称为原始语句):SELECT YPXH, YPMC FR...
浅谈Oracle、Mysql的分页查询SQL
qq_15901351的博客
05-29 2807
前提条件:假设当前是第PageNo页,每页有PageSize条记录,现在分别用MysqlOracle分页查询student表1、Oracel的分页查询:SELECT  * FROM    (        SELECT            ROWNUM   rn ,*        FROM            student        WHERE            Rownum &...
oracle分页查询
oldwolf1987的专栏
04-06 3146
Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。  分页查询格式:SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM )WHERE RN >= 21其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。RO
oracle分页sql
Sicily_winner的博客
03-12 798
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 &lt; 10 * 2 ) where ...
ORACLE分页SQL语句
vc_asp的专栏
12-12 511
1.根据ROWID来分--cid 是t_xiaoxi表中的一列 select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from t_xiaoxi  order by cid desc) where rownum where rn>9980)
oracle分页sql示例
04-21
下面是一个Oracle分页SQL示例: SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id ASC) AS row_num, t.* FROM your_table t ORDER BY id ASC ) WHERE row_num BETWEEN 11 AND 20; 这将返回第11行到第20行之间的结果,可以根据需要修改行号范围和排序条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • oracle分页SQL(深入分析) 3998
  • Mysql5.6版本修改编码格式utf8 2759
  • 使用idea学习SpringBoot整合Mybatis,遇到mapper无法注入的问题 2296
  • IDEA中搭建SSM环境-以学生信息管理系统为例(简易版)-Maven项目 2170
  • EasyUI combox 添加空白选项 1593

分类专栏

  • Oracle 2篇
  • 框架环境搭建 1篇
  • EasyUI 3篇
  • HTML+JS 1篇
  • 开发 1篇
  • SpringBoot 2篇
  • MySQL 1篇

最新评论

  • Mysql5.6版本修改编码格式utf8

    伶生: 不知道是我表达有问题,还是你没看明白。 就是5.6版本my.ini文件放的路径不是跟mysqld.exe在同一个目录下了

  • Mysql5.6版本修改编码格式utf8

    cddxrrr: 为什么 实际本并不是这样,要看你MySQL服务里面的启动设置,我之前是5.5版本,之前是没有 --defaults-file=“C:\ProgramData\MySQL\MySQL Server 5.6\my.ini”,只有“C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld.exe”这个,所以启动程序跟那个my.ini是放在一起,所以才可以把my_default.ini文件复制一份改名为my.ini,然后在那些节点下添加对应信息(上面2个) 这段我看不懂在干什么 到底想描述什么啊?

  • easyui的combobox的onLoadSuccess无限循环-问题记录

    伶生: 没解决表情包

  • EasyUI combox 添加空白选项

    伶生: 你可以去看看你那个版本easyUI版本源码,看看源码中是怎么判断的,把空白选项的value值设为判断的那个值就行了吧

  • EasyUI combox 添加空白选项

    Night_zzz: 好吧。。。,不是这个版本,感觉easyui好多坑,官方文档又太简单了

最新文章

  • easyUI 构建combox 多选框
  • EasyUI combox 添加空白选项
  • Oracle在mybatis实现分页查询
2021年1篇
2020年8篇
2019年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司石岩企业网站设计大鹏SEO按天计费深圳网站优化松岗网站推广系统宝安网站推广系统西乡SEO按效果付费坪山网站制作设计大芬网站改版大浪外贸网站设计横岗建设网站爱联网站关键词优化盐田百度网站优化民治网站搜索优化福田网站制作平湖网络推广坪山优化大运外贸网站设计民治SEO按效果付费坪山百度网站优化南联设计公司网站木棉湾建站龙岗优化木棉湾营销网站盐田网站优化软件龙华seo排名深圳SEO按天计费南澳网站优化推广平湖阿里店铺托管平湖网站seo优化大运网站制作设计歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化