• rownum伪行号-排行榜-分页


     rownum伪行号-排行榜-分页

    1.rownum 是oracle数据库特有的一个特性,它针对每一个查询(包括子查询),都会生成一个rownum用于对该次查询进行编号

    2.每个rownum只针对当前select 查询有效,可以使用别名进行显示

    例子:select rownum,emp.* from emp; --表名指定列(* 前面一定要别名指定列,或者表名指定列)

    例子:查询出工资最高的前五名

    --6个字句的执行先后 :from ,where,group by ,having,select ,select

    --先排序,后筛选

    (错误)select rownum,emp.* from emp where rownum<=5 order by sal desc; --先筛选后排序

    select * from (select * from emp order by sal desc) where rownum<=5; --要先排序,后筛选

    排行榜
    例子:

    --查询出工资水平在前5名的员工姓名,和工资

    --理解:先排序,在通过rownum查询出前5条,在查看工资是否存在在这前5条里面

    --本例包含三个查询,共有三个rownum

    select ename ,sal from emp

    where sal in(select * from ( select sal from emp order by sal desc) where rownum<=5) and rownum<=5;

    例子:

    --查询出工资最低的前五名

    --注意:查询排行榜时,可能遇到边界问题

    select rownum,emp.* from emp where rownum<=5 order by sal;

    --查询出工资最低的前五名 的姓名和工资

    select ename,sal from emp

    where sal in (select * from (select sal from emp order by sal asc ) where rownum <=5) and rownum <=5;

    分页查询
    --分页计算参数:第几页,分页大小 --计算分页

    --两种分页方法:rownum 和rownumde 别名

    注意:rownum 不支持 > 和 >= 判断;rownum的别名支持>和>=判断

    方法一

    例子:

    分页查询员工姓名,工资,入职日期;每页显示5条 分别查询出第1,2,3页数据

    方法一:

    理解:先在子查询中查询出前N页,在二次主查询查询出第N页;需要在子查询rownum别名

    --首先用子查询查询出1*5 1-5页,再用主查询查询出大于(1-1)*5 >0 1-2-3-4-5 就是第1页

    --首先用子查询查询出2*5 1-10页,再用主查询查询出大于(2-1)*5 >5 6-7-8-9-10就是第2页

    --首先用子查询查询出3*5 1-15页,再用主查询查询出大于(3-1)*5 >5 11-12-13-14-15就是第3页

    select * from (select rownum rn,emp.* from emp where rownum <=1*5) where rn >(1-1)*5

    select * from (select rownum rn,emp.* from emp where rownum <=2*5) where rn >(2-1)*5

    select * from (select rownum rn,emp.* from emp where rownum <=3*5) where rn >(3-1)*5

    方法二:

    --先在子查询中查询出所有的数据和数据的rownum,并使用别名表示,在第二次主查询中通过别名进行分页控制

    理解:--首先用子查询查询出所有数据 ,在用主查询控制分页:(3-1)*5<=rn<=3*5 第3页

    --首先用子查询查询出所有数据 ,在用主查询控制分页:(2-1)*5<=rn<=2*5 第2页

    --首先用子查询查询出所有数据 ,在用主查询控制分页:(1-1)*5<=rn<=1*5 第1页

    select * from (select rownum rn,emp.* from emp ) where rn<=3*5 and rn>=(3-1)*5;

    select * from (select rownum rn,emp.* from emp ) where rn<=2*5 and rn>=(2-1)*5;

    select * from (select rownum rn,emp.* from emp) where rn<=1*5 and rn>=(1-1)*5;

    方法一的效率更高

  • 相关阅读:
    deepin 系统更新命令
    安装mongdb
    读model所得
    上周某一天
    在项目中直接执行里面的文件
    数据库(六)
    数据库(五)
    数据库(四)
    数据库(三)
    数据库(二)
  • 原文地址:https://www.cnblogs.com/xiaomingit/p/11252899.html
Copyright © 2020-2023  润新知