子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者
需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集
合)进行比较。

1、需求分析与问题解决

1.1 子查询的基本使用

子查询的基本语法结构:
QQ截图20220205091612.png
子查询(内查询)在主查询之前一次执行完成。
子查询的结果被主查询(外查询)使用 。
注意事项
子查询要包含在括号内
将子查询放在比较条件的右侧
单行操作符对应单行子查询,多行操作符对应多行子查询

1.2 子查询的分类

分类方式1
我们按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 、 多行子查询 。
QQ截图20220205183547.png
分类方式2
我们按内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和 不相关(或非关联)子查询 。
子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条
件进行执行,那么这样的子查询叫做不相关子查询。
同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查
询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。

2、单行子查询

2.1 单行比较操作符

QQ截图20220205093325.png

2.2 HAVING 中的子查询

首先执行子查询。
向主查询中的HAVING 子句返回结果。

2.3 CASE中的子查询

2.4 子查询中的空值问题

子查询不返回任何行

2.5 非法使用子查询

多行子查询使用单行比较符

3、多行子查询

也称为集合比较子查询
内查询返回多行
使用多行比较操作符

3.1 多行比较操作符

QQ截图20220205100554.png

4、相关子查询

4.1 相关子查询执行流程

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件
关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 。
相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
QQ截图20220205183827.png
from型的子查询:子查询是作为from的一部分,子查询要用()引起来,并且要给这个子查询取别
名, 把它当成一张“临时的虚拟的表”来使用。
结论:在select中,除了group by 和 limit之外,其他位置都可以声明子查询

4.2 EXISTS 与 NOT EXISTS关键字

关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行。
如果在子查询中不存在满足条件的行:
条件返回 FALSE
继续在子查询中查找
如果在子查询中存在满足条件的行:
不在子查询中继续查找
条件返回 TRUE
NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE。

子查询的编写技巧:①从里往外写 ②从外往里写

第09章_子查询.pdf