7.1 单行子查询
-- 查询薪资高于员工编号为 7566 的员工信息的例子
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE empno = 7566);
7.2 子查询的空值和多值问题
- 空值问题: 当子查询没有返回任何数据时,主查询也不会返回任何结果。
-- 查询薪资高于员工编号为 8888 的员工信息,但该编号不存在
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE empno = 8888);
- 单行子查询: 如果子查询返回单行结果,可以使用单行记录比较运算符。
-- 查询薪资高于员工编号为 7566 的员工信息
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE empno = 7566);
- 多值问题: 如果子查询返回多行结果,则不允许使用单行记录比较运算符。
-- 查询薪资高于所有部门平均薪资的员工信息,该语句是非法的
SELECT * FROM emp WHERE sal > (SELECT AVG(sal) FROM emp GROUP BY deptno);
7.3 处理多行子查询
- ANY/SOME 关键字: 返回结果只要大于子查询结果中的任意一个即可。
-- 查询薪资高于任意部门平均薪资的员工信息
SELECT * FROM emp WHERE sal > ANY (SELECT AVG(sal) FROM emp GROUP BY deptno);
- ALL 关键字: 要求结果必须大于子查询结果中的所有值。
-- 查询薪资高于所有部门平均薪资的员工信息
SELECT * FROM emp WHERE sal > ALL (SELECT AVG(sal) FROM emp GROUP BY deptno);
-- 查询与 'MARTIN' 或 'SMITH' 职位相同的员工信息
SELECT * FROM emp WHERE job IN (SELECT job FROM emp WHERE ename = 'MARTIN' OR ename = 'SMITH');
7.4 Top-N 查询
- ROWNUM 关键字: Oracle 数据库中用于限制查询结果行数。
-- 查询前两条员工信息 (仅适用于 Oracle 数据库)
SELECT * FROM emp WHERE rownum = 1 OR rownum = 2;
暂无评论