MySQL 使用变量实现部分分组聚合

实际应用中常有按select字段中的部分字段分组聚合的需求,如按字段a分组求和,查询a、b和聚合值并排序。Oracle可使用分析函数实现,MySQL有两种实现方式,从执行计划看,使用变量的写法性能更好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在实际应用中经常有这种需求,按照 select 的字段中的部分字段分组聚合,比如下面的例子:

create table t1 (a varchar(20),b varchar(20),c int);
insert into t1 values('a','123',1);
insert into t1 values('b','456',2);
insert into t1 values('a','789',3);
insert into t1 values('b','123',4);
commit;

        要求按字段 a 分组求和,查询 a、b 和聚合值,并按 a、b 排序。在 Oracle 里可以使用分析函数,写法如下:

select a,b,sum(c) over (partition by a) sum_c from t1 order by a,b;

        查询结果和执行计划如图1 所示:

图1

        在 MySQL 中可以用两种方式实现:

-- 写法一,使用内连接,两次扫表
select t1.a, t1.b, t2.sum_c
  from t1,
       (select a, sum(c) sum_c
          from t1
         group by a) t2
 where t1.a = t2.a
 order by t1.a , t1.b;

        查询结果和执行计划如图2 所示:

图2

-- 写法二,使用变量,内层与外层相反排序
select a, b, if(@a = a1, @c:=@c, @c:=sum_c) sum_c, @a:=a1
  from (select a, b, if(@a = a, @c:=@c + c, @c:=c) sum_c, @a:=a a1
        from t1, 
		     (select @a:='', @c:=0) t2
       order by a, b desc) t
 order by a , b;

        查询结果和执行计划如图3 所示:

图3

        从执行计划看,使用变量的写法性能更好一些。

        参考:mysql实现oracle分析函数功能 over
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值