概览

当对一个复杂的子查询结果进行分组(group by)聚合计算时,

有时需要进行多次聚合,如果不能复用自查寻的结果,查询效率会很低下

在有些情况下,可以使用 IF 函数进行不同条件的聚合

示例

假设子查询的结果有班级,学号,平均分这3个字段(class, no, score

现在想求每个班级的总人数和及格人数

复用前

1
2
3
4
5
6
select A.class A.sum, B.sum
from
(select class, count(1) as sum from (SUB_QUERY) S group by class) A
left join
(select class, count(1) as sum from (SUB_QUERY) S where S.score >= 60 group by class) B
on A.class = B.class

可以看出,需要查询 SUB_QUERY 两次

复用后

1
2
3
4
select S.class, count(1), sum(IF(S.score >= 60, 1, 0))
from
(SUB_QUERY) S
group by S.class

可以看出,子查询只有一次,而且 SQL 更简洁

结论

使用 IF 函数复用只适用于特定情况,别的希望子查询复用,可以使用临时表