使用DISTINCT可对单列或多列去重,返回唯一值;2. GROUP BY通过分组实现去重,支持结合聚合函数统计;3. 复杂场景可用子查询或ROW_NUMBER()窗口函数保留一条完整记录,推荐mysql 8.0+使用窗口函数处理大数据量。

在MySQL中,如果查询结果包含重复数据,可以通过多种方式实现去重。最常用的方法是使用 DISTINCT 关键字,也可以结合 GROUP BY 子句来达到目的。下面介绍几种常见的去重实现方法。
DISTINCT 去重
当需要去除某列或多个列的重复值时,可以使用 DISTINCT。它会返回唯一不同的记录。
- 对单列去重:获取某一列的不重复值。
- 对多列去重:只有当多个字段组合完全相同时才会去重。
select DISTINCT column_name FROM table_name;
SELECT DISTINCT col1, col2 FROM table_name;
GROUP BY 实现去重
GROUP BY 通常用于分组统计,但也能实现去重效果,尤其适合需要配合聚合函数(如 count、MAX 等)的场景。
- 按字段分组,每组只显示一行,达到去重目的。
- 可结合聚合函数获取更多信息,比如每组的记录数。
SELECT col1, col2 FROM table_name GROUP BY col1, col2;
SELECT col1, COUNT(*) FROM table_name GROUP BY col1;
去重并保留一条完整记录(如按ID最小)
有时表中存在完全重复的行,或想根据某个字段去重但保留一条完整记录,可以使用子查询或窗口函数(MySQL 8.0+)。
- 使用子查询和 MIN(ID) 去重:
- 使用 ROW_NUMBER() 窗口函数(推荐处理大数据量):
SELECT * FROM table_name t1 WHERE id = (SELECT MIN(id) FROM table_name t2 WHERE t2.key = t1.key);
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY key_col ORDER BY id) AS rn FROM table_name) t WHERE rn = 1;
基本上就这些常用方法。DISTINCT 最简单直接,适合简单去重;GROUP BY 更灵活,支持统计;复杂场景建议用窗口函数。选择哪种方式取决于你的数据结构和去重要求。