MySQL查询去重distinct和group by区别 MySQL
前言
查询时经常需要对某列去重,新手在 DISTINCT 和 GROUP BY 之间纠结,两者都能去重,但适用场景和性能表现不同。DISTINCT 用于简单列去重,GROUP BY 配合聚合函数用于分组统计。本文通过实例讲清两者区别、写法差异、性能选择和常见坑,帮助正确选型。
操作步骤
1. 准备测试表
CREATE TABLE orders(
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
amount DECIMAL(10,2),
status VARCHAR(10)
);
2. DISTINCT 单列去重
查出有哪些不同的用户:
SELECT DISTINCT user_id FROM orders;
3. DISTINCT 多列组合去重
SELECT DISTINCT user_id, status FROM orders;
两列组合相同才会被去掉,不是分别去重。
4. GROUP BY 分组统计
SELECT user_id, COUNT(*) AS cnt, SUM(amount) AS total
FROM orders
GROUP BY user_id;
5. GROUP BY 仅取分组列也能去重
SELECT user_id FROM orders GROUP BY user_id;
6. 带 WHERE 过滤
SELECT DISTINCT user_id FROM orders WHERE status='paid';
7. 性能对比查看执行计划
EXPLAIN SELECT DISTINCT user_id FROM orders;
EXPLAIN SELECT user_id FROM orders GROUP BY user_id;
常见坑
- 以为 DISTINCT 分别对每列去重,实际是对整行组合去重。
- GROUP BY 后 SELECT 非聚合列,在严格模式下报错或结果不确定。
- 只去重不统计却硬写 GROUP BY,可读性差,简单去重优先 DISTINCT。
- 没有合适索引时,两者都可能产生临时表和文件排序。
- DISTINCT 作用于所有选中列,想只对一列去重要用子查询。
- 大量重复数据下,两者性能接近,差异主要在写法而非本质。
- 分组后过滤要用 HAVING,不能用 WHERE。
总结
只需要去掉重复值选 DISTINCT;需要分组统计(COUNT、SUM、AVG)选 GROUP BY。两者底层都要排序去重,性能取决于索引。写 SQL 时让意图匹配语法:简单枚举去重用 DISTINCT,聚合统计用 GROUP BY,避免为了去重而滥用分组。
遇到问题加QQ23979811 协助处理