Oracle数据库rownum用法集锦
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用法集锦的更多相关文章
- ORACLE 中ROWNUM用法总结(转)
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- ORACLE 中ROWNUM用法总结!
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- 转:ORACLE 中ROWNUM用法总结!
oracle 分页查询语句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) ...
- Oracle数据库——ROWNUM
Oracle数据库--ROWNUM 前言 刚学到了ROWNUM的用法,网上一搜,结果发现了有很多帖子,写的都很全.本着好记性不如烂笔头的原则,我还是决定自己手打一遍,当然下面也附上了我参考的链接. ...
- Oracle中rownum用法警示
今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...
- ORACLE 中ROWNUM用法总结!(转)
对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,be ...
- [转]ORACLE 中ROWNUM用法总结!
原文地址:http://www.itpub.net/thread-824147-1-1.html 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between ...
- ORACLE的rownum用法讲解
如果选择踏足,终有一天你会爱上这条路. 今天讲讲ORACLE中关于ROWNUM的用法: 一.简单介绍一下ROWNUM是什么,可以用来干什么. 答:ROWNUM是一个序列,会根据sql语句自动给你加上一 ...
- oracle数据库rownum讲解(转)
https://blog.csdn.net/qq_40794266/article/details/78698321
随机推荐
- c#图片相关常用的方法及处理
总结一下图片相关,常用的几个操作 一 创建Image对象 1. 手头上有一些图片文件,希望转换成 c# 中 Image对象,然后加以使用. public static System.Drawing ...
- Linux帮助——重要文件
Linux帮助——重要文件 摘要:本文主要介绍了Linux系统中常用的文件. 查看系统安装版本 文件 /etc/redhat-release 内容 [root@localhost ~]# cat /e ...
- tornado中传递参数的几种方式
方法一 :tornado路由可以使用正则表达式中的子表达式传递url参数.比如:(r"/member//(\w*)/([01]*)", MemberHandler)匹配以后,tor ...
- css3自适应布局单位vw,vh详解
视口单位(Viewport units) 什么是视口? 在桌面端,视口指的是在桌面端,指的是浏览器的可视区域:而在移动端,它涉及3个视口:Layout Viewport(布局视口),Visual Vi ...
- VUE组内培训
最近去参加了一个外部VUE的周末培训,加上自己比较感兴趣所以对这项很热的前端框架做了点学习,顺便给组内同事做个简单的分享,希望下次有项目可以使用上- VUE的语法教程网上很多我就不一一列举,截图放一下 ...
- XCode证书问题
1. 确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2. 证书失效了,去开发者中心重新生成一个. 3. 包标识符不与描述文件包含的包标识符不一致,按照它的提示换一下就好了,最好不要点 ...
- 用python的time库写一个进度条
运算符 算数运算 如a=10,b=20 +两个数相加 a+b=30 -两个数相减 a-b=-10 两个数相乘 a****b =200 /两个数相除b/a=2 %取模,并返回余数b%a=0 幂,a*** ...
- hbase相关操作
hbase安装 下载 wget http://apache.gree.com/apache/hbase/hbase-1.2.11/hbase-1.2.11-bin.tar.gz tar -zxvf b ...
- selenium截取元素
http://www.mamicode.com/info-detail-2161474.html 常见问题 https://blog.csdn.net/u010616442/article/detai ...
- linux so库方式
gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so