子查询

要求:查询出比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:表示比最小值要小









本文转自 李兴华 51CTO博客,原文链接:http://blog.51cto.com/lixinghua/91212,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值