一、子查询
1、什么是子查询?
select语句当中嵌套select语句,被嵌套的select语句是子查询
2、子查询都可以出现在哪里?
select
...(select)...
from
...(select)...
where
...(select)...
二、where子句中使用子查询
案例:找出高于平均薪资的员工信息
select * from emp where sal > avg(sal); // 错误的写法,where后面不能直接使用分组函数
第一步:找出平均薪资
select avg(sal) from emp;
第二步:where过滤
select * from emp where sal>(平均薪资);
第一步和第二步合并
select * from emp where sal>(select avg(sal) from emp);
三、from后面嵌套子查询
案例:找出每个部门平均薪水的薪资等级。
第一步:找出每个部门平均薪水(按照部门分组,求sal平均薪水)
select depno,avg(sal) from emp group by depno;
第二步:将以上的查询结果当作临时表t,让t表和salgrade表连接,条件是:t.avgsal betweem s.losal and s.hisal
select t.*,s.grade
from (select depno,avg(sal) from emp group by depno) t
join salgrade s
on t.avgsal
between s.losal and s.hisal;
四、在select后面嵌套子查询
案例:找出每个员工所在的部门名称,要求显示员工名和部门名
select
e.ename,
(select d.dname from dept d where e.depno=d.depno) 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');
第三种:union
select ename,job from emp where job = 'manager'
union
select ename,job from emp where job = 'salesman';
当我们需要将两张不相干的表中的数据拼接在一起显示的时候,就可以使用union进行连接。
union需要注意的事项:
1、sql1和sql2要想使用union查询必须保证查询的字段数量一致,否则报错,当sql1与sql2的查询字段名称不一致的时候,返回的字段名称为前面的一条sql为标准,但内容却是各自查询的东西
2、使用场景:2条查询,各自的where条件很复杂,可以简化为union,方便查询。