在ORACLE中利用ROWNUM的特性,可以实现数据库端的分页查询
ROWNUM:ROWNUM是一个伪列,伪列是使用类似于表中的列,而实际并没有存储在表中的特殊列;
ROWNUM的功能是在每次查询时,返回结果集的顺序号,这个顺序号是在记录输出时才一步一步产生的,第一行显示为1,第二行为2,以此类推。
1.如下SQL语句:
SELECT * FROM EMP WHERE ROWNUM > 2,查询不到任何记录,因为ROWNUM是在记录输出时才生成,并且总是从1开始,所有输出的第一条记录不满足>2的条件,被过滤掉,第二条的ROWNUM又成了1,又不满足>2的条件,又被过滤,依次类推,所有永远没有满足条件的记录,返回为空。所以对于ROWNUM只能执行<,>,<=运算,不能执行>,>=或一个区间运算Between....And等。
2.ROWNUM和ORDER BY一起使用时,因为ROWNUM在记录输出时生成,而ORDER BY子句在最后执行,所以当两者一起使用时,需要注意ROWNUM实际是已经被排除了序的ROWNUM。
分页查询:1,当未指定需要按照某列排序,语法为:
SELECT b.*FROM (SELECT ROWNUM rn,[列名1,列名2......列名n]
FROM 表名1,表名2......表名n
WHERE [条件表达式 AND] ROWNUM <= 目标页数*每页记录数) b
WHERE rn > (目标页数-1)*每页记录数;--取别名rn是为了和ROWNUM区别开
或写作:
SELECT b.*FROM (SELECT ROWNUM rn,[列名1,列名2......列名n]
FROM 表名1,表名2......表名n
WHERE 条件表达式) b
WHERE rn <= 目标页数*每页记录数 and rn > (目标页数-1)*每页记录数;
分页查询:2,指定需要按照某列排序时,语法为:
SELECT *FROM (SELECT ROWNUM rn, b.*
FROM (SELECT 列名1 [, 列名2,.... 列名n]
FROM 表名1,[ 表名2,... 表名n]
[WHERE 子句]
ORDER BY 列 要排序的列 ASC | DESC ) b
WHERE ROWNUM <= 目标页数* 每页记录数
)
WHERE rn > ( 目标页数-1)*数 每页记录数 ;
或写作:
SELECT *
FROM (SELECT ROWNUM rn, b.*
FROM (SELECT 列名1 [, 列名2,.... 列名n]
FROM 表名1,[ 表名2,... 表名n]
[WHERE 子句]
ORDER BY 列 要排序的列 ASC|DESC ) b
)
WHERE rn <= 目标页数*数 每页记录数 and rn > ( 目标页数-1)*