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

在编写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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值