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个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
Oracle数据库rownum用法集锦相关推荐
- Oracle数据库rownum用法详解
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀. ...
- ORACLE 中ROWNUM用法总结!
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- 数据库oracle安装失败,Oracle数据库安装错误集锦
Oracle数据库安装错误集锦: ◆1.如果你不能运行./runInstaller ,提示x11 错误,请使用root 输入如下命令#xhost + ◆2.如果当你输入dbca命令之后在最后一步会莫名 ...
- 【数据库】ORACLE的rownum用法
一.概念 --对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的 ...
- Oracle中rownum用法警示
今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...
- 转:ORACLE 中ROWNUM用法总结!
对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,be ...
- oracle10 数据库审计,Oracle数据库审计用法实例
本节是从ORACLE METALINK的DOC:167293.1翻译整理而来的.通过举例的方式来说明ORACLE审计的用法.ORACLE的审计可以从语句级.对象 本节是从Oracle METALINK ...
- ORACLE 中ROWNUM用法总结(转载)
原文出處:http://www.cnblogs.com/believe3301/archive/2007/10/10/919408.html 对于 Oracle 的 rownum 问题,很多资料都说不 ...
- oracle数据库imp用法,imp导入数据库的用法
66.2. exp/imp 创建导入,导出用户 sqlplus /nolog conn system/manager GRANT CREATE USER,DROP USER,ALTER USER ,C ...
最新文章
- python100行代码-100行Python代码自动抢火车票!
- 7.06 生成累计和
- Twitter是如何做到每秒处理3000张图片的?
- 【Android FFMPEG 开发】FFMPEG 初始化 ( 网络初始化 | 打开音视频 | 查找音视频流 )
- SunPower携Sunverge纽约合作开发4MWh储能项目
- php’s fopen() 函数
- 前端学习(2880):数据代理和劫持
- 深度学习-自动并行计算
- 报错,> 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
- 力扣—— 36. 有效的数独/37. 解数独
- python多级菜单_python练习题:多级菜单(dict练习)
- 综合布线(楼栋)设计报告
- android 手机ssh客户端,android手机ssh客户端ConnectBot
- 笔记木计算机自动关机怎么办,为什么笔记本电脑自动关机 笔记本电脑自动关机解决方法...
- Revit二次开发—内建类别BuiltInCategory枚举(中英文对照)
- 伦敦国王学院计算机申请要求,伦敦大学国王学院计算机科学与管理本科申请条件.pdf...
- Excel如何统计指定背景颜色数据个数
- Android手机拍照或从本地相册选取图片设置头像。适配小米、华为、7.0
- win+ubuntu安装Nvidia显卡驱动
- 高斯模糊与图像失焦,附Python代码实现