个人学习 | MySQL学习(子查询与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修饰的两部分查询结果要确保字段数量一致(列数一致),否则会连接失败。
文章详细介绍了MySQL中子查询的使用,包括在SELECT、FROM、WHERE子句中的应用,并给出了多个示例。同时,讲解了UNION操作如何合并查询结果集,强调了一层查询语句的优先级以提高效率。
&spm=1001.2101.3001.5002&articleId=130112194&d=1&t=3&u=223378f928c24180a1070a51e1e683a4)
1439

被折叠的 条评论
为什么被折叠?



