ITPub博客

首页 > 数据库 > Oracle > oracle学习笔记17-子查询

oracle学习笔记17-子查询

Oracle 作者:1160159582 时间:2014-01-14 23:09:37 0 删除 编辑
有时候我们查询一个结果必须基于另外一个查询的结果,这时候就要用到子查询

子查询又分为以下两类:
  • 非相关子查询:非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查
  • 相关子查询:相关子查询的执行依赖于外部查询的数据,外部查询执行一次,子查询就执行一次
使用子查询要注意以下几个方面
  • 子查询放在括号内
  • 子查询放在比较条件的右边
  • 在单行子查询中庸单行运算符,在多行子查询中用多行运算符
非相关子查询
如我们查询大于smith薪资列表的员工信息,可以这样写代码
SELECT * FROM emp
WHERE sal>(SELECT sal FROM emp WHERE ename='SMITH' );

--查询与smith相关职位人员的列表
SELECT * FROM emp
WHERE job=(SELECT job FROM emp WHERE ename='SMITH' );

--查询最低工资的人员信息
SELECT * FROM emp
WHERE sal=(SELECT MIN(sal) FROM emp);

如果子查询返回多行,我们就不能用大于、等于这些运算符,而是需要使用多行运算符
  • IN:等于列表中的任何成员
  • ANY:比较子查询返回的每个值
  • ALL:比较子查询返回的全部值

--查询收入为各部门中最低的员工列表
SELECT * FROM emp
WHERE sal IN (SELECT min(sal) FROM emp GROUP BY deptno);

--查询非职员(CLERK)的人员中比所有职员薪资高的人员列表
SELECT * FROM emp
WHERE sal > ANY (SELECT sal FROM emp WHERE job='CLERK') AND job<>'CLERK';


  • >ANY:大于最小值
  • =AN:同IN
  • >ALL:大于最大值
大家可以好好体会一下,区别

--查询非职员(CLERK)中比职员薪资最高的人还高的人员列表
SELECT FROM emp
WHERE sal > ALL ( SELECT sal FROM emp WHERE job= 'CLERK'AND job<>'CLERK' ;


相关子查询

--相关子查询
--查询表中薪资超过该员工所在部门平均薪资的人员信息
SELECT * FROM emp t1
WHERE t1.sal>(SELECT AVG(sal) FROM emp t2 WHERE t1.deptno=t2.deptno)
ORDER BY t1.deptno;

其中子查询需要的deptno需要每次从外查询中取得
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26935791/viewspace-1117493/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2012-05-02