复杂查询的分析思路整理

复杂查询,我们说复杂查询就是简单查询,限定查询,排序,分组,多表,子查询合计起来的查询
对于复杂查询,我们一定要先分析,按照思路来一步一步解决
以下是我总结的分析思路:
首先,确定两个表
dept
在这里插入图片描述
emp

在这里插入图片描述
问题1:列出工资高于部门为30的所有员工的工资的员工姓名,工资,部门名称,部门人数
1、确定要使用的数据表
emp表:姓名ename,工资sal
dept表:部门名称dname
emp表:统计出部门人数(使用子查询在调用一次emp表)
(这没什么解释的,一共就两个表)
2、确定已知的关联关系
emp.deptno = dept.deptno
子查询也会产生关联字段
第一步:先查询谁? 从内往外找,先找出部门为30的所有员工的工资,此时返回的是多行单列的数据

select sal 
from emp 
where deptno = 30;

第二步:找出工资高于部门为30的所有员工的工资的员工姓名,工资,只能在where子句里面套用子查询,此时应该使用>all判断符号(>all,返回比子查询返回的最大值还大的所有数据)

select e.ename,e.sal
from emp e
where sal >all (select sal 
						from emp 
						where deptno = 30)

第三步:查询出部门名称,就必须要引用新的表,而一旦引入表,就需要添加新的关联字段

select e.ename,e.sal,d.dname
from emp e,dept d
where sal >all (select sal 
						from emp 
						where deptno = 30) and e.deptno = d.deptno

第四步:在利用一个emp表统计出部门人数

select job,count(empno) from emp group by job

第五步:把统计出来的临时表,关联在from后面,记得放在from后面的子查询要设置别名,子查询查询出来的要显示的字段也要设置别名,from后面的子查询生成的临时表一定要和要关联的表有关系

select e.ename,e.sal,d.dname,temp.rens
from emp e,dept d,(select deptno tno,count(empno) rens
								 from emp 
								 group by deptno) temp
where sal >all (select sal 
						from emp 
						where deptno = 30) and e.deptno = d.deptno and temp.tno = d.deptno

问题二:列出工资比小黑或者小蓝高的所有员工的编号,姓名,其领导姓名,部门名称,平均工资,最高及最低工资
首先分析用到的表:
emp e:empno,ename
emp m:ename(领导姓名)
dept d:dname
emp:统计平均工资,最高,最低工资
确定关联字段:
e.mgr = m.empno
e.deptno = d.deptno
第一步:列出 小黑和小蓝的工资

select sal from emp where ename in ('小黑','小蓝')

第二步:列出比小黑或小蓝工资高的员工编号,姓名

select e.empno,e.ename
from emp e
where  e.sal >any (select sal 
								from emp 
								where ename in ('小黑','小蓝'))

第三步:列出领导姓名,在关联一个emp表

select e.empno,e.ename,m.ename
from emp e,emp m
where  e.sal >any (select sal 
								from emp 
								where ename in ('小黑','小蓝'))
								and e.mgr = m.empno

第五步:列出部门名称,关联dept表

select e.empno,e.ename,m.ename,d.dname
from emp e,emp m ,dept d
where  e.sal >any (select sal 
								from emp 
								where ename in ('小黑','小蓝'))
								and e.mgr = m.empno
								and e.deptno = d.deptno

第六步:统计部门平均工资,最高及最低工资

select deptno tno,avg(sal),max(sal),min(sal) 
from emp
group by deptno

第七步:将查询到的统计临时表嵌套到from后面(要考虑到员工没有部门的情况,所以给部门表加上外连接)

select e.empno,e.ename,m.ename,d.dname,temp.av,temp.ma,temp.mi
from emp e,emp m ,dept d,(select deptno tno,avg(sal) av,max(sal) ma,min(sal)  mi
													from emp
													group by deptno) temp
where  e.sal >any (select sal 
								from emp 
								where ename in ('小黑','小蓝'))
								and e.mgr = m.empno
								and e.deptno = d.deptno(+)
								and temp.tno = e.deptno

写在最后的话:
在处理复杂查询时,一定要分析,一步一步来处理数据!!!!在处理复杂查询时,一定要分析,一步一步来处理数据!!!!在处理复杂查询时,一定要分析,一步一步来处理数据!!!!重要的事情说三遍

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值