在日常业务中,因为需要对企业数据库中的数据进行多次处理,此时我们可以将单次完整查询所返回的虚拟结果集视为一个临时表,并对这个临时表进行再次的查询和处理,这就是子查询的作用。
子查询又称为嵌套查询,指在一个查询语句中包含另一个或多个完整的查询语句。
1.子查询的语法规则
(1)子查询必须用圆括号括起来
(2)子查询最多可以嵌套到255层(个别查询可能会不支持255层的嵌套)
(3)执行顺序由内而外,先执行内部的子查询,再执行外部的主查询
(4)若子查询返回的结果集在主查询中作为一个表,则必须添加添加表别名;若需要引用表子查询的计算自动字段,则必须添加列别名才可以引用。
2.子查询分类
按照子查询返回的结果不同,子查询可分为标量子查询(返回的结果是一个单行单列的数据)、行子查询(返回的结果是一条友多个字段的记录)、列子查询(返回的结果是包含多条记录的单个字段)及表子查询(返回的结果是一个拥有多个字段和多条记录的临时表)。
子查询根据需求的不同,可以搭配不同字句使用,如果需要将子查询返回的结果作为主查询的计算字段,那么可以将子查询将子查询放在select字句中;如果需要将子查询返回的结果作为主查询的筛选条件,那么可以将子查询放在where或having子句中;如果需要将子查询返回的结果作为主查询的一个表,那么可以将子查询放在from或join子句中。
3.select子查询
select子查询仅支持标量子查询和列子查询,常用于业务指标的计算。
在数据库中,针对整体的计算和针对各个不同类别的计算,其计算维度不同,无法在单个查询中执行,此时可以使用select子查询来对二者分别进行计算。
如:
--查询各部门员工人数占比
-- 查询整体员工数量
select deptno,count(*) 员工人数, count(*)/(select count(*) from emp 员工人数占比
from emp group by deptno;