转自:http://blog.csdn.net/happyqiuqiang/article/details/52230051

一、简单介绍一下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的区别和使用。

mysql rownum groupby_ORACLE的rownum用法。用rownum来进行分页查询相关推荐

  1. SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

    系列文章目录 SQL全方位攻略:1.数据库介绍 SQL全方位攻略:2.SQL介绍 SQL全方位攻略:3.SQL标准 SQL全方位攻略:4. 标准SQL和SQL"方言" 文章目录 系 ...

  2. mysql 李玉婷网课配套笔记(五) 分页查询,库和表的管理

    -- 进阶8:分页查询 /*应用场景:当要显示得到数据一页显示不全,需要分页提交sql请求语法:select 查询列表from 表[join type join 表2][on 连接条件][where ...

  3. Oracle、MySql、SQLServer 数据库分页查询语句

    (一).** mysql的分页查询** mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句* firs ...

  4. mysql 分页 去重_『备忘录』elasticsearch 去重分页查询

    一开始数据结构设计的很复杂,又是父子关系又是嵌套关系,结果发现不能通过简单的查询得到想要的结果:比如一个商店只出现一件符合条件的商品,弄得查询语句就变成这样了 curl -XPOST http://l ...

  5. Oracle中rownum的说明及用法总结

    Oracle中rownum的说明及用法总结 一.rownum的说明 rownum是Oracle特有的一个关键字. (1)对于基表,在insert记录时,oracle就按照insert的顺序,将rown ...

  6. mysql排序时设置主次_Mysql实现Rownum()排序后根据条件获取名次

    初始化表结构 DROP TABLE IF EXISTS `data`; CREATE TABLE `data` ( `dates` varchar(255) CHARACTER SET utf8 DE ...

  7. oracle中 rownum和rowid的用法

    1.ROWNUM的使用--TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的 ...

  8. oracle rownum=1什么意思,Oracle中rownum用法总结

    对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between--and,只能用以上符号(,>=,=,between--and 时会提示SQL语法错误,而是经常是 ...

  9. Oracle数据库实现主键自增(利用sequence)和分页查询(利用rownum)

    一.Oracle数据库实现主键自增必须通过sequence来实现 注意:sequence在每次调用nextval就会自增1 create sequence seq_user; --创建一个user表的 ...

最新文章

  1. for循环:用turtle画一颗五角星
  2. 马斯克的“大脑改造计划”,还需要点亮哪些技能树?
  3. Netty:另一种Web(套接字)服务器
  4. 02.Python 3.6.4下载与安装
  5. 我如何使用React和Typescript在freeCodeCamp中构建天气应用
  6. ThinkPHP框架 _ 学习3
  7. mysql 多机房灾备,TFS多机房容灾策略
  8. 浅谈动态规划和分治、贪心算法的区别
  9. Oracle 19c 新特性:自动化索引 Automatic indexing 实践
  10. 2019/5/28 感觉吧
  11. 被窃听、被定位:“裸奔时代”还有隐私吗?
  12. Prometheus 监控linux服务器
  13. Zend Framework学习之验证ing
  14. 利用Tushare合成期货主力连续数据
  15. 电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF
  16. 高通8996启动流程-2.总体启动流程
  17. 安卓miracast花屏_EMUI 10.1 Cast+无线投屏 让你开启“0”花屏新体验
  18. UE4中HUD、UMG、Slate之间的区别
  19. 长江雨课堂考试半自动答题python脚本
  20. 基于模板方法+协调者委托对现有冗余代码的改造案例

热门文章

  1. Hessian的使用以及理解
  2. 最新支付宝查询社保缴纳总月数(2021-11-24)
  3. 联想拯救者 R7000P 安装Ubuntu 21.04 出现屏幕亮度不能调节的问题
  4. 奇异值分解(SVD)原理详解
  5. 【转】“形象代言人”与“抽风式管理”
  6. 魅族pro6 android 6.0,魅族pro 6真机曝光:搭载Mback3.0和Flyme 6.0系统
  7. 魅族pro6 android 6.0,魅族PRO6有几个版本?魅族PRO6各版本区别对比介绍
  8. 手机连接电脑传文件的两种方法详解
  9. 青铜9:防患未然-如何处理线程中的异常
  10. 【python】二元一次方程求解python源代码