天天看点

子查询

要求:查询出比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,如需转载请自行联系原作者

继续阅读