MySQL中的 COUNT、SUM与 GROUP BY

本文详细介绍了SQL中GROUP BY语句的使用方法及常见应用场景,包括分组计数、找出重复记录以及求和计算等操作。通过具体示例阐述了如何利用GROUP BY进行数据汇总分析。

group by 用来对结果进行分组,分组之后便于统计,所以总会有count跟着出现

例如下表:


按照ID分组,统计每个ID重复了几次

SELECT yww_test.id,COUNT(id) as n
FROM yww_test
GROUP BY yww_test.id


把重复的记录找出来可以像下面这样

SELECT id,COUNT(*) AS n
FROM yww_test
GROUP BY yww_test.id
HAVING COUNT(*)>1;

其中count(*)是统计每一组有多少行

同样的,分组之后通常需要求和计算也是可以的

例如下表:


现在要统计每种书总共花了多少钱

SELECT a.infor,SUM(a.price)
FROM news_inf as a
GROUP BY a.infor


可以看到两本java书一共花了7元


注意:

count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入).
distinct 列名,得到的结果将是除去值为null和重复数据后的结果

参考:http://www.111cn.net/database/mysql/53202.htm

更多group by请参考:http://blog.youkuaiyun.com/xxpyeippx/article/details/8059910



<think>我们正在讨论MySQL中的COUNTSUM函数。根据引用[1],COUNT用于统计行数,SUM用于计算数值列的总和。引用[2]和[3]则提到了GROUP BY的问题,但用户的问题核心是COUNTSUM的区别。因此,我们将重点放在这两个函数的区别上。 首先,COUNT函数用于计算行数。它可以用来统计满足条件的记录数量,或者整个表的记录总数。它返回一个整数。COUNT(*)统计所有行,包括NULL值;COUNT(column_name)统计指定列中非NULL值的行数。 SUM函数用于计算数值列的总和。它只对数值型列有效,忽略NULL值。如果所有行都是NULL,则返回NULL。 使用场景: - 当需要知道有多少条记录时(例如,用户数量、订单数量),使用COUNT。 - 当需要计算数值列的总和时(例如,总销售额、总成绩),使用SUM。 示例: 1. COUNT示例: - 统计表中所有记录数:`SELECT COUNT(*) FROM employees;` - 统计部门为'Sales'的员工数:`SELECT COUNT(*) FROM employees WHERE department = 'Sales';` - 统计有邮箱地址的员工数(假设email列,可能为NULL):`SELECT COUNT(email) FROM employees;` -- 这里只统计非NULL的邮箱 2. SUM示例: - 计算所有员工的工资总和:`SELECT SUM(salary) FROM employees;` - 计算部门为'Sales'的工资总和:`SELECT SUM(salary) FROM employees WHERE department = 'Sales';` 注意事项: - 如果对非数值列使用SUMMySQL会尝试将其转换为数值。如果转换失败(例如,字符串不能转换为数字),则结果为0,并可能产生警告。 - 使用COUNT(*)时,即使整行都是NULL也会被计数(但实际上,一行不可能所有列都NULL,因为主键等约束)。而COUNT(column)只计数非NULL值。 另外,引用[3]提到的ONLY_FULL_GROUP_BY模式会影响包含GROUP BY子句的查询,但这单独使用COUNTSUM没有直接关系。不过,当在分组查询中使用这两个函数时,需要确保SELECT列表中的非聚合列都在GROUP BY子句中,或者被包含在聚合函数中。 例如,以下查询在ONLY_FULL_GROUP_BY模式下会报错: ```sql SELECT department, name, COUNT(*) FROM employees GROUP BY department; ``` 因为name列没有出现在GROUP BY子句中,也没有被包含在聚合函数中。正确的写法应该是: ```sql SELECT department, COUNT(*) FROM employees GROUP BY department; -- 只选择分组列和聚合函数 ``` 或者,如果你需要每个部门中任意一个名字(但通常不推荐,因为名字不唯一): ```sql SELECT department, ANY_VALUE(name), COUNT(*) FROM employees GROUP BY department; ``` 总结: - COUNT:计数,返回整数。 - SUM:求和,返回数值(整数或浮点数)。 - 两者都是聚合函数,通常GROUP BY一起使用,但也可以单独使用。 最后,根据要求生成相关问题。 </think> ### MySQLCOUNTSUM函数的区别 在MySQL中,`COUNT()`和`SUM()`都是聚合函数,但功能和用途有本质区别: #### 1. **核心功能** - **`COUNT()`**:统计**行数**(记录数量) - 语法:`COUNT(expression)` - 返回满足条件的记录总数(整数) - 示例:统计员工总数 `SELECT COUNT(*) FROM employees;` - **`SUM()`**:计算**数值总和** - 语法:`SUM(numeric_column)` - 返回指定数值列的总和(数值类型) - 示例:计算工资总和 `SELECT SUM(salary) FROM employees;` #### 2. **处理NULL值的差异** | 函数 | NULL处理方式 | 示例说明 | |----------|----------------------------------|-----------------------------------| | `COUNT(*)` | 统计所有行(包括NULL) | `COUNT(*) FROM table` 统计全表行数 | | `COUNT(列)` | 忽略NULL值(只统计非NULL行) | `COUNT(email)` 只统计有邮箱的记录 | | `SUM()` | 忽略NULL值(NULL视为0参计算) | `SUM(bonus)` 忽略未发奖金的记录 | #### 3. **适用数据类型** - **`COUNT()`**:适用于**任意数据类型**(字符串、日期等均可统计行数) - **`SUM()`**:仅适用于**数值类型**(INT, DECIMAL, FLOAT等) #### 4. 典型使用场景对比 ```sql -- 场景1:统计销售订单数量(COUNT) SELECT COUNT(*) AS order_count FROM orders WHERE status = 'completed'; -- 场景2:计算销售总额(SUM) SELECT SUM(amount) AS total_sales FROM orders WHERE status = 'completed'; ``` #### 5. 结合GROUP BY的注意事项 在`GROUP BY`分组查询中,需遵循`ONLY_FULL_GROUP_BY`规则[^3]: ```sql -- 正确:分组列 + 聚合函数 SELECT department, COUNT(*) AS emp_count, -- 聚合函数 SUM(salary) AS total_salary FROM employees GROUP BY department; -- 分组列 -- 错误示例(违反ONLY_FULL_GROUP_BY) SELECT name, department, COUNT(*) FROM employees GROUP BY department; -- name未出现在GROUP BY或聚合函数中 ``` #### 总结对比表 | 特性 | COUNT() | SUM() | |--------------|------------------------|------------------------| | **返回类型** | 整数 | 数值(可能为小数) | | **主要用途** | 统计记录数量 | 计算数值列总和 | | **NULL处理** | `COUNT(*)`计NULL行 | 忽略NULL值 | | | `COUNT(列)`忽略NULL | | | **适用列类型** | 任意类型 | 仅数值类型 | | **典型场景** | 用户数、订单量统计 | 销售额、总分计算 | > 关键区别:**`COUNT()`计算行数,`SUM()`计算数值和**。两者常`WHERE`过滤或`GROUP BY`分组配合使用,但需注意MySQL的`ONLY_FULL_GROUP_BY`模式约束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值