MySQL 处理重复数据

在 MySQL 中处理重复数据可以采取以下几种常见的方法:

使用 DISTINCT 关键字
在 SELECT 语句中使用 DISTINCT 关键字可以去除结果集中的重复行。
示例:
SELECT DISTINCT column1, column2,…
FROM table_name;
使用 GROUP BY 子句
结合聚合函数,按照指定的列对数据进行分组,从而达到去除重复的效果。
示例:

SELECT column1, column2,…
FROM table_name
GROUP BY column1, column2,…;

删除重复数据
首先确定哪些行是重复的,然后删除多余的重复行。
找出重复行:

SELECT column1, column2,…
FROM table_name
GROUP BY column1, column2,…
HAVING COUNT(*) > 1;
删除重复行(假设 id 是唯一标识列):
DELETE t1
FROM table_name t1
JOIN table_name t2 ON t1.column1 = t2.column1 AND t1.column2 = t2.column2…
WHERE t1.id > t2.id;
创建唯一索引
可以在表上创建唯一索引来防止重复数据的插入。
示例:
ALTER TABLE table_name ADD UNIQUE INDEX unique_index_name (column1, column2,…);

除了上述提到的方法,还可以通过以下方式处理 MySQL 中的重复数据:

子查询结合 IN 关键字
首先找出重复的数据,然后通过子查询和 IN 关键字来筛选出不重复的数据。
示例:
SELECT *
FROM table_name
WHERE (column1, column2,…) NOT IN
(
SELECT column1, column2,…
FROM table_name
GROUP BY column1, column2,…
HAVING COUNT(*) > 1
);
临时表
将数据插入临时表,处理临时表中的重复数据,然后再将处理后的数据导回原表。
示例:

CREATE TEMPORARY TABLE temp_table AS
SELECT * FROM table_name;

-- 处理临时表中的重复数据

DELETE FROM table_name;

INSERT INTO table_name SELECT * FROM temp_table;

使用 ROW_NUMBER() 函数
通过给每一行分配一个行号,根据行号来保留或删除重复行。
示例(假设要保留每个重复组的第一行):

DELETE FROM table_name
WHERE id NOT IN
(
SELECT id
FROM
(
SELECT id, ROW_NUMBER() OVER (PARTITION BY column1, column2,… ORDER BY id) AS row_num
FROM table_name
) t
WHERE row_num = 1
);
需要注意的是,在实际操作中,根据数据量的大小和数据库的性能,不同的方法可能会有不同的效果。对于重要的数据,一定要先备份再进行处理。

实例演示1:表含有唯一标识ID的处理

— 创建表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);

— 插入数据(包含重复数据)
INSERT INTO students (name, age)
VALUES (‘Alice’, 20),
(‘Bob’, 21),
(‘Alice’, 20),
(‘Charlie’, 19),
(‘David’, 22),
(‘Bob’, 21),
(‘Emma’, 20),
(‘Frank’, 18),
(‘Alice’, 20),
(‘George’, 23);

— 查看原始数据
SELECT * FROM students;

— 找出重复数据
SELECT name, age, COUNT() FROM students GROUP BY name, age HAVING COUNT() > 1;

— 删除重复数据(保留唯一行)
DELETE t1
FROM students t1
JOIN (
SELECT name, age, MIN(id) AS min_id
FROM students
GROUP BY name, age
) t2 ON t1.name = t2.name AND t1.age = t2.age AND t1.id > t2.min_id;

— 查看删除重复数据后的结果
SELECT * FROM students;
实例演示2:表不含有唯一标识ID的处理

— 创建表
CREATE TABLE courses (
name VARCHAR(50),
teacher VARCHAR(50)
);

— 插入数据(包含重复数据)
INSERT INTO courses (name, teacher)
VALUES (‘Math’, ‘Mr. Smith’),
(‘English’, ‘Mrs. Johnson’),
(‘Math’, ‘Mr. Smith’),
(‘Science’, ‘Dr. Brown’),
(‘History’, ‘Ms. Davis’),
(‘English’, ‘Mrs. Johnson’),
(‘Art’, ‘Mr. Wilson’),
(‘Math’, ‘Mr. Smith’),
(‘Music’, ‘Ms. Taylor’),
(‘Science’, ‘Dr. Brown’);

— 显示原始数据
SELECT * FROM courses;

— 使用 ROW_NUMBER() 函数删除重复数据
DELETE FROM courses
WHERE (name, teacher) IN (
SELECT name, teacher
FROM (
SELECT name, teacher, ROW_NUMBER() OVER (PARTITION BY name, teacher ORDER BY name, teacher) AS row_num
FROM courses
) t
WHERE row_num > 1
);

— 显示删除重复数据后的结果
SELECT * FROM courses;

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/418268.html

联系我们
联系我们
分享本页
返回顶部