MySQL select 子查询复用,进行聚合计算

当对一个复杂的子查询结果进行分组(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 函数复用只适用于特定情况,别的希望子查询复用,可以使用临时表

相关文章
相关标签/搜索