Oracle数据库分页查询与decode函数

分页查询

  rownum:是数据库中提供的一个伪劣,作用是给记录分配行号。

   思想:先给记录分配行号,再根据我们要查找的范围进行检索,确定行号的范围。

  练习1:查询员工信息,同时分配行号

    select e.*,rownum from emp e;

  练习2:查询前5条员工的信息

    select e.*,rownum from emp e where rownum<6;

  练习3:查询员工表中的第6条到第10条

    select * from (select e.*,rownum ro from emp e) where ro between 6 and 10;

  练习4:查询第5页每页记录数为3

    select * from (select e.*,rownum ro from emp e) where ro between 13 and 15;

decode函数

  格式:decode(colName,search1,result1,[search2,result2].......,default);

  逻辑:检索colName的值,如果是search1,那就使用result1

              如果是search2,那就使用result2

              如果是search3,那就使用result3

              ......

              否则使用default

              没有default,返回的是null。

  练习1:年终发奖金,职位是'MANAGE R'发放月薪的1.2倍,'SALESMAN',发放月薪的1.1倍,'CLERK'发放月薪的1.05倍,其他月薪作为奖金,查询每个人年终奖以及姓名和职位 

   select ename,job,decode(job,'MANAGER',1.2,'SALESMAN',1.1,'CLERK',1.05,1)*sal  from emp ;

  注意:Mysql中没有decode函数这个用法。

case when

  

  与decode函数功能相同。

  格式:case colName when search1 then result1

            when search2 then result2

            ......

            else reulst0 end

  同上个练习:

  select ename,job,case job when 'MANAGER' then 1.2*sal when 'SALESMAN' then 1.1*sal when 'CLERK' then 1.05*sal else sal end from emp;

 

decode函数与group by连用:

  练习1:职位'MANAGER' 和'SALESMAN' 属于vip,职位'CLERK'属于svip,其他的属于ip,查询三种级别的人数 

     select le,count(*) from (select decode(job,'MANAGER','vip','SALESMAN','vip','CLERK','svip','ip') le from emp)t group by le order by count(*); 

  练习2:排序规则,accounting排第一,sales排第二位,research排第三位,operations排第四位

     select dname,le from (select dname,decode(dname,'ACCOUNTING',1,'SALES',2,'RESEARCH',3,'OPERATIONS',4)le from dept)t order by le desc;

排序函数

  写在select子句中

  1-->row_number() over(partition by colName1 order by colName2) 连续不重复

  2-->rank() over(partition by colName1 order by colName2) 不连续重复

  3-->dense_rank() over(partititon by colName1 order by colName2) 重复连续

  练习1:查询所有员工信息,按照月薪排序

    select e.*,dense_rank() over ( order by sal desc) from emp e;

  练习2:区间查询练习

     select * from (select e.*,dense_rank() over ( order by sal desc) rn from emp e) where rn>1 and rn<5;

猜你喜欢

转载自www.cnblogs.com/lyr999736/p/9045629.html
今日推荐