概念
在一个查询中嵌套多个查询,即查询的嵌套
一般规律
返回结果 | 应用位置 |
---|---|
单行单列(一个数据) | HAVING、WHERE |
多行单列(一列) | WHERE |
多行多列(一个表) | FROM |
在WHERE子句中的应用
单行单列
例子
SELECT * FROM emp WHERE hiredate=(SELECT MIN(hiredate) FROM emp);
SELECT * FROM emp
WHERE job=(SELECT job FROM emp WHERE ename='SCOTT')
AND sal=(SELECT sal FROM emp WHERE ename='SCOTT')
AND ename!='SCOTT';
多行单列
提供了一些查询范围,通常与IN这种操作结合使用
例子
SELECT * FROM emp WHERE sal NOT IN(SELECT sal FROM emp WHERE job='SALESMAN');
多行多列
在HAVING子句中的应用
单行单列
SELECT deptno,AVG(sal)
FROM emp
GROUP BY deptno
HAVING AVG(sal)>(SELECT AVG(sal) FROM emp);
在SELECT子句中的应用
出现频率较低,使用需求较低
例子
显示所有雇员的姓名、职位、部门名称与部门位置
SELECT e.ename,e.job,
(SELECT dname FROM dept WHERE deptno=e.deptno),
(SELECT loc FROM dept WHERE deptno=e.deptno)
FROM emp e;
在FROM子句中的应用
通常返回多行多列,可把返回结果看成单独一张表
查询出每个部门的编号、名称、位置、部门人数、平均工资
方法1
SELECT d.deptno,dname,loc,COUNT(empno),AVG(sal)
FROM dept d LEFT JOIN emp e ON d.deptno=e.deptno
GROUP BY d.deptno;
FROM子查询
SELECT d.deptno,dname,loc,temp.rs,temp.asal
FROM dept d LEFT JOIN(
SELECT deptno,COUNT(empno) rs,AVG(sal) asal
FROM emp
GROUP BY deptno
)temp ON d.deptno=temp.deptno;