MySQL笔记6——子查询

一、子查询

select语句中嵌套select语句,被嵌套的select语句是子查询,子查询可以出现在select\from\where后面

select
……(select)
from
……(select)
where
……(select)

1、where后面加select子查询

示例1:
找出高于平均薪资的员工信息

第一步:找出平均薪资
select avg(sal) from emp;
第二步:使用where过滤
select * from emp where sal>(select avg(sal) from emp);

在这里插入图片描述

2、from后面加select子查询

示例2:
找出每个部门平均薪水的薪资等级
第一步:先找出每个部门的平均薪资
select deptno,avg(sal) as avgsal from emp group by deptno;执行后得到下面的结果,将得到的表看做一张临时新表t
在这里插入图片描述
第二步:问题就变成在表t中avgsal字段介于哪个薪资等级,按照以往的写法
select t.*,s.grade from (上面的表) t join salgrade s on t.avgsal between s.losal and s.hisal;将t换成第一步的查询语句即可完成.。
最终的写法:

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

在这里插入图片描述
示例3:
求每个部门员工薪资等级的平均等级
第一步:求每个员工的薪资等级
第二步:求每个部门的的平均薪资等级
①、select e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
在这里插入图片描述
②、在上面基础上对deptno字段分组,在对grade字段求平均值。这里也可以使用上面示例2的方法,将这张表看做新表继续使用select语句来查询,如下面这样

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

针对于本题上面的嵌套查询显然效率低下,因为在第一步的时候已经得出表了,只需要按照deptno字段分组,再求grade字段的平均值就好了,没必要在select一次了,看下面的改进的方法

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

只在第一步后面加上group by分组,在select后面的s.grade字段求平均值就好了。没有上面嵌套的那么复杂,效率也高了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值