如果选择踏足,终有一天你会爱上这条路。

今天讲讲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用法讲解的更多相关文章

  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的ProC用法讲解

    pro*c是高级的用法,OCI是oracle的基础用法 如何编译.pc文件: proc code=cpp  parse=none iname=filename.pc oname=filename.cp ...

  5. Oracle中rownum用法警示

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

  6. Oracle数据库rownum用法集锦

    Oracle中rownum可以用来限制查询 具体用法: 1.返回查询集合中的第1行 select * from tableName where rownum = 1 2.返回查询集合中的第2行 错误示 ...

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

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

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

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

  9. Oracle rownum用法、分页

    转载:ORACLE 中ROWNUM用法总结!  第一部分 1.对于 Oracle 的 rownum 问题,很多资料都说不支持 >, >= , =,  between...and ,只能用 ...

随机推荐

  1. jdbc连接 orale 和 mysql 所需要的jar包

    oracle: ojdbc6-12.1.0.2.jar mysql: mysql-connector-java-5.1.47.jar

  2. MyEclipse中项目运行时发生了Tomcat报错:[java.lang.OutOfMemoryError: PermGen space]

    Tomcat内存溢出,异常信息如下: 十一月 26, 2017 1:52:26 下午 org.apache.catalina.core.ContainerBase$ContainerBackgroun ...

  3. SSM思路大总结(部门信息的显示和增删改查)

    #ssm整合(部门管理) ##1.新建工程 1.新建maven工程 2.添加web.xml 3.添加tomcat运行环境 4.添加依赖jar包 spring-webmvc mysql commonse ...

  4. 合并ts到mp4

    这个比较好用. copy /b d:\xxx\download_ts\*   d:\xxx\download_ts\new.mp4 用python ffmpeg也可以,不过我合出来有卡顿或者掉声问题, ...

  5. php canvas 前端JS压缩,获取图片二进制流数据并上传

    <?php if(isset($_GET['upload']) && $_GET['upload'] == 'img'){ //二进制数据流 $data = file_get_c ...

  6. Differences Between Enterprise, Standard and Standard One Editions on Oracle 11.2 (Doc ID 1084132.1)

    标准版不允许并行.分区.闪回.各种缓存等大数据量必须特性,如此限制,oracle摆明了只卖企业版,买标准版不如mysql(如果不熟悉postgresql的话). Oracle企业版1 CPU 20w起 ...

  7. python 爬取历史天气

    python 爬取历史天气 官网:http://lishi.tianqi.com/luozhuangqu/201802.html # encoding:utf-8 import requests fr ...

  8. phpstorm官方教程

    https://confluence.jetbrains.com/pages/viewpage.action?pageId=15801728

  9. java调用ws服务

    1.找到ws服务地址,例如:http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx 2.新建项目 3.进入命令行窗口,进入当前项目src目录下,然 ...

  10. luogu P4051 [JSOI2007]字符加密

    前言 其实就是个后缀数组模板题 可还是有几个的地方不太明白 思路 先将子串复制一遍,组成长度为2*n的子串 给出的子串一定会在前n个后缀 而且后面的优先级不会影响前面的相对大小 然后求得sa输出就好 ...