本文主要是介绍oracle中rank与rownum,Oracle 中 rownum、row_number()、rank()、dense_rank() 函数的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
?简介
在之前还以为在 Oracle中只能使用rownum这个伪列来实现分页,其实不然。在 Oracle也与 MSSQL一样,同样支持 row_number函数,以及和rank、dense_rank这两个函数。下面就来讨论rownum与row_number函数的区别,以及另外两个函数的使用。
1.rownum
rownum是 Oracle在查询时对结果集输出的一个伪列,这个列并不是真实存在的,当我们进行每一个 SELECT查询时,Oracle会帮我们自动生成这个序列号(rownum),该序列号是顺序递增的,用于标识行号。通常可以借助rownum来实现分页,下面来看具体实现,比如我们需要取emp表中4到6行的记录:
1)首先,我们来看一个奇怪的现象
SELECT*FROMempWHERErownum>=4ANDrownum<=6;
啪,一执行,呀,怎么没数据啊?这并不是我们写错了,要解释这个问题,我们先来看一个图,就明白其中原由了。
由图可以看出,当我们取出第一条记录时,此时(rownum = 1) >= 3不成立,所以该记录会被排除;然后再取第二条,此时任然rownum = 1,因为只有成功满足一条记录,rownum才会加1,所以不满足又被排除掉了。这样依次类推,最终都不满足条件,所以全部都被排除掉了。所以,以下语句始终查不出数据:
SELECT*FROMempWHERErownum>1;
然后,在看另外一边(就是接下来用的这种判断方式),首先取第一条(满足),第二条也满足,直到(rownum = 7) <= 6,所以会取出6条记录,此时rownum的值为1,2,3,4,5,6。好了,搞清楚原理后我们就来实现。
2)根据对rownum的分析,便改为以下语句
SELECTrownum,t1.*FROM(
SELECTrownumrnum,t1.*FROMemp t1WHERErownum<=6
)t1WHEREt1.rnum>=4;
这样,通过子查询,先取出前6行,再过滤掉前3行,就得到了我们需要的数据。注意:之前提过,每个 SELECT都会产生一个rownum序列号,所有上面会可以输出两个rownum序列号,dual也不例外:
SELECTt1.*,rownumFROMdual t1;
3)除了使用以上语句,我们还可以这样写
SELEC
这篇关于oracle中rank与rownum,Oracle 中 rownum、row_number()、rank()、dense_rank() 函数的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!