要求:查询出比7566雇员工资高的全部雇员信息
 • 必须先知道 7566雇员的工资
  SELECT sal FROM emp WHERE empno=7566 ;
 • 之后按照此工资进行条件的过滤
  SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE empno=7566) ;
 在一个查询之中还有另外一个查询。
 
 
之前的子查询返回的只是一个值,所以称为单列子查询。
要求:
 显示工资最低的雇员的信息
 • 最低的工资是多少
 • 根据最低工资求出的内容,进行WHERE的条件过滤
  |- SELECT * FROM emp WHERE sal=(SELECT min(sal) FROM emp) ;
要求:
 显示和雇员7369从事相同工作并且工资大于雇员7876的雇员的姓名和工作
SELECT * FROM emp
WHERE
 job=(SELECT job FROM emp WHERE empno=7369) AND
 sal>(SELECT sal FROM emp WHERE empno=7876) ;
要求:
显示部门内最低工资比20部门最低工资要高的部门的编号及部门内最低工资:
SELECT deptno,MIN(sal) FROM emp GROUP BY deptno HAVING MIN(sal)>(SELECT MIN(sal) FROM emp WHERE deptno=20) ;
进一步要求:
 要求可以再列出部门的名字。子查询,而且子查询要在from中产生一个临时的数据
 部门名称在部门表(dept)中,所以此处只能把dept表加进来。
SELECT d1.deptno,d1.dname,d2.m
FROM dept d1,(SELECT deptno,MIN(sal) m FROM emp GROUP BY deptno HAVING MIN(sal)>(SELECT MIN(sal) FROM emp WHERE deptno=20)) d2
WHERE d1.deptno=d2.deptno ;
要求:
 查询平均工资最低的工种的名称及其平均工资:
 SELECT job,min(sal) FROM emp GROUP BY job HAVING avg(sal)=(SELECT min(AVG(sal)) FROM emp GROUP BY job) ;
多行子查询,实际上就是一次查询会返回多行记录
IN操作符
例如:
 要求:查询出所有部门中工资最低的雇员的信息
 SELECT * FROM emp WHERE sal IN(SELECT min(sal) FROM emp GROUP BY deptno) ;
 在以上的查询结果上要求再查询出部门的名称
 再加入一个dept表
 SELECT e.empno,e.ename,d.dname,e.sal FROM emp e,dept d
WHERE sal IN(SELECT min(sal) FROM emp GROUP BY deptno) AND e.deptno=d.deptno ;
ANY操作符:
SELECT empno,ename,job,sal
 FROM emp
 WHERE sal>ANY(SELECT sal FROM emp WHERE job='CLERK')
 AND job <> 'CLERK' ;
• <ANY:比最小的值小
• >ANY:比最小值大
• =ANY:与IN相同
ALL操作符
SELECT empno,ename,job,sal
 FROM emp
 WHERE sal<ALL(SELECT avg(sal) FROM emp GROUP BY deptno) ;
• >ALL:表示比最大值要大
• <ALL:表示比最小值要小