Oracle中rownum的使用

简介: 首先,我们需要了解一下ROWNUM的定义: ROWNUM是对结果集的编序排列,始终是从1开始。实际上ROWNUM并不是一个实际存在的列,所以我们平时对列进行的操作无法完全套用到上面。注意:ROWNUM的查询只能从1开始! 在做一个项目时遇到了ROWNUM的问题。当时是需要获取一张表中的数据,支持排序和分页。 举个例子:有一张STUDENT表,其中有STUDENTNUM(学生编号)

首先,我们需要了解一下ROWNUM的定义:

ROWNUM是对结果集的编序排列,始终是从1开始。实际上ROWNUM并不是一个实际存在的列,所以我们平时对列进行的操作无法完全套用到上面。注意:ROWNUM的查询只能从1开始!


在做一个项目时遇到了ROWNUM的问题。当时是需要获取一张表中的数据,支持排序和分页。

举个例子:有一张STUDENT表,其中有STUDENTNUM(学生编号)、STUDENTNAME(学生姓名)、SEX(学生性别)、AGE(学生年龄)。

需求:获取表中20岁以下的学生的信息并且以年龄进行排序(从小到大),每页只展示10条数据。

语句如下:SELECT * FROM (SELECT ROWNUM RN,a.* FROM (SELECT * FROM STUDENT WHERE AGE <=20 ORDER BY AGE) a ) b WHERE RN BETWEEN 1 AND 10


现在我们来分析下这条sql语句:

首先,a表,即(SELECT * FROM STUDENT WHERE AGE <=20  ORDER BY AGE)  这条语句查出的内容为年龄为20岁以下的信息。这时我们其实已经取出需要的数据集合了,但是我们需要对其进行分页获取。就需要用到ROWNUM。

然后,b表,因为a表内的ROWNUM其实是STUDENT表的默认排序列,所以我们不能在表a中直接使用ROWNUM。而我们需要的是a表数据结果的ROWNUM,所以我们用表b来进行包裹表a,此时表b的ROWNUM才是我们所要用的。

最后,为什么我们需要在表b中将ROWNUM查询出来并作为新的列来进行操作。这是因为ROWNUM的查询只能从1开始,如果我们使用WHERE ROWNUM BETWEEN 11 AND 20,这样的话,我们什么也查询不出来。


如果感觉有点理解不了,可以试下下面这条语句:

SELECT ROWNUM RN2,a.* FROM (SELECT ROWNUM RN1,s.* FROM STUDENT s WHERE AGE <=20 ORDER BY AGE) a

可以看下RN1和RN2是否一致,关于ROWNUM只能从1开始查询也可以试一试。


新手一枚,如果有写的不好的地方,望见谅。如果有不理解的,可以留言。 


目录
相关文章
|
SQL Oracle 关系型数据库
Oracle 的sql陷阱(1)rownum和order by一起使用
rownum和order by一起使用可能会遇到取数不准确的问题
4766 0
|
2月前
|
SQL 移动开发 Oracle
避坑,Oracle中rownum与order by的执行顺序
避坑,Oracle中rownum与order by的执行顺序
|
5月前
|
SQL Oracle 关系型数据库
Oracle之CASE-WHEN、ROWNUM
Oracle之CASE-WHEN、ROWNUM
28 0
|
12月前
|
SQL 移动开发 Oracle
Oracle中rownum和row_number()
Oracle中rownum和row_number()
596 0
|
Oracle 关系型数据库 Go
Oracle:On ROWNUM and Limiting Results
转载记录一篇关于ROWNUM伪列的文章来自Tom Kyte大师 https://blogs.oracle.com/oraclemagazine/on-rownum-and-limiting-results This issue's Ask Tom column is a little different from the typical column.
841 0
|
SQL 存储 运维
Oracle-12:伪列rowid和rownum
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       伪列:不真实存储在真表中,但是我们可以查询到不能对伪列进行增删改操作!   分页可以用rownum来分!!!!!!!(因为oracle中没有limit)   放一份数据库脚本,...
912 0
|
Oracle 关系型数据库 PostgreSQL
|
Oracle 关系型数据库

推荐镜像

更多