zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    POJ3164 Command Network
    UVa11401 Triangle Counting
    UVa11174 Stand in a Line
    UVa11806 Cheerleaders
    Uva11538 Chess Queen
    Bzoj3130 [Sdoi2013]费用流
    Bzoj3262 陌上花开
    模拟25A 题解
    模拟24 题解
    模拟23 题解
  • 原文地址:https://www.cnblogs.com/lyr999736/p/9045629.html
Copyright © 2011-2022 走看看