分页:
rowid:
1)是一个伪列,由系统自动产生
2)能唯一标识每一条数据库行记录的物理地址,通过rowid能快速定位到一条行记录
rownum:伪列,一行的行号(从1开始计),数据结果集输出时添加行号
注意点:
1)rownum不能与>,>=(除了1),between..and一起使用;可以与<,<=,<>一起使用
2)rownum与order by一起使用会造成行号会乱,且数据不一定正确
rownum原理:
rownum是在记录输出时才生成,且总是从1开始,查出的数据若满足条件则计为1,若不满足条件则去掉,不计数,继续查询下一条记录,其余同上;
rownum不能与>,>=(除了1)使用原因:
若rownum>1,当查询出第一条记录,rownum计为1,但是不满足rownum>1的条件,所以该记录去掉,查询下一条记录,下一条记录仍计为1,又不满足,依次进行,循环,始终查不到值,故查询不到结果
分页的实现:top-n查询
1)不排序:
SELECT *
FROM (SELECT ROWNUM rn ,表名.* FROM 表名 WHERE ROWNUM<=每页的行数*页数) t
WHERE t.rn>=每页的页数*(页数-1)+1;
2)排序:
SELECT tt.* FROM (
SELECT ROWNUM rn,t.*
FROM (SELECT * FROM 表名 ORDER BY sal) t WHERE ROWNUM<=每页的行数*页数) tt
WHERE tt.rn>=每页的页数*(页数-1)+1;
PS:
1)分页不一定能和分组group by一起使用,
如:查询每个部门的工资最高的前几名,无法实现
2)可以用集合运算