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. 2018-8-10-win10-uwp-关联文件

    原文:2018-8-10-win10-uwp-关联文件 title author date CreateTime categories win10 uwp 关联文件 lindexi 2018-08-1 ...

  2. WPF中DataGrid在没有数据的时候也可以显示水平滚动条

    今天做项目中遇到个问题,就是页面加载后默认DataGrid是不加载数据的,但是DataGrid的列很多,就导致了运行效果上,此窗口的DataGrid没有水平滚动条,类似图片的效果. 经过百度和摸索,使 ...

  3. git 多账户链接不同gitlab仓库

    1.若之前对 git 设置过全局的 user.name 和 user.email.类似(用git config --global --list 进行查看你是否设置) 一定要清除之前设置的用户和邮箱 $ ...

  4. Java 实践:生产者与消费者

    实践项目:生产者与消费者[经典多线程问题] 问题引出: 生产者和消费者指的是两个不同的线程类对象,操作同一个空间资源的情况. 需求引出: —— 生产者负责生产数据,消费者负责取走数据 —— 生产者生产 ...

  5. SourceInsight教程

    概述: Source Insight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析.Source Insight能分析你的源代码并在你工作的同时动态 ...

  6. Android 7.0新特性

    还望支持个人博客站:http://www.enjoytoday.cn 由于google目前不是无法直接在国内访问,故此,对于android 开发平台的7.0新特性做个保存.也可供大家查阅.原文转自an ...

  7. jenkins解决乱码

    1.Jenkins系统设置中修改 点击左侧“系统管理”——右侧选择“系统设置”——“全局属性”,选择第一项:Environment variables,键值对列表,点击增加: 键:LANG 值:zh. ...

  8. 需求规格说明书(final)

    1. 引言 1.1 编写目的 该文档是关于微信小程序自习吧的功能和性能描述,重点描述了小程序的功能需求,并作为小程序开发设计阶段的主要输入. 本文档的预期读者包括:triple兔成员,软件工程老师,用 ...

  9. Spark的Monitoring

    一.启动历史页面监控配置: $ vi spark-defaults.conf spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop0 ...

  10. python字符减运算

    在C语言等高级语言中,字符之间的减运算都是支持的,但是python不然,在python中直接进行字符减运算是不被允许的. >>> print('c'-'a') Traceback ( ...