子查询
子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从mysql14.1开始引入。
sql中子查询的使用大大增强了select查询的能力,因为很多时候需要从结果中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是标量,可能是某个集合)进行比较。
解决方式一:
解决方式二:
解决方式三:
关于子查询:
子查询的分类
相关子查询与不相关子查询
通俗理解就是相关子查询:内查询一般和外查询存在”的“的关系,不相关就不存在。
单行子查询
单行子查询就是内查询返回一条结果记录
单行比较操作符
HAVING中的子查询
1.首先执行子查询
2.向主查询中的HAVING子句返回结果
CASE中的子查询
例题及用法:
子查询的空值问题以及非法使用
1.空值问题
也就是说,如果子查询的结果在表中无数据(即子查询不返回任何行),那么,即使不会报错,也不会出现任何值(包括null)。
该公司中无Hass这个人,所以查询不到数据。
2.非法使用
即使使用单行比较操作符的时候,子查询返回的数据不止一条,就会报错等等。
错误:Subquery return more than 1 row。
多行子查询
多行子查询也称为集合比较子查询,内查询返回多行,使用多行比较操作符。
多行比较操作符
其中ANY和ALL的区别要注意。
含义上的区别
通俗说,就是假设五个美女追你,ANY就是你随便挑一个,ALL就是你全都要。
代码上的区别:
ANY(任一)
ALL(任意)
将查询出来的多个结果当作一张表
给处理某些复杂的情况提供了思路,可以嵌套函数
空值问题
若内查询中有空值,需要考虑是否要去除这个空值,否则可能会得不到数据。
相关子查询
结论:在select中,除了group by 和limit之外,都可以写子查询
exists与not exists关键字
相关更新与删除
1.相关更新
2.相关删除