Oracle中rownum可以用来限制查询

具体用法:

1、返回查询集合中的第1行

select * from tableName where rownum = 1

2、返回查询集合中的第2行

错误示例:

select * from tableName where rownum = 2

正确示例:

select * from(select a.*,ROWNUM rownum_ from tableName a) where rownum_ = 2

提高效率可以这样写:

select * from(select a.*,ROWNUM rownum_ from tableName a ROWNUM <= 2) where rownum_ = 2

区别是内层查询先在内部过滤一波。

3、返回查询集合中的前5行

返回前5行,正确用法:

select * from tableName where rownum <= 5

或:

select * from tableName where rownum <= 5 AND rownum >= 1(0)

即加上>=1或写成>=0是没问题的

4、返回查询集合中的第3-5行

错误示例:

select * from tableName where rownum <= 5 AND rownum >= 3

这样返回为空

** rownum不可以用于>或>=,除非是后面跟0或1 **

正确示例:

select * from(select a.*,ROWNUM rownum_ from tableName a) where rownum_ >= 3 and rownum_ <= 5

select * from(select a.*,ROWNUM rownum_ from tableName a ROWNUM <= 5) where rownum_ >= 3

5、rownum分页查询

由第4条可以引出分页查询,配合rownum和子查询实现分页。

select * from(
select row_.*,rownum rownum_ from(
select * from tableName
) row_
)
where rownum_ >= 3 and rownum_ <= 5

三层嵌套查询,最内层查询是你的业务逻辑SQL,外面两层查询主要用来限制查询行数,可以提取出来套用,作为公共SQL拼装分页SQL。

乍一看,这和第4条【返回查询集合中的第3-5行】中的SQL查询效果一样,而且第4个还更简化。那为啥不用第4条的呢?

因为第4条的破坏了原始SQL(最初的业务逻辑SQL,不考虑任何其他只关注业务),在原来的SQL上加上了rownum,不太好。

而第5条,最内层查询是原始SQL,最纯净的,没有被破坏,只需要在自己的SQL外嵌套上分页SQL的模板即可,把模板提取出来,直接使用,对程序员来说是透明的,屏蔽了分页SQL,使程序员只关注业务实现,便于开发。

另一种写法:

select * from(
select row_.*,rownum rownum_ from(
select * from tableName
) row_ where rownum <= 5
)
where rownum_ >= 3

对比这两种写法,绝大多数的情况下,第2个查询的效率比第1个高得多。

这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第2个查询语句,第二层的查询条件where rownum <= 5就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了rownum限制条件,就终止查询将结果返回了。即最多只查5条。

而第1个查询语句,由于查询条件存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道rownum_代表什么)。因此,对于第1个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第2个查询低得多。

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

转自:https://blog.csdn.net/ibigboy/article/details/89889164

Oracle数据库rownum用法集锦的更多相关文章

  1. ORACLE 中ROWNUM用法总结(转)

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  2. ORACLE 中ROWNUM用法总结!

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  3. 转:ORACLE 中ROWNUM用法总结!

    oracle 分页查询语句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) ...

  4. Oracle数据库——ROWNUM

    Oracle数据库--ROWNUM 前言   刚学到了ROWNUM的用法,网上一搜,结果发现了有很多帖子,写的都很全.本着好记性不如烂笔头的原则,我还是决定自己手打一遍,当然下面也附上了我参考的链接. ...

  5. Oracle中rownum用法警示

    今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...

  6. ORACLE 中ROWNUM用法总结!(转)

    对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,be ...

  7. [转]ORACLE 中ROWNUM用法总结!

    原文地址:http://www.itpub.net/thread-824147-1-1.html 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between ...

  8. ORACLE的rownum用法讲解

    如果选择踏足,终有一天你会爱上这条路. 今天讲讲ORACLE中关于ROWNUM的用法: 一.简单介绍一下ROWNUM是什么,可以用来干什么. 答:ROWNUM是一个序列,会根据sql语句自动给你加上一 ...

  9. oracle数据库rownum讲解(转)

    https://blog.csdn.net/qq_40794266/article/details/78698321

随机推荐

  1. 黄聪:wordpress登录后台后load-scripts.php载入缓慢

    今天一个微信群里一个好友问大鸟,他的wordpess后台载入非常缓慢,缓慢到什么程度,我们看图: 这个真的是超级慢了,这类问题怎么解决呢,我们登录后台后,按下F12打开控制台,接着点击network, ...

  2. 【CF1172E】Nauuo and ODT(Link-Cut Tree)

    [CF1172E]Nauuo and ODT(Link-Cut Tree) 题面 CF 给你一棵树,每个节点有一个颜色. 定义一条路径的权值为路径上不同颜色的数量.求所有有向路径的权值和. 有\(m\ ...

  3. 数据库——SQL-SERVER练习(1)连接与子查询

    一.实验准备 1.复制实验要求文件及“CREATE-TABLES.SQL”文件, 粘贴到本地机桌面. 2.启动SQL-SERVER服务. 3. 运行查询分析器, 点击菜单<文件>/< ...

  4. 调试接口你还在用postman吗

    作者 | 陈凯玲 来源 | my.oschina.net/keking/blog/3104972 接口调试是每个软件开发从业者必不可少的一项技能,一个项目的的完成,可能接口测试调试的时间比真正开发写代 ...

  5. SpringBoot(14)—注解装配Bean

    SpringBoot(14)-注解装配Bean SpringBoot装配Bean方式主要有两种 通过Java配置文件@Bean的方式定义Bean. 通过注解扫描的方式@Component/@Compo ...

  6. Web前端基础(7):JavaScript(一)

    1. JavaScript概述 1.1 JavaScript历史背景介绍 布兰登 • 艾奇(Brendan Eich,1961年-),1995年在网景公司,发明的JavaScript. 一开始Java ...

  7. mysql - 锁及事务的认识

    mysql事务特性:一致性原子性隔离性持久性 //mysql 事务隔离级别 读未提交 读未提交的数据 读已提交 读已提交的数据 串行序列化 一个事务完成了再执行另一个事务 可重复读(数据库默认) 就算 ...

  8. SpringBoot(十):SpringBoot整合Memcached

    一.环境准备memcached 1.4.5SpringBoot 1.5.10.RELEASEjava_memcached-release_2.6.6.jarmemcached 1.4.5 window ...

  9. Android框架Volley使用:Json请求实现

    首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: < ...

  10. configure.ac文件和Makefile.am文件 编译

    在编译安装openvpn 项目时遇到,其编译过程如下:生成 configure 可执行文件 make && make install ; . aclocal . autoconf . ...