数据库学习2

      分页查询2:

       SELECT * FROM (
      SELECT ROWNUM cols,t.* FROM 
     (SELECT ename,sal FROM emp
     ORDER BY sal DESC) t WHERE ROWNUM <= 10)
     WHERE cols BETWEEN 6 AND 10


    在加编号时优化,可以对不必要的数据筛去,如果数据特别多,效率就会好点


   DECODE函数:

  类似于SWITCH

   DECODE(expr,search1,result1,search2,result2....default)

如果 expr 等于 search1  返回result1 

  如果expr 等于search2 返回 result2 

....\

 否则返回default

    

SELECT ename,job,sal,DECODE(
job,
'MANAGER',sal*1.2,
'ANALYST',sal*1.1,
'SALESMAN',sal*1.05,
 sal
) bons
FROM emp;

数据库学习2


类似DECODE  的函数CASE  实现类似IF-ELSE 的功能:

  SELECT ename,job,sal,
 CASE job WHEN 'MANAGER' THEN sal*1.2
          WHEN 'ANALYST' THEN sal*1.2
          WHEN 'SALESMAN' THEN sal*1.05
          ELSE sal END
     bonus
FROM emp

 两种结果是一样的

分组

SELECT COUNT(rex),rex FROM(
SELECT ename,job,DECODE(job,'MANAGER','VIP',
                    'ANALYST','VIP',
                    'SALESMAN','PR',
                    'OR') rex


FROM emp
)
GROUP BY rex


ORDER BY 排序中的应用:

 SELECT * FROM dept
ORDER BY DECODE(dname,
                      'OPERATIONS',1,
                      'RESEARCH',2,
                      'SALES',3) 

 改变排序方式


   排序函数: 排序函数允许对结果集按照指定的字段分组在组内再按照指定的字段排序,最终生成组内编号

     1、ROW_NUMBER 函数


--查看各部门的组内工资排名
SELECT ename,sal,deptno,
   ROW_NUMBER() OVER(
   --分组依据:
   partition by deptno
   --排序依据
   order by sal  
)

FROM emp 


数据库学习2

这时就有一个问题,有工资相同但是排名却 不一样,因为ROW_NUMBER 生成的编号是唯一的。

这就有了第二个排序函数  RANK()

      2、RANK()函数:生成组内不连续也不唯一的数字,跳号

     --查看各部门的组内工资排名
SELECT ename,sal,deptno,
   --ROW_NUMBER() OVER(
    RANK() OVER(
   --分组依据:
   partition by deptno
   --排序依据
   order by sal  
)
FROM emp 

  

数据库学习2


3、 DENSE_RANK ()函数 ,生成组内不连续但不唯一的数字(不跳号)

    写法都一样,这就不重复写了