一、子查询:
♠ 子查询 --- 当我们需要执行某条 SQL语句时,需要某些查询的结果作为依据时,先去执行的这条查询语句就是子查询。除了可以用于 DQL , 还可以用于DML 和 DDL语句中。
例1:SELECT ename, sal FROM emp_rs WHERE sal > (SELECT sal FROM emp_rs WHERE ename = 'CLARK')
例2:在 DDL语句中使用 - 以子查询结果快速创建表
CREATE TABLE myemployee AS SELECT e.empno, e.name, e,sal, d.deptno, d.dname, d.loc FROM emp e, dept d WHERE e.deptno = d.deptno
例3:在 DML语句中使用-删除与 CLARK 相同部门的所有员工
DELETE FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'CLARK')
♠ 子查询根据查询的结果不同应用也不完全一样。
通常按照查询结果分为:
单行单列子查询:查询结果为 1 个值
多行单列子查询:查询结果为 1 个字段,但是有多条记录
多行多列子查询:看起来结果集像一张表,也常当作表来使用
♠ 子查询在 WHERE 子句中:如果子查询返回多行,主查询中要使用多行比较操作符。
(1) 在子查询中需要引用到主查询的字段数据,使用 EXISTS 关键字
(2) EXISTS 后边的子查询至少返回一行数据,则整个条件返回 true
EXISTS 关键字 --- 其后要跟一个查询语句,只要该查询能查询出至少一条数据, EXISTS 表达式就返回真
例如:查看有员工的部门信息
SELECT deptno, dname FROM dept_rs d WHERE EXISTS (SELECT * FROM emp_rs e WHERE d.deptno = e.deptno)
♠ 子查询在 HAVING 子句中:
例如:查看部门的最低薪水,前提是该部门最低的薪水要高于 30 号部门的最低薪水
SELECT MIN(sal) FROM emp_rs GROUP BY deptno HAVING MIN(sal) >(SELECT MIN(sal) FROM emp_rs WHERE deptno = '30')
♠ 子查询在FROM 子句中:
例如:查看工资高于本部门平均工资的员工信息
SELECT e.ename,e.sal,e.deptno FROM emp_rs e,(SELECT AVG(sal) avg_sal,deptno FROM emp_rs GROUP BY deptno) s WHERE e.deptno = s.deptno