首先,我们需要了解一下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开始查询也可以试一试。
新手一枚,如果有写的不好的地方,望见谅。如果有不理解的,可以留言。