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

今天讲讲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

很简单有没有。

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第3名到第6名,ORACLE的rownum用法讲解相关推荐

  1. oracle查询表的字段类型有哪些,oracle中查询表的信息,包括表名,字段名,字段类型,主键(精)...

    通过搜索摸索,总结了一下 oracle 中查询表的信息,包括表名,字段名,字段类型,主键, 外键唯一性约束信息,索引信息查询 SQL 如下,希望对大家有所帮助: 1.查询出所有的用户表 select ...

  2. bootstraptable获取所有数据_一键获取oracle用户下所有表的表名与其数据量

    概述 作为DBA,对数据库中表段.索引段之类的数量,大概的级别是需要有个大致了解的,今天主要分享一个存储过程,可以很实用的获取到oracle用户下所有表的表名与其数据量. 查询当前用户名下所有表 se ...

  3. 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名及手工脚本创建oracle数据库...

    数据库名.实例名.数据库域名.全局数据库名.服务名 , 这是几个令很多初学者容易混淆的概念.相信很多初学者都与我一样被标题上这些个概念搞得一头雾水.我们现在就来把它们弄个明白. 一.数据库名 什么是数 ...

  4. oracle遍历表做查询,oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)...

    语句的执行环境是plsql的sql窗口, 语句的目的是从整个数据库中的所有表判断 不等于某个字段的记录数 . 代码如下: declare s_sql clob:=''; -- 声明一个变量,该变量用于 ...

  5. 修改linux下全局数据库名,linux/unix下修改oracle数据库实例名的方法

    linux/unix下修改oracle数据库实例名的方法 2018年12月10日 | 萬仟网IT编程 | 我要评论 linux/unix下修改oracle实例名的方法 1.检查原来的数据库实例名 $ ...

  6. 如何区分Oracle的数据库,实例,服务名,SID

    什么是数据库,其实很简单,数据库就是存储数据的一种媒介.比如常用的文件就是一种,在Oracle10G中,数据的存储有好几种.第一种是文件形式,也就是在你的磁盘中创建一批文件,然后在这些文件中存储信息. ...

  7. oracle系统库名,Oracle 札记之 一:数据库名,数据库实例名,数据库域名,操作系统环境变量...

    数据库名是用于区分数据库的一个内部标识,是以二进制方式存储在数据库控制文件中的参数.数据库创建之后不能再修改这个参数.数据库创建后,它被写入数据库参数文件pfile或Spfile中.格式如下: ... ...

  8. oracle数据库全数据库名,Oracle数据库中的 数据库域名、数据库名、全局数据库名、SID、数据库实例名、服务名 解释...

    菜鸟雷区 在配置listener.ora 和 tnsnames.ora 连接Oracle数据库服务器时,我们需要把 以下容易混淆的概念区分开来 数据库域名 数据库名 全局数据库名 SID 数据库实例名 ...

  9. oracle数据库连接名是什么,连接到Oracle数据库的几种命名方式

    连接到Oracle数据库的几种命名方式 从事 Oracle 相关工作的人,每天都会使用各种工具连接到 Oracle 数据库,比如:SQL*Plus.PL/SQL.TOAD.SQLDeveloper 等 ...

最新文章

  1. 【转】计算机学会推荐国际学术期刊
  2. 2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫
  3. python编程内置函数使用方法_Python内置函数 next的具体使用方法
  4. 萧山职称计算机考试培训,浙江萧山2017年职称计算机考试时间安排
  5. Javascript中for循环别名
  6. solaris 10 oracle 11g r2安装教程,Oracle 11gR2 on Solaris 10安装技术文档(原版英文)
  7. 淘宝装修基础版全屏店招
  8. 纯js代码-实战轮播图
  9. 机器学习模型评估指标
  10. sqlite3返回码
  11. 百度商桥点击咨询自定义按钮
  12. HomeKit生态设备少?不如来看看Aqara和智汀跨平台互联
  13. 手把手教你 win10 安装Paddlepaddle-GPU
  14. 操作系统原理实验(5):内存管理
  15. RuntimeError: Attempting to deserialize object on CUDA device 3 but torch.cuda.device_count() is 1.
  16. 韦东山嵌入式第一期学习笔记DAY_4——8_3编写第1个程序点亮LED
  17. java 私有构造_JAVA中构造方法私有化的作用是什么?
  18. Mysql主从复制集群配置与实战
  19. QQ找茬辅助源码下载
  20. 自己动手不求人 - ghost安装系统软件硬盘安装器 安装ghost图文教程

热门文章

  1. 【3.0】第一个Hibernate4程序----详解
  2. 微信小程序开发记录1——创建小程序
  3. 交流永磁发电机的功率以及转速的调整
  4. Java实现Josephus约瑟夫环问题的算法
  5. idea 数据库取消字段隐藏
  6. POI3.5 HSSFXSSF Excel 操作快速入门
  7. SAP script 自动创建销售订单机器人,协同Excel
  8. 如何查看显卡支持的CUDA版本
  9. 供应python少儿编程课_“提供”的“供”的读音是什么?
  10. 电感高频阻抗计算及导线寄生电容与电感