ORACLE的rownum用法讲解
如果选择踏足,终有一天你会爱上这条路。
今天讲讲ORACLE中关于ROWNUM的用法:
一、简单介绍一下ROWNUM是什么,可以用来干什么。
答:ROWNUM是一个序列,会根据sql语句自动给你加上一列排好顺序的序号列。For example!
你有一张全班同学的各科目成绩表。
1、然后你想给这张表按语文成绩加上排名。你会怎么做?
SELECT G.ID, G.NAME, G.CHINESE, ROWNUM AS CHINESE_SORT, G.MATH, G.ENGLISH
FROM (SELECT * FROM GRADE ORDER BY CHINESE) G
如果对所有科目成绩加上排名序号列呢?
提示一下这回要用到left join了,left join会在下一篇文章中讲解。先看下面sql代码:
SELECT *
FROM (SELECT T.NAME,
T.CHINESE,
T1.CHINESE_SORT AS CHINESE_SORT,
T.MATH,
T2.MATH_SORT AS MATH_SORT,
T.ENGLISH,
T3.ENGLISH_SORT AS ENGLISH_SORT
FROM GRADE T
LEFT JOIN (SELECT G1.NAME, G1.CHINESE, ROWNUM CHINESE_SORT
FROM (SELECT g.NAME, g.CHINESE
FROM GRADE g
ORDER BY g.CHINESE DESC) G1) T1
ON T1.NAME = T.NAME
LEFT JOIN (SELECT G2.NAME, G2.MATH, ROWNUM MATH_SORT
FROM (SELECT g.NAME, g.MATH
FROM GRADE g
GROUP BY g.NAME, g.MATH
ORDER BY g.MATH DESC) G2) T2
ON T2.NAME = T.NAME
LEFT JOIN (SELECT G3.NAME, G3.ENGLISH, ROWNUM ENGLISH_SORT
FROM (SELECT g.NAME, g.ENGLISH
FROM GRADE g
GROUP BY g.NAME, g.ENGLISH
ORDER BY g.ENGLISH DESC) G3) T3
ON T3.NAME = T.NAME) MyGrade
ORDER BY MyGrade.CHINESE_SORT;
执行代码后结果如下图所示
二、上面的内容主要讲解了ROWNUM的排序,是rownum最基本最直接的用法。不过rownum最常见的用法是用来做分页。
还是那张成绩变:
1、只显示前语文成绩前十名的学生记录
select g.* from grade g where rownum < 10 order by chinese;
很简单有没有。
2、想知道语文成绩第10名以后的学生记录:
select g.* from grade g where rownum > 10 order by chinese;
是这样吗?执行一下,并没有结果。
原因:文章开头说ROWNUM是一个序列,会根据sql语句自动给你加上一列排好顺序的序号列。
rownum总是为满足条件的记录从1开始设序号,所以rownum总是从1开始的。这理解起来并没有问题哈。当从数据库中找到语文成绩第一名的记录时,设序号为1,该记录不满足rownum>10。所以抛弃该记录,接着从数据库中找到语文成绩第二名的记录,又设序号为1,该记录依然不满足rownum>10,依次类推。所以穷尽整张表抛弃了所有记录。
正确的sql应该这样写:
select MyGrade.*
from (select G.*, rownum rn
from (select g.* from grade g order by chinese) G ) MyGrade
where MyGrade.rn >= 10;
先select所有记录并按语文成绩排好序,外套一个select加上序号列。这就为所有记录固定好了排序的顺序。再外套一个select取出从序号>=10 的所有记录;
3、获取第语文成绩有潜力提升到高分阶段的批次记录,比如第6名到第10名的记录:
select MyGrade.*
from (select G.*, rownum rn
from (select g.* from grade g order by chinese) G
where rownum <= 10) MyGrade
where MyGrade.rn >= 6;
当然,下面这段sql也可以实现同样的效果:
select MyGrade.*
from (select G.*, rownum rn
from (select g.* from grade g order by chinese) G
where rownum <= 10) MyGrade
where MyGrade.rn >= 6 and MyGrade.rn <= 10;
不过当数据量很大时,这段代码性能就次了好多,因为它要先遍历所有记录,然后根据序号分页。而对于之前的代码,由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率,所以只是遍历了rownum小于10的记录,就停止了内层查询。所以推荐使用第一种分页方法。
好了,rownum先讲到这里。如果有需要会在之后的文章中补充。下一篇文章讲解inner join、left join和right join的区别和使用。
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的ProC用法讲解
pro*c是高级的用法,OCI是oracle的基础用法 如何编译.pc文件: proc code=cpp parse=none iname=filename.pc oname=filename.cp ...
- Oracle中rownum用法警示
今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...
- Oracle数据库rownum用法集锦
Oracle中rownum可以用来限制查询 具体用法: 1.返回查询集合中的第1行 select * from tableName where rownum = 1 2.返回查询集合中的第2行 错误示 ...
- [转]ORACLE 中ROWNUM用法总结!
原文地址:http://www.itpub.net/thread-824147-1-1.html 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between ...
- ORACLE 中ROWNUM用法总结!(转)
对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,be ...
- Oracle rownum用法、分页
转载:ORACLE 中ROWNUM用法总结! 第一部分 1.对于 Oracle 的 rownum 问题,很多资料都说不支持 >, >= , =, between...and ,只能用 ...
随机推荐
- mean shift 图像分割(一、二、三)
https://blog.csdn.net/u011511601/article/details/72843247 MeanShift图像分割算法:大概是将复杂的背景,通过粗化提取整体信息,进而将图像 ...
- AJAX(表单验证)/JSON之一
## 什么是Ajax AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). 1. 异步通信:浏览器利用独立的线程与服务器进行通信, ...
- org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within
org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within timeo ...
- Linux的常用路由配置
1.配置默认路由 ip route add default via 192.168.10.1 dev eth0 route add default gw 192.168.10.1 2.间接路由: ip ...
- django 表单常用field
BooleanField字段:相当于单选框 CharField:接受字符串 参数:max_length最大长度,min_length最小长度 require字段是否是必须的,默认为required=T ...
- TCP编程:系统出现 TIME_WAIT 原因及解决办法
解决办法 打开 sysctl.conf 文件,修改以下几个参数: net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_ti ...
- 【题解】bzoj 4327 JSOI2012 玄武密码
原题传送门 我们先对所有询问串建立AC自动机(今天洛咕上有人分不清AC自动机和自动AC机) 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针所能到的所有前缀都是匹配成功的,暴力向 ...
- 05: 使用axios/vue-resource发送HTTP请求
1.1 axios 简介与安装 1.axios简介 1. vue本身不支持发送AJAX请求,需要使用vue-resource.axios等插件实现 2. axios是一个基于Promise的HTTP请 ...
- 《大话处理器》Cache一致性协议之MESI (转)
原文链接:http://blog.csdn.net/muxiqingyang/article/details/6615199 Cache一致性协议之MESI 处理器上有一套完整的协议,来保证Cache ...
- 20145320《网络对抗》注入Shellcode并执行
20145320注入Shellcode并执行 准备一段Shellcode 首先先准备一段C语言代码:这段代码其实和我们的shell功能基本一样 为了之后能够看到反汇编的结果,这次采用的静态编译.正常返 ...