Oracle数据库中分页功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Youth_Mr6/article/details/81461696


分页:
    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)可以用集合运算


 

猜你喜欢

转载自blog.csdn.net/Youth_Mr6/article/details/81461696
今日推荐