以下是关于 sql 中 group by 和 distinct 关键字的区别。
group by 和 distinct 的区别
1. 定义
- distinct:
- 用于消除查询结果中的重复行,返回唯一值组合。
- 作用于整个
select子句的列集。
- group by:
- 用于将结果集按指定列分组,通常与聚合函数(如
count、sum)结合使用。 - 返回分组键和聚合计算结果。
- 用于将结果集按指定列分组,通常与聚合函数(如
2. 核心目的不同
- distinct:
- 专注于 去重,确保结果中无重复记录。
- 例如:获取唯一客户列表。
- group by:
- 专注于 分组和聚合,用于生成汇总统计。
- 例如:计算每个地区的销售总额。
3. 语法结构差异
- distinct 语法:
- 直接应用于
select子句。 - 示例:
select distinct column1, column2 from table_name;
- 直接应用于
- group by 语法:
- 需要
group by子句,且select中必须包含分组列或聚合函数。 - 示例:
select column1, count(column2) from table_name group by column1;
- 需要
4. 结果集区别
- distinct 结果:
- 返回原始列的唯一组合,不包含额外计算。
- 输出行数 ≤ 原始数据行数。
- group by 结果:
- 返回分组键(如
column1)和聚合值(如count(column2))。 - 输出行数 = 分组键的唯一值数量。
- 返回分组键(如
5. 与聚合函数的结合性
- distinct:
- 不能直接与聚合函数结合(例如
select distinct count(column)无效)。 - 如需聚合,需嵌套子查询。
- 不能直接与聚合函数结合(例如
- group by:
- 必须与聚合函数一起使用(如
sum、avg)。 - 聚合函数作用于每个分组内部。
- 必须与聚合函数一起使用(如
6. 使用场景对比
- 适用 distinct 时:
- 需要简单去重,无统计计算。
- 示例:列出所有不重复的产品类别。
- 适用 group by 时:
- 需要分组统计或汇总分析。
- 示例:计算每个部门的平均工资。
7. 示例对比(基于示例表employees)
| employeeid | department | salary |
|---|---|---|
| 1 | hr | 5000 |
| 2 | it | 6000 |
| 3 | hr | 5500 |
| 4 | it | 6500 |
distinct 示例:
select distinct department from employees;
结果:
department hr it group by 示例:
select department, avg(salary) as avgsalary from employees group by department;
结果:
department avgsalary hr 5250 it 6250
8.性能差距比较
在一张百万级的表里,统计 根据指定列 (去重后)的总行数。
-- 测试distinct性能 explain select count(distinct column_name) from table_name where conditions; -- 测试group by性能 explain select count(*) from ( select column_name from table_name where conditions group by column_name ) as tmp;
1. 一般情况下的性能表现
distinct通常更好,原因如下:
distinct是专门为去重设计的操作符,数据库优化器对其有专门的优化
语法更简洁,意图更明确
在大多数情况下,distinct的执行效率更高
2. 选择依据条件
- 数据量影响:
小到中等数据量:distinct性能通常更好
大数据量:需要考虑索引和具体查询条件 - 重复率影响:
低重复率(去重后数据量接近原始数据量):两者性能相近,distinct略优
高重复率(去重后数据量远小于原始数据量):distinct优势更明显 - 索引情况:
如果去重字段有索引,distinct性能更好
复合索引对两种方法都有帮助
9. 总结
- distinct:简单去重工具,适合返回唯一值列表。
- group by:分组聚合工具,适合生成统计摘要。
- 关键选择依据:是否需要聚合计算——如果需要,用
group by;如果仅需去重,用distinct。
总结
到此这篇关于mysql统计总条数(需去重)使用办法的文章就介绍到这了,更多相关mysql统计去重总条数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论