day08—SQL高级查询

目标

1、子查询
2、分页查询
3、DECODE函数
4、排序函数

子查询:嵌入在其它SQL语句中的SELECT语句,大部分时候出现在WHERE子句中。

ps:本章学习内容所用数据表格请见:

http://blog.csdn.net/xie_xiansheng/article/details/50785030

一、子查询在WHERE子句中:

–查找和SCOTT同职位的员工

<span style="white-space:pre">	</span>select job from emp where ename='scott'; --查找scott的职位
<span style="white-space:pre">	</span>select * from emp where job = (select job from emp where ename='scott');

–查找薪水比整个机构平均薪水高的员工

<span style="white-space:pre">	</span>select avg(nvl(sal,0)) from emp; --查找整个机构所有员工的平均薪水
<span style="white-space:pre">	</span>select * from emp where sal>(select avg(nvl(sal,0)) from emp);

–查询出部门中有SALESMAN但职位不是SALESMAN的员工的信息

<span style="white-space:pre">	</span>select deptno from emp where job='salesman'--查找部门中有SALESMAN的部门
<span style="white-space:pre">	</span>select * from emp where deptno in (select deptno from emp where job='salesman')and job != 'salesman';

–列出来那些有员工的部门信息

<span style="white-space:pre">	</span>select * from dept d where  exists(select * from emp e where e.deptno=d.deptno)

子查询在HAVING部分:

–查询列出最低薪水高于部门30的最低薪水的部门信息

<span style="white-space:pre">	</span>select min(sal) from emp where deptno=30;--查询部门30的最低薪水
<span style="white-space:pre">	</span>select deptno ,min(sal) from emp group by deptno;--查找每个部门的最低薪水
<span style="white-space:pre">	</span>select deptno ,min(sal) from emp group by deptno having min(sal) >(select min(sal) from emp where deptno=30);

–查询出薪水比本部门平均薪水高的员工信息

<span style="white-space:pre">	</span>select deptno,avg(sal) from emp group by deptno;--查询每个部门的平均薪水
<span style="white-space:pre">	</span>select * from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) t1 
<span style="white-space:pre">	</span>where e.deptno=t1.deptno and e.sal>t1.avgsal;

子查询在SELECT部分:

把子查询放在SELECT子句部分,可以认为是外连接的另一种表现形式,使用更灵活:

<span style="white-space:pre">	</span>select e.ename, e.sal, e.deptno, (select d.deptno from dept d where d.deptno = e.deptno)  deptno  FROM emp e;

二、分页查询

ROWNUM:
ROWNUM被称作伪列,用于返回标识行数据顺序的数字。例如:

<span style="white-space:pre">	</span>select rownum , empno, ename, sal from emp;

如图:

《day08—SQL高级查询》

ROWNUM只能从1计数,不能从结果集中直接截取。下面的查询语句将没有结果:

<span style="white-space:pre">	</span>select rownum , empno, ename, sal from emp where rownum > 3;


如果利用ROWNUM截取结果集中的部分数据,需要用到行内视图:

<span style="white-space:pre">	</span>select * from (select rownum rn , e.* from emp e )  where rn between 8 and 10;

《day08—SQL高级查询》

也就是将ROWNUM先作为行内视图的一个列,在主查询中就可以使用这个列值作为条件。

三、DECODE函数

DECODE:基本语法
DECODE (expr, search1, result1[, search2, result2…][, default])
查询职员表,根据职员的职位计算奖励金额,当职位分别是’MANAGER’、’ANALYST’、’SALESMAN’时,奖励金额分别是薪水的1.2倍、1.1倍、1.05倍,如果不是这三个职位,则奖励金额取薪水值 

<span style="white-space:pre">	</span>select ename,job,sal,decode(job,'MANAGER',sal*1.2,'ANALYST',sal*1.1,'SALESMAN',sal*1.05,sal) sal2 
<span style="white-space:pre">	</span>from emp order by job;

《day08—SQL高级查询》


和DECODE函数功能相似的有CASE语句,实现类似于if-else的操作。

 <span style="white-space:pre">	</span>select ename,job,sal,
 <span style="white-space:pre">	</span>case job 
 <span style="white-space:pre">	</span>when 'MANAGER' then sal*1.2
 <span style="white-space:pre">	</span>when 'ANALYST' then sal*1.1
 <span style="white-space:pre">	</span>when 'SALESMAN' then sal*1.05
 <span style="white-space:pre">	</span>else sal 
 <span style="white-space:pre">	</span>end sal2 from emp order by job;

得到的结果和上图一样。

DECODE函数可以按字段内容分组。

例如:计算职位的人数,analyst/manager职位属于vip,其余是普通员工operation

《day08—SQL高级查询》


四、排序函数

ROW_NUMBER:语法如下
ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2排序。此函数计算的值就表示每组内部排序后的顺序编号,组内连续且唯一。

ROWNUM是伪列, ROW_NUMBER功能更强,可以直接从结果集中取出子集。

按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码

<span style="white-space:pre">	</span>select deptno ,ename ,empno ,ROW_NUMBER() over(partition by deptno order by empno ) emp_id from emp;


《day08—SQL高级查询》

RANK:语法如下
RANK() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2给予等级标识,即排名,相同的数据返回相同排名。特点是跳跃排序,如果有相同数据,则排名相同,比如并列第一,则两行数据都标记为1,但下一位将是第三名。

<span style="white-space:pre">	</span>select deptno, ename ,sal,rank() over(partition by deptno order by sal desc) rank_id from emp;

《day08—SQL高级查询》


DENSE_RANK:语法如下
DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2)

表示根据col1分组,在分组内部根据col2给予等级标识,即排名,相同的数据返回相同排名。特点是连续排序,如果有并列第二,下一个排序将是三,这一点是和RANK的不同,RANK是跳跃排序。
关联emp和dept表,按照部门编码分组,每组内按照员工薪水排序,列出员工的部门名字、姓名和薪水

<span style="white-space:pre">	</span>select d.dname,e.ename,e.sal,dense_rank() over( partition by e.deptno order by sal desc ) from emp e,dept d 
<span style="white-space:pre">	</span>where e.dptno = d.deptno;

《day08—SQL高级查询》


本章学习到此结束,欢迎广大博友讨论指点。








    原文作者:SQL
    原文地址: https://blog.csdn.net/xie_xiansheng/article/details/50792893
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞