常识指南
霓虹主题四 · 更硬核的阅读氛围

SQL查询去重,这几个方法你得知道

发布时间:2025-12-20 10:50:23 阅读:437 次

在日常工作中,处理数据库数据时经常遇到重复记录的问题。比如公司销售表里,同一个客户被多次录入,查月度业绩时就容易算重。这时候,SQL查询去重就成了必备技能。

用 DISTINCT 去除完全重复的行

最简单的去重方式就是使用 DISTINCT。它能去掉查询结果中完全相同的行。比如想查出所有有订单的客户编号,不关心重复:

SELECT DISTINCT customer_id FROM orders;

这条语句会返回唯一的客户ID列表,哪怕某个客户下了10单,也只显示一次。

对部分字段去重,保留一条记录

实际场景更复杂。比如用户信息表里,姓名和电话相同就算重复,但ID不同。这时可以用 GROUP BY 配合聚合函数:

SELECT name, phone, MIN(user_id) AS id
FROM users
GROUP BY name, phone;

这样每个“姓名+电话”组合只留一条,取最小ID代表该用户,避免数据丢失。

按优先级保留最新或最旧的一条

有时候希望保留最新的记录。比如员工变更部门,要查当前状态。可以用窗口函数 ROW_NUMBER()

SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY update_time DESC) AS rn
FROM employee_history
) t
WHERE rn = 1;

这里按员工ID分组,按时间倒序排,只取第一条,自然就是最新记录。

删除表中真正的重复数据

如果表里已经积压了大量重复,想彻底清理,可以借助临时表:

CREATE TEMPORARY TABLE tmp_users AS
SELECT MIN(id) AS id
FROM users
GROUP BY name, phone;

DELETE FROM users WHERE id NOT IN (SELECT id FROM tmp_users);

先选出每组要保留的ID,再删掉其他行。操作前记得备份,避免误删。

去重不是一刀切的操作,关键看业务需求:是只想查时不重复,还是真要删数据?是全字段重复,还是关键字段相同就算?理清这些,方法自然就有了。