Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
子查询
前面我们学过了利用 group by子句可以实现分组的操作,主要的统计函数有:COUNT()、AVG()、SUM()、MAX()、MIN()
并且介绍了分组统计查询的若干限制以及在使用过程中应该注意的问题
如果不使用 group by 子句分组,则 select子句之中只能够出现统计函数
如果使用了 group by 子句,则 select子句里面可以使用分组字段或者统计函数
统计函数允许嵌套,嵌套之后的 select子句里面不允许出现其他任何字段,包括分组字段
group by 子句是在 where子句之后运行的,所以 where子句无法使用统计函数
对分组后的数据进行过滤,则可以使用 hving子句
在整个 SQL 查询语句中,子查询并不是特殊的语法,也就是说在整个 SQL 查询操作里
select、from、where、group by、hving、order by 中都可以出现子查询
如果非要给出子查询的语法,那么只能够进行拼凑,下面给出了子查询的大致语法
select [distinct] * | 字段 [ 别名 ] | 统计函数 ,( select [distinct] * | 字段 [ 别名 ] | 统计函数 from 表 [ 别名 ], 表 [ 别名 ],.... [where 条件 (s)] [group by 分组字段 , 分组字段 ,..] [having 分组过滤 ] [order by 排序 [asc | desc], 排序 [asc | desc],...])
from 表 [ 别名 ], 表 [ 别名 ],....,( select [distinct] * | 字段 [ 别名 ] | 统计函数 from 表 [ 别名 ], 表 [ 别名 ],.... [where 条件 (s)][group by 分组字段 , 分组字段 ,..] [having 分组过滤 ] [order by 排序 [asc | desc], 排序 [asc | desc],...])
[where 条件 (s),( select [distinct] * | 字段 [ 别名 ] | 统计函数 from 表 [ 别名 ], 表 [ 别名 ],.... [where 条件 (s)] [group by 分组字段 , 分组字段 ,..] [having 分组过滤 ] [order by 排序 [asc | desc], 排序 [asc | desc],...])]
[group by 分组字段 , 分组字段 ,...]
[having 分组过滤 ,( select [distinct] * | 字段 [ 别名 ] | 统计函数 from 表 [ 别名 ], 表 [ 别名 ],.... [where 条件 (s)] [group by 分组字段 , 分组字段 ,..] [having 分组过滤 ] [order by 排序 [asc | desc], 排序 [asc | desc],...])]
[order by 排序 [asc | desc], 排序 [asc | desc],...]
所有可能出现的子查询都需要使用“()”声明
所谓的子查询,实质上属于查询嵌套,而且从理论上来说,查询子句的任意位置上都可以随意出现子查询
但是出现子查询较多的位置是 where、from。
所以现在对子查询给出了参考使用方案
where子句:子查询返回单行单列、单行多列、多行单列
having子句:子查询返回单行单列,而且要使用统计函数过滤
from子句:子查询返回的是多行多列
select子句:一般返回单行单列,需要在某些查询的时候使用