多表连接子查询学习笔记(msb16-23)

本文深入探讨了SQL查询的高级技巧,包括如何计算每个部门的平均薪水等级、确定平均薪水等级最低的部门、识别公司中的经理人员以及求解薪水最高值等复杂问题。通过实例演示了自连接、子查询和嵌套函数的巧妙应用,提供了优化查询效率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--每个部门平均薪水的薪水等级是多少。

要先求avg(sal),再和另外一张表做连接。

select deptno,avg(sal) avg_sal from emp group by deptno;
将结果视作一张表。
select deptno,avg_sal,grade from (select deptno,avg(sal) avg_sal from emp group by deptno)t join salgrade s on(t.avg_sal between  s.losal and s.hisal);

 

--每个部门薪水的平均等级

先求每个人的薪水等级。

select deptno,ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal);

看作一张新表,再按照deptno分组求平均:

select avg(grade),deptno from (select deptno,ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal)) t group by t.deptno;

 

--员工中哪些是经理人

雇员编号出现在别人的经理人中。

  select ename from emp where empno in(select mgr from emp);

更有效率的写法,使用distinct:

  select ename from emp where empno in(select distinct mgr from emp);

 

--求薪水最高值(不使用组函数)

考虑使用自连接,左边小于右边,则左边的最大值无法连接。

select distinct e1.sal from emp e1 join emp e2 on (e1.sal<e2.sal);
不在里面的即为最大值。
select distinct sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on (e1.sal<e2.sal));

 

--平均薪水最高的部门编号

select avg(sal)avg_sal,deptno from emp group by deptno;
看作一张表
select max(avg_sal) from(select avg(sal)avg_sal,deptno from emp group by deptno);
看作一个值
select deptno,avg_sal from (select avg(sal)avg_sal,deptno from emp group by deptno)where avg_sal=(select max(avg_sal) from(select avg(sal)avg_sal,deptno from emp group by deptno));

 

--平均薪水最高的部门编号的部门名称

select dname from dept where deptno=(select deptno from (select avg(sal)avg_sal,deptno from emp group by deptno)where avg_sal=(select max(avg_sal) from(select avg(sal)avg_sal,deptno from emp group by deptno)));

 

--求平均薪水的等级最低的部门的部门名称

分解法:
select dname from dept where deptno=(select deptno from (select avg(sal)avg_sal,deptno,grade from (select avg(sal)avg_sal,deptno from emp group by deptno)t join salgrade s on (t.avg_sal between s.losal and s.hisal) group by deptno)where grade=(select min(grade)from (select avg(sal)avg_sal,deptno,grade from (select avg(sal)avg_sal,deptno from emp group by deptno)t join salgrade s on (t.avg_sal between s.losal and s.hisal) group by deptno)));
平均薪水的等级最低的部门编号:
select deptno from (select avg(sal)avg_sal,deptno,grade from (select avg(sal)avg_sal,deptno from emp group by deptno)t join salgrade s on (t.avg_sal between s.losal and s.hisal) group by deptno)where grade=(select min(grade)from (select avg(sal)avg_sal,deptno,grade from (select avg(sal)avg_sal,deptno from emp group by deptno)t join salgrade s on (t.avg_sal between s.losal and s.hisal) group by deptno));
最低平均薪水等级(一个数):
select min(grade)from (select avg(sal)avg_sal,deptno,grade from (select avg(sal)avg_sal,deptno from emp group by deptno)t join salgrade s on (t.avg_sal between s.losal and s.hisal) group by deptno);
平均薪水的等级(一张表):
select avg(sal)avg_sal,deptno,grade from (select avg(sal)avg_sal,deptno from emp group by deptno)t join salgrade s on (t.avg_sal between s.losal and s.hisal) group by deptno;
平均薪水:
select avg(sal)avg_sal,deptno from emp group by deptno;

组函数可以嵌套,但不能超过两层。

 

--视图view

create view v$xxxxxx as (....)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值