返回

查找重复数据的 SQL 查询

后端

如何有效清理 MySQL 中的重复数据?

在数据库管理中,清理重复数据至关重要,以确保数据完整性和提高查询效率。本文将介绍如何在 MySQL 中有效地查找和删除重复数据。

要查找重复数据,可以使用以下 SQL 查询:

SELECT column_name1, column_name2, COUNT(*) AS count
FROM table_name
GROUP BY column_name1, column_name2
HAVING COUNT(*) > 1;

其中,column_name1column_name2 是要检查重复数据的列。COUNT(*) 函数统计每个唯一组合的出现次数。HAVING COUNT(*) > 1 子句筛选出出现次数大于 1 的记录,即重复数据。

删除重复数据时,需要确保只保留一个唯一副本。有两种方法可以实现:

方法 1:使用 DELETE 语句

DELETE FROM table_name
WHERE (column_name1, column_name2) IN (
    SELECT column_name1, column_name2
    FROM (
        SELECT column_name1, column_name2, COUNT(*) AS count
        FROM table_name
        GROUP BY column_name1, column_name2
        HAVING COUNT(*) > 1
    ) AS subquery
);

这个查询将从包含重复数据的子查询中删除重复行。

方法 2:使用 TRUNCATE TABLE 语句

TRUNCATE TABLE table_name;

TRUNCATE TABLE 语句将从表中删除所有行,包括重复数据。它比 DELETE 语句效率更高,因为它不会记录要删除的行。

考虑以下示例表:

CREATE TABLE my_table (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL,
    PRIMARY KEY (id),
    UNIQUE INDEX (name, email)
);

其中,nameemail 列定义了一个联合唯一索引。插入以下数据:

INSERT INTO my_table (name, email) VALUES
('John Doe', 'johndoe@example.com'),
('Jane Doe', 'janedoe@example.com'),
('John Doe', 'johndoe@example.com'),  -- 重复数据
('Jane Doe', 'janedoe@example.com'); -- 重复数据

使用前面的查询查找重复数据:

SELECT name, email, COUNT(*) AS count
FROM my_table
GROUP BY name, email
HAVING COUNT(*) > 1;

结果:

+---------+---------+-------+
| name     | email    | count |
+---------+---------+-------+
| John Doe | johndoe@example.com | 2 |
| Jane Doe | janedoe@example.com | 2 |
+---------+---------+-------+

要删除重复数据,可以使用以下查询之一:

-- 使用 DELETE 语句
DELETE FROM my_table
WHERE (name, email) IN (
    SELECT name, email
    FROM (
        SELECT name, email, COUNT(*) AS count
        FROM my_table
        GROUP BY name, email
        HAVING COUNT(*) > 1
    ) AS subquery
);

或:

-- 使用 TRUNCATE TABLE 语句
TRUNCATE TABLE my_table;