oracle用rownum,Oracle:rownum和ROW_NUMBER()用法和误区

Oracle中支持窗口函数ROW_NUMBER(),其用法和MSSQLServer2005中相同,比如我们执行下面的SQL语句:

SELECT * FROM

(

SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) row_num,

FNumber,FName,FSalary,FAge FROM T_Employee

) a

WHERE a.row_num>=3 AND a.row_num<=5

执行完毕我们就能在输出结果中看到下面的执行结果:

0818b9ca8b590ca3270a3433284dd417.png

注意:rownum在Oracle中为保留字,所以这里将MSSQLServer2005中用到的rownum替

换为row_num;Oracle中定义表别名的时候不能使用AS关键字,所以这里也去掉了AS。

Oracle支持标准的函数ROW_NUMBER(),不过Oracle中提供了更方便的特性用来计算行

号,也就在Oracle中可以无需自行计算行号,Oracle为每个结果集都增加了一个默认的表示行号的列,这个列的名称为rownum。比如我们执行下面的SQL语句:

SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee

执行完毕我们就能在输出结果中看到下面的执行结果:

0818b9ca8b590ca3270a3433284dd417.png

使用rownum我们可以很轻松的取得结果集中前N条的数据行,比如我们执行下面的SQL语句可以得到按工资从高到底排序的前6名员工的信息:

SELECT * FROM T_Employee

WHERE rownum<=6

ORDER BY FSalary Desc

执行完毕我们就能在输出结果中看到下面的执行结果:

0818b9ca8b590ca3270a3433284dd417.png0818b9ca8b590ca3270a3433284dd417.png

看到这里,您可能认为下面的SQL就可以非常容易的实现“按照工资从高到低的顺序取出第三个到第五个员工信息”的功能了:

SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee

WHERE rownum BETWEEN 3 AND 5

ORDER BY FSalary DESC

执行完毕我们就能在输出结果中看到下面的执行结果:

0818b9ca8b590ca3270a3433284dd417.png

检索结果为空!!!这非常出乎我们的意料。让我们来回顾一下rownum的义:rownum

为结果集中每一行的行号(从1开始计数)。对于下面的SQL:

SELECT * FROM T_Employee

WHERE rownum<=6

ORDER BY FSalary Desc

当进行检索的时候,对于第一条数据,其rownum为1,因为符合“WHERE rownum<=6”

所以被放到了检索结果中;当检索到第二条数据的时候,其rownum为2,因为符合“WHERE rownum<=6”所以被放到了检索结果中……依次类推,直到第七行。所以这句SQL语句能够实现“按照工资从高到低的顺序取出第三个到第五个员工信息”的功能。而对于这句SQL语句:

SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee

WHERE rownum BETWEEN 3 AND 5

ORDER BY FSalary DESC

当进行检索的时候,对于第一条数据,其rownum为1,因为不符合“WHERE rownum

BETWEEN 3 AND 5”,所以没有被放到了检索结果中;当检索到第二条数据的时候,因为第一条数据没有放到结果集中,所以第二条数据的rownum仍然为1,而不是我们想像的2,所以因为不符合“WHERE rownum<=6”,没有被放到了检索结果中;当检索到第三条数据的时候,因为第一、二条数据没有放到结果集中,所以第三条数据的rownum仍然为1,而不是我们想像的3,所以因为不符合“WHERE rownum<=6”,没有被放到了检索结果中……依此类推,这样所有的数据行都没有被放到结果集中。

因此如果要使用rownum来实现“按照工资从高到低的顺序取出第三个到第五个员工信

息”的功能,就必须借助于窗口函数ROW_NUMBER()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值