暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

进击的代码 2021-05-31
1701

概览

当对一个复杂的子查询结果进行分组(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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论