SQL SELECT查询如何使用SUM计算字段合计?

胖婷同学_1350

胖婷同学_1350

2026-08-11

547人浏览

原创

sum()返回null而非0,因空结果集、全null列或无匹配行;需用coalesce(sum(col), 0)确保数值,且非聚合字段必须出现在group by中。

sql select查询如何使用sum计算字段合计?

直接用 SUM() 就能算总和,但返回 NULL 而不是 0

这是最常踩的坑:查不到数据、整列是 NULL 或者过滤后没匹配行时,SUM() 一律返回 NULL,不是 0。前端直接取值或做加法会出错(比如 JavaScript 的 NULL + 100 是 NaN)。

  • 想确保结果是数字,必须显式处理:COALESCE(SUM(amount), 0) 或 MySQL 下用 IFNULL(SUM(amount), 0)
  • SUM() 自动跳过 NULL 值,不需要额外写 WHERE amount IS NOT NULL
  • 如果字段本身允许 NULL,且业务上“无记录”和“金额为 0”含义不同,就别盲目 COALESCE——否则会模糊语义

SUM() 必须配合 GROUP BY 才能混用其他字段

只要 SELECT 里有 SUM(),其他非聚合字段(比如 user_id、category)就必须出现在 GROUP BY 中,否则 MySQL 5.7+、PostgreSQL 等直接报错:Expression not in GROUP BY。

CAPTURELAB
CAPTURELAB

一款面向游戏玩家的AI游戏视频工具,可以自动识别和整理游戏精彩片段,帮助玩家更快制作游戏集锦视频。

下载
  • 正确写法:SELECT user_id, SUM(amount) FROM orders GROUP BY user_id
  • 错误写法:SELECT user_id, name, SUM(amount) FROM orders GROUP BY user_id(name 没聚合也没分组)
  • 如果真要带 name,得确认它和 user_id 是一一对应关系,否则应改用 MAX(name) 或 MIN(name),但语义需自洽

条件求和别写子查询,用 CASE WHEN 套 SUM()

想算“已支付订单金额总和”或“某类商品销量”,直接在 SUM() 里嵌套 CASE WHEN,而不是写相关子查询——后者在多行结果下性能极差。

  • 推荐:SUM(CASE WHEN status = 'paid' THEN amount END)(ELSE 省略即可,NULL 会被 SUM 忽略)
  • 避免:(SELECT SUM(amount) FROM orders o2 WHERE o2.order_id = o1.order_id AND o2.status = 'paid')(每行都触发一次子查询)
  • 注意:MySQL 8.0+、PostgreSQL、SQL Server 都支持这种写法;SQLite 也支持,但旧版本窗口函数受限

WHERE 和 HAVING 别搞混,时机完全不同

WHERE 在分组前筛行,HAVING 在 SUM() 算完之后筛组。写反了要么查不到数据,要么语法报错。

  • 先筛再聚合:WHERE product_type = 'electronics' 放在 GROUP BY 前
  • 筛聚合结果:HAVING SUM(amount) > 1000 必须放在 GROUP BY 后,且不能用别名(如 HAVING total > 1000 不通用)
  • WHERE SUM(amount) > 1000 是非法写法,数据库直接拒绝执行
实际用的时候,最容易被忽略的是 NULL 返回值和 GROUP BY 字段完整性——这两点一错,轻则结果不对,重则查询失败。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4363

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

911

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1129

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6281

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3103

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6260

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8501

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1150

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1012

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.8万人学习