要求:查询出比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操作符
WHERE sal<ALL(SELECT avg(sal) FROM emp GROUP BY deptno) ;
• >ALL:表示比最大值要大
• <ALL:表示比最小值要小
本文转自 李兴华 51CTO博客,原文链接:http://blog.51cto.com/lixinghua/91212,如需转载请自行联系原作者