在 Oracle 数据库中,ROWNUM 和 ROW_NUMBER 有啥区别?
Posted
技术标签:
【中文标题】在 Oracle 数据库中,ROWNUM 和 ROW_NUMBER 有啥区别?【英文标题】:In an Oracle database, what is the difference between ROWNUM and ROW_NUMBER?在 Oracle 数据库中,ROWNUM 和 ROW_NUMBER 有什么区别? 【发布时间】:2010-09-15 12:47:22 【问题描述】:ROWNUM
和 ROW_NUMBER
有什么区别?
【问题讨论】:
【参考方案1】:ROWNUM 是一个“伪列”,它为查询返回的每一行分配一个数字:
SQL> select rownum, ename, deptno
2 from emp;
ROWNUM ENAME DEPTNO
---------- ---------- ----------
1 SMITH 99
2 ALLEN 30
3 WARD 30
4 JONES 20
5 MARTIN 30
6 BLAKE 30
7 CLARK 10
8 SCOTT 20
9 KING 10
10 TURNER 30
11 FORD 20
12 MILLER 10
ROW_NUMBER 是一个分析函数,它根据在一组行中的顺序为每一行分配一个数字:
SQL> select ename, deptno, row_number() over (partition by deptno order by ename) rn
2 from emp;
ENAME DEPTNO RN
---------- ---------- ----------
CLARK 10 1
KING 10 2
MILLER 10 3
FORD 20 1
JONES 20 2
SCOTT 20 3
ALLEN 30 1
BLAKE 30 2
MARTIN 30 3
TURNER 30 4
WARD 30 5
SMITH 99 1
【讨论】:
【参考方案2】:从一点阅读来看,ROWNUM 是 Oracle 自动分配给行集的值(在评估 ORDER BY 之前,所以不要永远 ORDER BY ROWNUM
或使用WHERE ROWNUM < 10
ORDER BY
)。
ROW_NUMBER() 似乎是一个函数,用于将行号分配给子查询或分区返回的结果集。
【讨论】:
order by 可以,例如 select * from (select a,b,c from foo order by d) where rownum @Ron:试试看。您会发现它从整个结果集中获取前 10 个结果,然后对它们排序。 @Powerlord:如果我们使用内部查询,那么 rownum 将应用于内部查询的结果【参考方案3】:rownum 是一个伪列,可以添加到任何选择查询中,对返回的行进行编号(从 1 开始)。它们根据何时被识别为最终结果集的一部分进行排序。 (#ref)
row_number 是一个解析函数,可用于按照 row_number() 函数规定的顺序对查询返回的行进行编号。
【讨论】:
-1 表示“它们按照返回行的顺序编号”。不正确——它们是根据它们被识别为最终结果集的一部分的时间排序的,所以它在 ORDER BY 子句之前【参考方案4】:除了答案中提到的其他差异外,您还应该考虑性能。这里有一份非权威但很有趣的报道,比较了各种分页方式,其中ROWNUM
的使用与ROW_NUMBER() OVER()
的使用对比:
http://www.inf.unideb.hu/~gabora/pagination/results.html
【讨论】:
【参考方案5】:Rownum 以 1 开头..在条件评估结果为 true 后增加。 因此 rownum >=1 返回表中的所有行
【讨论】:
以上是关于在 Oracle 数据库中,ROWNUM 和 ROW_NUMBER 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
在Oracle中有个rowid和rownum,他们是一样的吗?有啥作用?大神求解!!!
在 Oracle 数据库中,ROWNUM 和 ROW_NUMBER 有啥区别?
oracle 10g 在查询结果列中添加rownum列,查询出的条数增多。