首页 > 解决方案 > 使用 SUM 进行 SQL 查询优化(case when)

问题描述

我有一个有两列的表:姓名和钱,“钱”有正值和负值。我编写了一个 sql 查询来获取提取和存入的总金额的总和。我想知道是否有任何方法可以使此查询更高效并更快地工作。

select name,
       SUM(case when money > 0 then money else 0 end) as deposit,
       ABS(SUM(case when money < 0 then money else 0 end)) as withdraw
from transfer
group by name
order by name ;

标签: sql

解决方案


大多数数据库引擎会为此查询使用覆盖索引。那将是(name, money).

结果查询计划本质上是对索引的扫描。这处理了group by因为所有具有相同的行name都是相邻的。该money列已经在索引中,因此不需要在数据页上查找。

也就是说,并非所有数据库都实现了这种优化。即使那些不使用的可能仍然使用覆盖索引,这将减少查询的 I/O。


推荐阅读