Mysql中的count()与sum()区别

本文介绍了SQL中count()与sum()函数的区别及应用场景。count()用于统计指定列的有效记录数量或总行数,而sum()则针对指定列进行数值求和。通过实例说明了两种函数的不同之处,并强调了在实际编程中正确选择函数的重要性。

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

sum函数的意义
count()函数里面的参数是列名的的时候,那么会计算有值项的次数。
Sum()函数里面的参数是列名的时候,是计算列名的值的相加,而不是有值项的总数。
对count()行数还要注意:它会计算总行数。不管你是否有值都会列入计算范围。另外一点:mysqlisam引擎很容易获得总行数的统计。查询速度变得更快
归纳:实际编程中统计总行数是经常用到的。此时使用count(*)多处可见。我很少看到有人使用列名作为参数:count(a)的情况。即使是这样使用,可能其初衷也是想统计行数。只是不知道!这样所造成的细微差异而错误使用了"列名"的形式

<think>我们正在讨论MySQLCOUNTSUM函数的区别。根据引用内容,我们可以总结如下:1.COUNT函数用于计算记录的数量(行数),返回整数值。它统计满足条件的记录数。-例如:`COUNT(*)`统计所有行数,`COUNT(column)`统计指定列非NULL值的行数。2.SUM函数用于计算数值列的总,返回该列数据类型的总值。-例如:`SUM(amount)`计算amount列所有值的总。此外,引用中还提到了一些注意事项:-在GROUPBY聚合操作中,如果使用了ONLY_FULL_GROUP_BY模式(MySQL5.7默认启用),那么SELECT中的列必须出现在GROUPBY子句中或包含在聚合函数中(如COUNTSUM)。-在DOS(可能是旧版本MySQL命令行)下,某些查询可能报错,但在MySQL中能运行(由于兼容性问题)。另外,引用[5]给出了一个示例,展示了在分组统计中同时使用SUM条件表达式:```sqlselectname,sum(score<60),avg(score)fromresultgroupbynamehavingsum(score<60)>=2;```这个查询统计每个名字下不及格(<60)的次数(用sum(条件)实现)以及平均分,并筛选出不及格次数>=2的记录。现在,我们可以将COUNTSUM区别总结如下:|特性|COUNT|SUM||--------------|--------------------------------|-------------------------||**功能**|统计记录数(行数)|计算数值列的总||**返回值**|整数|数值列的数据类型||**参数**|可以是*、列名或表达式|必须是数值列或表达式||**对NULL处理**|COUNT(*)计数所有行;COUNT(列)忽略NULL|SUM忽略NULL值(视为0)||**典型用法**|统计行数|计算总|另外,两者都可以结合条件表达式使用:-COUNT(CASEWHENconditionTHEN1ELSENULLEND)或COUNT(IF(condition,1,NULL))-SUM(condition)因为条件表达式返回0或1(真为1,假为0)但是注意,COUNT在条件表达式中统计的是非NULL值的数量,而SUM统计的是条件为真的次数(因为条件为真返回1,为假返回0,求就是满足条件的行数)。示例1:统计学生总数```sqlSELECTCOUNT(*)AStotal_studentsFROMstudents;```示例2:统计数学成绩总```sqlSELECTSUM(math_score)AStotal_math_scoreFROMstudents;```示例3:统计数学成绩及格(>=60)的人数(两种方法)```sql--方法1:COUNTSELECTCOUNT(CASEWHENmath_score>=60THEN1END)ASpass_countFROMstudents;--方法2:SUMSELECTSUM(math_score>=60)ASpass_countFROMstudents;```注意:在GROUPBY分组中,我们经常同时使用多个聚合函数,比如按班级分组统计每个班级的学生人数总成绩:```sqlSELECTclass_id,COUNT(*)ASnum_students,SUM(math_score)AStotal_mathFROMstudentsGROUPBYclass_id;```最后,关于引用中提到的ONLY_FULL_GROUP_BY模式,如果启用,那么在非聚合列没有出现在GROUPBY子句中的情况下会报错。例如:```sql--假设name没有出现在GROUPBY中,且不是聚合列,则报错SELECTname,COUNT(*)FROMstudents;```正确的写法应该是:```sqlSELECTname,COUNT(*)FROMstudentsGROUPBYname;```或者,如果不想分组,则应该使用聚合函数或移除非聚合列。总结:COUNT用于计数,SUM用于求,两者都是聚合函数,但处理的数据结果不同。</think>### MySQLCOUNT SUM 函数的区别解析 COUNT SUMMySQL 中最常用的聚合函数,它们的核心区别在于**计算目标不同**: | **特性** | **COUNT 函数** | **SUM 函数** | |----------------|-----------------------------------|---------------------------------| | **核心功能** | **统计行数**(记录数量) | **计算数值总**(列值累加) | | **返回值类型** | 整数(记录数量) | 数值型(计算列类型一致) | | **参数处理** | 接受任意表达式(含非数值) | 只接受数值型表达式 | | **NULL 处理** | `COUNT(*)` 计 NULL 行;`COUNT(列)` 忽略 NULL | 自动忽略 NULL 值(视为 0) | | **典型场景** | 统计记录数量 | 计算数值列的总 | #### 🔢 功能本质区别 1. **COUNT - 计数统计** ```sql -- 统计总行数(含NULL行) SELECT COUNT(*) FROM orders; -- 统计非NULL的行数 SELECT COUNT(user_id) FROM users; ``` 2. **SUM - 数值求** ```sql -- 计算销售总额(自动忽略NULL) SELECT SUM(amount) FROM sales; -- 计算加权总分 SELECT SUM(score * weight) FROM exams; ``` #### ⚠️ 特殊用法对比 1. **条件统计实现差异** ```sql /* 统计VIP用户数量 - COUNT方案 */ SELECT COUNT(CASE WHEN is_vip=1 THEN 1 END) FROM users; /* 统计VIP用户数量 - SUM方案 */ SELECT SUM(is_vip) FROM users; -- is_vip需为数值型 ``` 2. **GROUP BY 中的行为差异** ```sql -- 按部门统计员工人数工资总额 SELECT department_id, COUNT(*) AS employee_count, -- 统计人数 SUM(salary) AS total_salary -- 计算工资总 FROM employees GROUP BY department_id; ``` *在严格模式(ONLY_FULL_GROUP_BY)下,非聚合列必须包含在 GROUP BY 中[^2][^4]* #### 💡 实用场景示例 **场景 1:统计订单状态分布** ```sql SELECT COUNT(*) AS total_orders, SUM(status = 'completed') AS completed, -- 布尔表达式返回1/0 SUM(status = 'pending') AS pending FROM orders; ``` **场景 2:计算学生平均分** ```sql SELECT COUNT(*) AS student_count, -- 总人数 SUM(score) AS total_score, -- 总分 SUM(score)/COUNT(*) AS avg_score -- 平均分 FROM exam_results; ``` #### ❗ 关键注意事项 1. **NULL 处理陷阱** ```sql -- 错误:SUM可能忽略NULL导致分母错误 SELECT SUM(score)/COUNT(score) FROM students; -- 正确:COUNT(*)确保分母包含所有行 SELECT SUM(score)/COUNT(*) FROM students; ``` 2. **数据类型限制** - SUM 无法处理非数值列:`SUM(username)` 会报错 - COUNT 可处理任意类型:`COUNT(username)` 统计非NULL用户名数量 3. **性能优化** - 大数据表优先使用近似统计: ```sql SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES -- 元数据速统计[^3] WHERE TABLE_NAME='large_table'; ``` > 📌 **最佳实践**: > 需要**计数**时用 COUNT,需要**累加数值**时用 SUM。在条件统计中,`SUM(condition)` 比 `COUNT(CASE...)` 更简洁高效[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值