Oracle PL/SQL开发基础(第十弹:子查询)

来源:互联网 发布:java怎么判断奇数偶数 编辑:程序博客网 时间:2024/05/19 01:31

在编写SQL语句时,一些查询必须要基于另一个查询的结果才能完成数据的提取,这种查询的构造方式称为子查询。
比如,要获取emp表中比SMITH薪资高的人的列表,必须要构造两个查询,一个查询用来查询SMITH的薪资,另一个查询用来比较SMITH的薪资记录,获取比SMITH薪资高的人员列表:

SELECT *  FROM emp WHERE sal > (SELECT sal                FROM emp               WHERE ename = 'SMITH');

子查询又分为两类:
- 相关子查询:相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
- 非相关子查询:非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。

由于相关子查询在外部查询执行一次时,同时也要执行内部查询,因此非相关子查询的效率比相关子查询高。在使用子查询时,需要遵循如下的基本原则:
- 子查询放在圆括号中。
- 子查询放在比较条件的右边。
- 在单行子查询中用单行运算符,在多行子查询中用多行运算符。

非相关子查询

非相关子查询根据返回的结果又可以分为3类:

单行单列子查询

又称为标量子查询,通常与比较运算符比如=><!=<=>=联合使用。我们最上面举的SMITH薪资的例子就是单行单列子查询。

多行单列子查询

使用特定的关键字如IN,ANY和ALL来将外层查询的单个值与子查询的多行进行比较运算。如:

SELECT empno, ename, job, mgr, hiredate, sal, deptno  FROM emp WHERE sal IN (SELECT   MIN (sal)                   FROM emp               GROUP BY deptno);  SELECT empno, ename, job, mgr, hiredate, sal  FROM emp WHERE sal > ALL (SELECT sal                    FROM emp                   WHERE job = 'CLERK') AND job <> 'CLERK';

<ANY表示小于任意一个,即小于最大值。
>ANY表示大于任意一个,即大于最小值。
=ANY表示等于任意一个,即等同于IN。
<ALL表示小于所有值,即小于最小值。
>ALL表示大于所有值,即大于最大值。
ANY具有一个同义词SOME,具有与ANY一样的功能。

多列子查询

这种类型的子查询通常用来UPDATE语句中。

相关子查询

比如,想知道emp表中,薪资超过该员工所在部门的平均薪资的人员信息,则需要在内部查询中获取外部查询的部门编号,在子查询中计算部门平均值,再由外部查询进行比较,如:

SELECT   e1.empno, e1.ename, e1.deptno    FROM emp e1   WHERE e1.sal > (SELECT AVG (sal)                     FROM emp e2                    WHERE e2.deptno = e1.deptno)ORDER BY e1.deptno              
1 0