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;

常见坑

  1. 以为 DISTINCT 分别对每列去重,实际是对整行组合去重。
  2. GROUP BY 后 SELECT 非聚合列,在严格模式下报错或结果不确定。
  3. 只去重不统计却硬写 GROUP BY,可读性差,简单去重优先 DISTINCT。
  4. 没有合适索引时,两者都可能产生临时表和文件排序。
  5. DISTINCT 作用于所有选中列,想只对一列去重要用子查询。
  6. 大量重复数据下,两者性能接近,差异主要在写法而非本质。
  7. 分组后过滤要用 HAVING,不能用 WHERE。

总结

只需要去掉重复值选 DISTINCT;需要分组统计(COUNT、SUM、AVG)选 GROUP BY。两者底层都要排序去重,性能取决于索引。写 SQL 时让意图匹配语法:简单枚举去重用 DISTINCT,聚合统计用 GROUP BY,避免为了去重而滥用分组。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-11-14 07:11 
'); })();