关闭

ROWNUM 与 ROW_NUMBER()OVER() 的区别

标签: sql
3733人阅读 评论(0) 收藏 举报
分类:

对于rownum和row_number()over()函数并没有太大差异。

row_number()函数的基本语法为:row_number() over(order by COLUMN_NAME) ,此函数还提供了排序的功能。

如果是在分页的场合下,我们首推row_number()over()函数。

我们已员工表为例子:

–查询(薪水从高到底的)员工信息

SELECT rownum,e.* FROM emp e ORDER BY sal;

结果:
这里写图片描述

–问题:为什么Order by以后行号(ROWNUM)是乱的。
–原因:先分配了行号(ROWNUM),再根据sal排序。

分页:

<1>第一页数据

SELECT ROWNUM ,t.* FROM ( 
   SELECT e.* FROM emp e ORDER BY e.sal DESC  ) t 
WHERE ROWNUM between 1 AND 3

结果:
这里写图片描述

<2>第二页数据

SELECT ROWNUM ,t.* FROM ( 
   SELECT e.* FROM emp e ORDER BY e.sal DESC  ) t 
WHERE ROWNUM between 4 AND 6

结果:

这里写图片描述

结果集为空!我们不难发现,ROWNUM必须从1开始!这是由rownum的特性(没有1就不会有2,没有3……以此类推下去),就像我一哥们说:没有父亲,哪来儿子!

问题:那么可能会有疑问,如何正确显示第二页的数据呢?

有两种方法:

第一种:以上的sql语句再嵌套一个SELECT语句

SELECT k.* FROM (
  SELECT ROWNUM r,t.* FROM ( 
     SELECT e.* FROM emp e ORDER BY e.sal DESC  ) t 
 ) k
WHERE r between 4 AND 6

结果:

这里写图片描述

第二种:使用ROW_NUMBER()OVER()函数

select t2.* 
  from (select t.*, row_number() over(order by t.sal desc) orderNumber 
          from emp t 
        ) t2 
where orderNumber between 4 and 6;

结果:

这里写图片描述

两者在效率上没有任何差异,如果是对索引列进行排序的时候,row_number()over()函数有明显优势。

转自:http://www.cnblogs.com/zhangrongqi/archive/2011/12/13/2285465.html

2
0
查看评论

Oracle Rownum和row_number() over()的使用

在Oracle怎样查询表中的top10条记录呢?      select *  from test  where rownum 下面是关于rownum的介绍  ==============================...
  • s464036801
  • s464036801
  • 2012-05-15 19:12
  • 4900

DB2中的ROW_NUMBER() OVER()函数用法

row_number() over()分组排序功能:      在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by  order by 的执行。 partition by 用于给结果集...
  • TUBER727
  • TUBER727
  • 2013-10-12 14:34
  • 4486

DB2中RANK和ROWNUMER的区别

select rank() over(partition by zch_tzxmxx_xmdw order by zch_tzxmxx_xmmc ) num,zch_tzxmxx_xmdw as "分组",zch_tzxmxx_xmmc as "排序" fro...
  • guoyankun
  • guoyankun
  • 2014-04-23 17:21
  • 3355

DB2中的ROW_NUMBER() OVER()函数用法

1、row_number() over()排序功能: (1) row_number() over()分组排序功能:      在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by...
  • yixiayizi
  • yixiayizi
  • 2014-05-16 14:35
  • 17738

DB2 中row_number() over()分析函数用法

row_number() over()分析函数用法 row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。  与ro...
  • fanyun_01
  • fanyun_01
  • 2016-11-30 18:18
  • 1451

ROW_NUMBER() OVER函数的基本用法

转自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html 语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number(...
  • z69183787
  • z69183787
  • 2014-04-10 09:57
  • 1436

ROWNUM与ROW_NUMBER()的体验

主要是在网上看到了一些关于排序分页的帖子,个人感觉有些不妥,就写出SQL进行了测试下,下面列出结果与看法。      通常先排序再分页都是使用ROWNUM伪列,通过将查询结果先进行排序,再使用两层SQL将查询结果进行分页,例子如:Sql代码 ...
  • cnham
  • cnham
  • 2010-04-20 17:21
  • 2047

row_number() OVER(PARTITION BY)函数介绍

OVER(PARTITION BY)函数介绍 开窗函数                Oracle从8.1.6开始提供分...
  • 631799
  • 631799
  • 2012-04-01 16:34
  • 90989

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)。 ...
  • iw1210
  • iw1210
  • 2013-09-23 16:39
  • 54496

详述 SQL 中的 distinct 和 row_number() over() 的区别及用法

1 前言在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在检索的时候,显示多条记录,这就有违咱们的初衷啦!因此,为了避免这种情况的发生,咱们就需要进行“去重”处...
  • qq_35246620
  • qq_35246620
  • 2017-02-22 16:29
  • 10957
    个人资料
    • 访问:71034次
    • 积分:993
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:100篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论