概览
当对一个复杂的子查询结果进行分组(group by
)聚合计算时,
有时需要进行多次聚合,如果不能复用自查寻的结果,查询效率会很低下
在有些情况下,可以使用 IF
函数进行不同条件的聚合
示例
假设子查询的结果有班级,学号,平均分这3个字段(class, no, score
)
现在想求每个班级的总人数和及格人数
复用前
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
两次
复用后
select S.class, count(1), sum(IF(S.score >= 60, 1, 0))
from
(SUB_QUERY) S
group by S.class
可以看出,子查询只有一次,而且 SQL 更简洁
结论
使用 IF
函数复用只适用于特定情况,别的希望子查询复用,可以使用临时表
文章转载自进击的代码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




