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

今天讲讲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. Eloquent JavaScript #10# Modules

    索引 Notes 背景问题 模块Modules 软件包Packages 简易模块 Evaluating data as code CommonJS modules ECMAScript modules ...

  2. kivy 小demo

    from kivy.lang.builder import Builder from kivy.uix.boxlayout import BoxLayout from kivy.app import ...

  3. Vim常用命令:移动 跳转 到 文档开头或末尾

    gg:命令将光标移动到文档开头 G:命令将光标移动到文档末尾 vi编辑器中在命令行模式下输入G可以直接跳转到页面的底部 在命令行模式下输入1G可以跳转到页面的头部位置 更多在vi中移动编辑位置的命令说 ...

  4. Docker学习笔记之了解 Docker 的核心组成

    0x00 概述 在掌握 Docker 的一些背景知识后,我们还不得不花费一节的篇幅来简单介绍有关 Docker 核心的一些知识.当然,大家不要觉得有“核心”这类的词,我们就要在这一节中深入 Docke ...

  5. 一次 Java 内存泄漏排查过程,涨姿势

    人人都会犯错,但一些错误是如此的荒谬,我想不通怎么会有人犯这种错误.更没想到的是,这种事竟发生在了我们身上.当然,这种东西只有事后才能发现真相.接下来,我将讲述一系列最近在我们一个应用上犯过的这种错误 ...

  6. 使用UI管理docker

    比较全面的对比 wangzi19870227 比较推荐的有两种(http://dockone.io/article/225): Shipyard 和 dockerui https://docs.doc ...

  7. 《学习OpenCV3》第14章课后习题

    1.在一条含有 N 个点的封闭轮廓中,我们可以通过比较每个点与其它点的距离,找出最外层的点.(这个翻译有问题,而且这个问题是实际问题) a.这样一个算法的复杂度是多少? b.怎样用更快的速度完成这个任 ...

  8. SPOJ Meteors - 可持久化线段树 - 二分法

    Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The plan ...

  9. 正则表达式验证HTTP地址是否合法

    转载:https://blog.csdn.net/fsdad/article/details/52637426 判断url是否合法 const std::regex urlpattern(" ...

  10. Android中activity的四个启动模式

    activity的四个启动方式分别是standard.singletop.singletask.singleinstance.第一个其实就是只要新打开活动就会新建一个实例.第二个顾名思义返回栈的顶部只 ...