当前位置:首页 > 问答 > 正文

数据库查询|数据去重|mysql查重复数据—MySQL查重复数据方法与技巧

🔍 MySQL查重复数据方法与技巧:轻松搞定数据去重!

📢 最新动态(2025-08)
MySQL 8.4 近期优化了 GROUP BY 和窗口函数的性能,处理大规模重复数据时效率提升约15%!对于数据清洗和去重任务来说,这简直是开发者的福音~


为什么要查重复数据?

重复数据不仅浪费存储空间,还可能导致统计错误、业务逻辑混乱。

  • 用户表中重复的邮箱/手机号
  • 订单系统中同一商品被多次录入
  • 日志文件里重复的记录

🛠️ 目标:快速定位重复数据,并清理或合并它们!


基础方法:用GROUP BY + HAVING

最经典的查重方式,适合大多数场景:

数据库查询|数据去重|mysql查重复数据—MySQL查重复数据方法与技巧

SELECT 字段1, 字段2, COUNT(*) AS 重复次数
FROM 表名
GROUP BY 字段1, 字段2
HAVING COUNT(*) > 1;  -- 筛选重复记录

📝 示例:找出users表中重复的邮箱:

SELECT email, COUNT(*) AS dup_count
FROM users
GROUP BY email
HAVING dup_count > 1;

进阶技巧:窗口函数(MySQL 8.0+)

如果需要同时显示重复数据的完整行,用窗口函数更高效:

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY 字段1, 字段2) AS row_num
    FROM 表名
) AS t
WHERE row_num > 1;  -- 标记重复行

💡 优势

  • 直接定位所有重复数据(不聚合)
  • 可搭配DELETE删除重复项(见第5节)

查重+排序:快速定位问题数据

有时需要按重复量排序,优先处理高频重复项:

SELECT 
    product_id, 
    COUNT(*) AS duplicate_count
FROM orders
GROUP BY product_id
HAVING duplicate_count > 1
ORDER BY duplicate_count DESC;  -- 按重复次数降序

删除重复数据(保留一条)

查到重复数据后,通常需要清理,以下是安全删除方法:

数据库查询|数据去重|mysql查重复数据—MySQL查重复数据方法与技巧

用临时表

-- 步骤1:创建临时表存储唯一数据
CREATE TABLE temp_table AS
SELECT DISTINCT * FROM 原表;
-- 步骤2:清空原表并插回数据
TRUNCATE TABLE 原表;
INSERT INTO 原表 SELECT * FROM temp_table;
DROP TABLE temp_table;

用ROW_NUMBER()(MySQL 8.0+)

DELETE FROM 表名
WHERE id NOT IN (
    SELECT MIN(id)  -- 保留ID最小的记录
    FROM (
        SELECT id, 
               ROW_NUMBER() OVER (PARTITION BY 字段1, 字段2) AS rn
        FROM 表名
    ) AS t
    WHERE rn = 1
);

预防重复:3个实用建议

  1. 🚨 添加唯一约束
    ALTER TABLE users ADD UNIQUE (email);  -- 阻止重复插入
  2. 🛡️ 使用INSERT IGNORE或ON DUPLICATE KEY UPDATE
    INSERT IGNORE INTO users (email) VALUES ('test@example.com');  -- 忽略重复
  3. 🔍 定期执行查重脚本(比如每周一次)

  • 小数据量:用 GROUP BY + HAVING 简单直接
  • 大数据量:窗口函数(ROW_NUMBER())效率更高
  • 删除时:务必先备份!临时表法最安全

🎯 一句话:查重是数据健康的“体检”,定期清理让数据库跑得更快!

发表评论