您的位置:首页 > 数据库

day08—SQL高级查询

2016-03-03 23:39 453 查看
目标

1、子查询

2、分页查询

3、DECODE函数

4、排序函数


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

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

/article/3701936.html

一、子查询在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)


子查询在H***ING部分:

--查询列出最低薪水高于部门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;


如图:



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;




也就是将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;




和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



四、排序函数

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;




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;




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;




本章学习到此结束,欢迎广大博友讨论指点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: