子查询:
在一个查询的内部还包含另外一个查询
可在任意地方加入子查询代码,放在"()"中
eg:查询出比7654工资要高的全部雇员的信息。
SELECT sal FROM emp WHERE empno=7654 ;
SELECT * FROM emp;
FROM sal>(SELECT sal FROM emp WHERE emp=7654) ;
子查询在操作中有分为以下三类:
eg:查询出工资比7654高,同时与7788从事相同工作的全部雇员信息。
SELECT sal FROM emp WHERE emp=7654;
SELECT job FROM emp WHERE empno=7788;
SELECT * FROM emp
WHERE sal>(SELECT sal FROM emp WHERE empno=7654)
AND job=(SELECT job FROM emp WHERE empno=7788) ;
eg:要求查处工资最低的雇员的姓名、工作、工资
SELECT MIN(sal) FROM emp;
SELECT * FROM emp
WHERE sal=(SELECT MIN(sal) FROM emp) ;
思考:
要求查询出部门的部门名称、部门的员工数、部门的平均工资,
部门的最低收入雇员的姓名和最高收入、雇员的姓名。
SELECT deptno,COUNT(empno),AVG(sal)
FROM emp
GROUP BY deptno;
SELECT d.dname,ed.c,ed.a
FROM dept d,
WHERE d.deptno=ed.deptno ;
SELECT d.dname,ed.c,ed.a,e.ename
FROM dept d,(
WHERE d.deptno = ed.deptno AND e.sal=ed.min;
如果,在一个部门中同时存在两个工资最低的雇员,则程序就会出现错误。
在子查询中,存在三种查询操作符号:
IN 指定一个查询范围
ANY
ALL
IN 指定一个查询范围
eg:求出每个部门的最低工资的雇员信息
WHERE * FROM emp
WHERE sal IN(select MIN(sal) FROM emp GROUP BY deptno) ;
ANY操作:
SELECT * FROM emp
WHERE sal>ANY(SELECT MIN(sal) FROM emp GROUP BY deptno) ;
SELECT * FROM emp
WHERE sal
SELECT * FROM emp
WHERE sal>ALL(SELECT MIN(sal) FROM emp GROUP BY deptno) ;
对于子查询来讲,还可以进行多列子查询,一个子查询中同时返回多个查询的列。
SELECT * FROM dept
WHERE (sal.NVL(comm,-1)) IN (