子查询可以返回一行多列的数据
SELECT * FROM emp WHERE (job, sal) = (SELECT job, sal FROM emp WHERE ename = 'SCOTT');
使用 any :任意一个 , all(全部)
ANY 关键字
ANY :等于其中的任意一个就符合条件
SELECT * FROM emp WHERE sal =ANY(SELECT MIN(sal) FROM emp WHERE deptno IS NOT NULL GROUP BY deptno);
ALL 关键词
<>ALL : 不等于所有值就符合条件
SELECT * FROM emp
WHERE sal <>ALL(SELECT MIN(sal) FROM emp WHERE deptno IS NOT NULL GROUP BY deptno);
查询薪资大于任何一个经理薪资的员工信息
查询出了大于所有经理最小薪资的员工
SELECT * FROM emp WHERE sal >ANY(SELECT sal FROM emp WHERE job = 'MANAGER');
查询薪资大于全部经理薪资的员工信息
查询出大于所有经理最高薪资的员工
SELECT * FROM emp WHERE sal >ALL(SELECT sal FROM emp WHERE job = 'MANAGER');
join语句中使用子查询 , 在 FROM 子句中的子查询相当于一张临时表 , 在 FROM 子句中使用子查询可以减少笛卡儿积的数据量
查询出每个部门的编号、名称、位置、部门人数、平均工资
SELECT d.deptno, d.dname, d.loc, temp.cnt, temp.avg_salary
FROM dept d JOIN (SELECT deptno, COUNT(empno) cnt, ROUND(AVG(sal), 2) avg_salary
FROM emp
GROUP BY deptno) temp ON d.deptno = temp.deptno;
完全也可以使用 GROUP BY 来实现:
SELECT
d.deptno, d.dname, d.loc, COUNT(e.empno) cnt, ROUND(AVG(e.sal), 2) avg_salary
FROM dept d JOIN emp e ON d.deptno = e.deptno
GROUP BY d.deptno, d.dname, d.loc;