子查询分为两类:标准子查询和相关子查询。

一、标准子查询:子查询先于主查询独立执行,返回明确结果供主查询使用。

  子查询只执行一次,不依赖于主查询。

例如:

  其中子查询能够返回结果:2450。所以断定其为标准子查询。

1、单行子查询(子查询返回的结果是单行单列)

  WHERE子句中使用单行子查询时,可以使用单行比较运算符(=,>,>=,<,<=,<>),将子查询的返回结果当做单一数值来使用。

  需要小心的是子查询返回的结果的不确定定,即返回空值或多值。具体分为三种情况:

(1)返回单行:即为单行子查询。

(2)未返回任何行:如果子查询未返回任何行(相当于返回NULL),则主查询将不再执行,所以主查询也不会返回任何结果。

(3)返回多行:是多行子查询,此时不允许使用单行比较运算符,否则出错。

2、多行子查询(子查询返回多行单列)

  在WHERE子句中使用多行子查询时,可以使用多行比较运算符(IN,ALL,ANY),将子查询的返回结果当做数值集合来使用。其中,ALL和ANY运算符必须与单行比较运算符(=,>,>=,<,<=,<>)结合使用。例如WHERE sal>ALL(子查询)。

  IN:等于任何一个

  ALL:和子查询返回的所有值比较。例如:sal>ALL(1,2,3)等价于sal>3,即大于所有。

  ANY:和子查询返回的任意一个值比较。例如:sal>ANY(1,2,3)等价于sal>1,即大于任意一个就可以。

  EXISTS:判断子查询是否有返回结果(不关心具体行数和内容),如果返回则为TRUE,否则为FALSE。(常用于相关子查询)

3、多列子查询(子查询返回多列,可以是单行、多行或者不返回任何结果)

  在WHERE子句中使用多列子查询时,

a.如果返回结果是单行多列,则可以使用单行比较运算符;例如

b.如果返回结果是多行多列,则只能使用多行比较运算符(IN,ALL,ANY);例如:

c.如果未返回结果,则主查询也不返回结果。

二、相关子查询:子查询不能提前运行以得到明确结果。

  子查询执行过程中需要用到主查询的相关结果,即子查询在主查询返回的结果集上执行(针对主查询的每一行结果,子查询都要执行一次)。子查询和主查询在执行过程中相互依赖。

例1:SELECT字段列表中使用子查询

  其中,只看子查询,发现emp.deptno=dept.deptno中的emp并不存在与子查询的FROM语句中,而是存在于外层的主查询中,所以断定其为相关子查询。

等价于:

  可见,等价后的WHERE中增加了一个条件。

例2:WHERE子句中使用子查询

等价于:

  可见,等价后的WHERE子句中增加了一个条件。

例3:WHERE子句中使用EXISTS(子查询)

等价于:

  注意这里使用DISTINCT的原因。第一个查询是从dept中查出的,所有不会重复,但第二个查询是连接查询,会有重复的内容(emp表中的不同员工可能属于同一部门,即一个部门可能有超过一名员工),所以要用DISTINCT去重。

ORACLE复杂查询之子查询的更多相关文章

  1. .Net程序员学用Oracle系列(14):子查询、集合查询

    1.子查询 1.1.子查询简介 1.2.WITH 子查询 2.集合查询 2.1.UNION 和 UNION ALL 2.2.MINUS 2.3.INTERSECT 2.4.集合运算与 ORDER BY ...

  2. oracle多表关联查询和子查询

    oracle多表关联查询和子查询 一.多表关联查询 例子: SQL> create table student1 ( sid ), sname ), sage )); Table created ...

  3. Oracle 自连接 / 外连接 / 子查询

    --连接查询的三种格式 select ename, deptno,dname from emp natural join dept; select ename, deptno,dname from e ...

  4. oracle 之 统计函数、子查询、操作符

    统计函数 COUNT():查询表中的数据记录 AVG():求出平均值 SUM():求和 MAX():求出最大值 MIN():Q求出最小值 子查询   [单行多列] select * from a wh ...

  5. Oracle学习(六):子查询

    1.知识点:能够对比以下的录屏进行阅读 SQL> --子查询所要解决的问题:问题不能一步求解 SQL> --查询工资比SCOTT高的员工信息 SQL> --(1)使用普通方法 SQL ...

  6. Oracle系列八 高级子查询

    子查询 子查询 (内查询) 在主查询执行之前执行 主查询(外查询)使用子查询的结果 多列子查询 主查询与子查询返回的多个列进行比较 多列子查询中的比较分为两种: 成对比较 问题:查询与141号或174 ...

  7. Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)

    Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...

  8. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  9. SQL编程之高级查询(子查询)以及注意事项

    SQL编程之高级查询(子查询)以及注意事项   1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命 ...

随机推荐

  1. 【HANA系列】SAP HANA计算视图中的RANK使用方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA计算视图中的RA ...

  2. 关于Qt中的QMutex——关于lock与unlock

    大概说一下用法,例子: QMutex mutex; int number = 6; void method1() { mutex.lock(); number *= 5; number /= 4; m ...

  3. flask response 详解

    from flask import Flask,Response,jsonify #Flask = werkzeug(处理网络的) + sqlalchemy(处理数据库的) + jinja2 (处理模 ...

  4. python 并发编程 协程 目录

    python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 python 并发编程 协程 gevent模块 python 并发编程 基于gevent模块实现并发的套接字 ...

  5. 红帽学习笔记[RHCSA] 第二周

    目录 红帽学习笔记[RHCSA]第二周 环境 第七课[网络配置相关] 在Vmware中添加网卡 将网卡添加到虚拟机上 关于网卡命名规则 配置网络 网络配置命令总结 更改hostname 关于SSH的一 ...

  6. olap和Oltp(转)

    OLAP和OLTP的区别(基础知识) 联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的,他同时提出了关于OLAP的12条准则.OLAP的提出引起了很大的反响, ...

  7. CodeForces-520E Pluses everywhere

    题目描述 给出一个长度为 \(n\) 的字符串,给出一个非负整数 \(k\),要求给这个字符串中间添加 \(k\) 个$\(+\)'号,变成一个表 达式,比如"\(1000101\)&quo ...

  8. 项目常用的几个mysql函数

    1.find_in_set函数 find_in_set(str,strlist); str是一个字符串 strlist是字符串列表--一个有多个子链被“,”分开的字符串 有多种情况: a.str为nu ...

  9. 在springboot中集成mybatis开发

    在springboot中利用mybatis框架进行开发需要集成mybatis才能进行开发,那么如何在springboot中集成mybatis呢?按照以下几个步骤就可以实现springboot集成myb ...

  10. 将本地的java项目提交到github出错解决

    1.我们新建一个了java项目后,需要提交到github进行版本控制 2.如果此时github中的仓库不为空,我们在本地使用git push提交时会报以下错误, ! [rejected]       ...