个人学习 | MySQL学习(子查询与union操作)

文章详细介绍了MySQL中子查询的使用,包括在SELECT、FROM、WHERE子句中的应用,并给出了多个示例。同时,讲解了UNION操作如何合并查询结果集,强调了一层查询语句的优先级以提高效率。

子查询

select语句当中嵌套select语句,被嵌套的select语句是子查询。

子查询可以出现在哪里?

select
	...(select)...
from
	...(select)...
where
	...(select)...

where子句中使用子查询

例子:找出高于平均薪资的员工信息。

//错误写法
select * from emp where sal > avg(sal);

where子句中不能直接使用分组函数

select * from emp where sal > (select avg(sal) from emp);

from子句中使用子查询

例子1:找出每个部门平均薪水的薪资等级

第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)

select deptno, avg(sal) as avgsal from emp group by deptno;

第二步:将以上的查询结果当做临时表 t ,让 t 表和salgrade s 表连接,条件是t.avgsal between s.losal and s.hisal;

select t.*, s.grade from t join salgrade s on t.avgsal between s.losal and s.hisal;

合并第一步和第二步

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

例2:找出每个部门平均的薪资等级。
第一步:找出每个员工的薪水等级。

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

第二步:基于以上结果,继续按照deptno分组,求grade平均值。

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

能用一层查询语句就用,嵌套子查询的效率会降低。

select子句中嵌套子查询(用得少)

例子:找出每个员工所在的部门名称,要求显示员工名和部门名。

select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno;

嵌套子查询写法:

select e.ename, (select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;

union(可以将查询结果集相加)

例子:找出工作岗位是SALESMAN和MANAGER的员工
第一种:

select ename, job from emp where job = 'MANAGER' or job = 'SALESMAN';

第二种:

select ename, job from emp where job in ('MANAGER', 'SALESMAN');

第三种:

select ename, job from emp where job = 'MANAGER' 
union
select ename, job from emp where job = 'SALESMAN';

union关键字可以将两张不相干的表中的数据拼接在一起显示。
union修饰的两部分查询结果要确保字段数量一致(列数一致),否则会连接失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值