技术文摘
MySQL 中删除重复数据的方法
MySQL 中删除重复数据的方法
在 MySQL 数据库管理中,处理重复数据是常见的任务。重复数据不仅占用额外的存储空间,还可能影响查询性能和数据的准确性。下面介绍几种在 MySQL 中删除重复数据的有效方法。
使用 DISTINCT 和临时表
这种方法适用于数据量不是特别大的情况。创建一个临时表,使用 DISTINCT 关键字将不重复的数据插入到临时表中。例如,假设有一个名为 employees 的表,包含 id、name、age 字段。
CREATE TEMPORARY TABLE temp_employees AS
SELECT DISTINCT * FROM employees;
接着,删除原表中的所有数据:
DELETE FROM employees;
最后,将临时表中的数据插回到原表:
INSERT INTO employees SELECT * FROM temp_employees;
完成这些操作后,删除临时表:
DROP TEMPORARY TABLE temp_employees;
使用 GROUP BY 和 HAVING 子句
对于更复杂的情况,可以利用 GROUP BY 和 HAVING 子句。假设 employees 表中存在重复记录,要删除这些重复记录,可以按照所有列进行分组,并使用 HAVING 子句筛选出每组中只出现一次的记录,然后将其保留,删除其他重复记录。
DELETE FROM employees
WHERE id NOT IN (
SELECT min_id
FROM (
SELECT MIN(id) AS min_id
FROM employees
GROUP BY name, age
) AS subquery
);
在这个查询中,子查询先通过 GROUP BY 对 name 和 age 进行分组,然后使用 MIN(id) 找出每组中的最小 id。主查询则删除那些 id 不在子查询结果中的记录。
利用 ROW_NUMBER() 窗口函数
在支持窗口函数的 MySQL 版本中,这是一种高效的方法。首先,使用 ROW_NUMBER() 函数为每组重复数据分配一个唯一的行号。
WITH RankedEmployees AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY name, age ORDER BY id) AS row_num
FROM employees
)
DELETE FROM employees
WHERE id NOT IN (
SELECT id
FROM RankedEmployees
WHERE row_num = 1
);
在这个查询中,WITH 子句创建了一个名为 RankedEmployees 的临时结果集。ROW_NUMBER() 函数根据 name 和 age 进行分区,并按 id 排序,为每个分区内的行分配一个行号。主查询则删除那些行号不为 1 的记录,从而保留每个分组中的第一条记录。
通过这些方法,能够根据实际情况灵活地处理 MySQL 中的重复数据,优化数据库性能。
TAGS: 数据处理 MySQL数据库 SQL语句 mysql删除重复数据
- SpringBoot 与 HTML 模板完美结合高效生成 PDF 文档
- 为何众多人不建议采用 JWT?从技术角度深入解析
- Stream 之 collect 图解:长文深度剖析助你完全掌控流式编程
- 两位大龄程序员欲搞垮世界软件巨头
- 容器核心知识的全面回溯 超全!
- 三分钟搞定 Vuex-Persistedstate 开发,你会了吗?
- 单元测试中 Mock 的抉择
- Pulsar 客户端消费模式探究:Go 语言下的 ZeroQueueConsumer 实现
- 列表作为序列型对象的支持操作及底层实现方式探究
- 你了解 API 网关是什么吗?
- 每日一技:Python 代码的正确保护方法
- 每日一技:Python 代码混淆方法解析
- Go micro/cli 竟直接删库,极不专业!
- ES8 里的五大变革性 JavaScript 特性
- Vue3 怎样封装合格的获取验证码组件