单行和多行子查询 单行子查询只返回一行记录。其中的一个特例是标量子查询,它返回只有一个字段的一行记录。实事上标量子查询可用于任意形式的查询中(并且往往是非常有用的),可以是常量值、常量或者表达式。多行子查询返回多行记录集。
这些查询产生的结果集通常将传递给DML或SELECT语句进行进一步的处理。但单行子查询和多行子查询都会在父查询执行前进行一次值比较。单行和多行子查询可以用在父查询的WHERE和HAVING子句中,但对于合法的比较操作符有一些限制。如果比较操作符是下表中的任意一个,子查询就必须有一个单行子查询: Symbol Meaning = equal > great……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
单行和多行子查询
单行子查询只返回一行记录。其中的一个特例是标量子查询,它返回只有一个字段的一行记录。实事上标量子查询可用于任意形式的查询中(并且往往是非常有用的),可以是常量值、常量或者表达式。多行子查询返回多行记录集。这些查询产生的结果集通常将传递给DML或SELECT语句进行进一步的处理。但单行子查询和多行子查询都会在父查询执行前进行一次值比较。单行和多行子查询可以用在父查询的WHERE和HAVING子句中,但对于合法的比较操作符有一些限制。如果比较操作符是下表中的任意一个,子查询就必须有一个单行子查询:
Symbol | Meaning |
= | equal |
> | greater than |
>= | greater than or equal |
< | less than |
<= | less than or equal |
<> | not equal |
!= | not equal |
如果子查询使用上表中的任意一个操作符而又返回多行结果记录,该查询会出错。下表中的操作符则可用于多行子查询:
Symbol | Meaning |
IN | equal to any member in a list |
NOT IN | not equal to any member in a list |
ANY | returns rows that match any value on a list |
ALL | returns rows that match all the values in a list |
关联子查询
关联子查询是一个比单行和多行子查询更复杂的执行方法,它的功能也更加强大。如果一个子查询引用了父查询的字段,这样它的结果也将依赖于父查询结果。这样就不可能在父查询值比较前进行子查询值比较。考虑下面这个语句,它列出所有薪水在平均薪水值以下的员工:
select last_name from employees where salary < (select avg(salary) from employees); |
单行子查询只需要执行一次,而且其结果会代入父查询中。但是,目前要解决的是的语句是列出所有部门中薪水在平均薪水值以下的员工。因此,子查询必须对每个员工进行探究以便确定部门中的平均薪水值, 这样,员工部门的代码就必须传到子查询中。可以操作如下:
select p.last_name, p.department_id from employees p where p.salary < (select avg(s.salary) from employees s where s.department_id=p.department_id); |
在这个例子中,子查询引用了一个字段:p.department_id,它是定义在父查询的select列表中的。这表示,不是只对子查询进行一次值比较,而是对父查询中的每一行记录在子查询中进行比较。在执行这个查询时,Oracle将会检查EMPLOYEES表中的每一行记录,并使用当前员工记录行的DEPARTMENT_ID来执行子查询。
该查询的执行顺序是这样的:
1. 从EMPLOYEES表的第一行记录开始查询。
2. 读取当前记录行的DEPARTMENT_ID和SALARY字段值。
3. 对第2步得到的DEPARTMENT_ID执行子查询。
4. 比较第3步子查询结果与第2步得到的SALARY值,如果SALARY小于子查询结果,则返回该行记录。
5. 继续查询EMPLOYEES表的下一行记录。
6. 重复第2步。
单行或多行子查询都会在外查询值比较前进行一次值比较;而关联子查询则必须在外查询的每一行记录上进行一次值比较。如果使用合适的操作符,一个关联子查询可能是单行或者多行的。
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
在SQL中使用SELECT进行算术运算
如何在不使用SQL算术运算符而仅仅使用SELECT的情况下完成数学运算,Oracle数据库专家给出了解答。
-
分析并行SQL中的各个元素
并行度(DOP)定义了将被创建的执行并行流的数量。最简单的情况,它可以理解为分配为支持你SQL执行的并行伺服进程的数量。
-
在Oracle里提高SQL执行效率的三种方法
Oracle提供了多种方法用于减少花在剖析Oracle SQL表达式上的时间,在执行带有大量执行计划的复杂查询时剖析过程会拖累系统的性能。
-
使用Oracle SQL Developer和其他开发工具
本技术专题主要为使用Oracle SQL Developer和其他开发工具。包括如何使用Oracle SQL Developer和其他开发工具、使用Oracle Database Home Page、在Oracle中使用SQL*Plus等方面。