如何查找 MySQL 表里的重复数据 - MySQL 系列教程

卡拉先生
发布于 2020年09月26日 | 上次编辑:2020年09月26日

如何查找 MySQL 表里的重复数据
如何查找 MySQL 表里的重复数据

在日常的开发过程中,数据重复的问题是经常发生的。通常我们会需要查询到这些重复记录,并进行去重复操作。今天,我们就来看看在 MySQL 里怎么搞定它吧。

如果你对 MySQL 还不了解,可以从我们的初学者教程开始看起,更多 MySQL 系列教程可访问我们的技术社区

先来一张表

首先,为了方便演示,我们创建一个表叫作 contacts,一个联系人表。它含有这些字段:idfirst_namelast_name 以及 email

CREATE TABLE contacts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(255) NOT NULL
);

然后我们用 SQL 把数据插进去。

INSERT INTO contacts (first_name,last_name,email) 
VALUES ('赵','福','zhaofu@163.com'),
       ('钱','云飞','yunfei@163.com'),
       ('钱','云飞','yunfei@163.com'),
       ('孙','兴怀','sunxinghuai@163.com'),
       ('孙','兴怀','sunxinghuai@163.com'),
       ('李','从丹','congdan@163.com'),
       ('周','奇','zhouqi@163.com'),
       ('吴','刚','wugang@163.com'),
       ('郑','寻桃','zhengxuntao@163.com'),
       ('王','丹亦','wangdanyi@163.com'),
       ('王','丹亦','wangdanyi@163.com'),
       ('蒋','柳','jiangliu@163.com'),
       ('蒋','柳','jiangliu@163.com'),
       ('韩','又松','hanyousong@163.com'),

再把数据查询出来看看

SELECT * FROM contacts
ORDER BY email;

table1

在这张联系人表中,我们可以看到有些行所代表的联系人,拥有重复的 first_namelast_name,以及 email 字段。 让我们立马来做一个去重吧。

找到单个字段重复的数据

要找到一张表里单个字段重复了的数据,可以按照下列步骤来做:

  1. 使用 GROUP BY 语句来把所有数据按照目标字段分组,这个字段就是你想去重的字段。
  2. 然后在 HAVING 语句中使用 COUNT() 来检查是不是每个组有超过 1 个元素,而凡是超过了的就是重复的数据。

代码的模板是这样子的:

SELECT 
    col, 
    COUNT(col)
FROM
    table_name
GROUP BY col
HAVING COUNT(col) > 1;

我们来套模板,来找到我们联系人表中拥有重复邮箱的数据:

SELECT 
    email, 
    COUNT(email)
FROM
    contacts
GROUP BY email
HAVING COUNT(email) > 1;

最后如图所示,我们找到的重复邮箱如下:

table2

找到多个字段重复的数据

有时候你还需要找到多个字段都重复了的数据,在这种情况下你可以用这套代码模板:

SELECT 
    col1, COUNT(col1),
    col2, COUNT(col2),
    ...

FROM
    table_name
GROUP BY 
    col1, 
    col2, ...
HAVING 
       (COUNT(col1) > 1) AND 
       (COUNT(col2) > 1) AND 
       ...

只有当所有我们指定的字段都重复的,才算数据重复,所以我们要使用 AND 操作符和 HAVING 语句。

例如我们现在要找到我们联系人表中,first_namelast_name 以及 email 字段都重复的数据,代码如下:

SELECT 
    first_name, COUNT(first_name),
    last_name,  COUNT(last_name),
    email,      COUNT(email)
FROM
    contacts
GROUP BY 
    first_name , 
    last_name , 
    email
HAVING  COUNT(first_name) > 1
    AND COUNT(last_name) > 1
    AND COUNT(email) > 1;

最后输出结果如下图所示:

table3

到这里,你已经学会了如何在 MySQL 中找到单个字段甚至多个字段重复的数据了。

接下来,在我们的 MySQL 系列教程中你还可以学习到

同时也欢迎使用我们的数据库搜索工具「卡拉搜索」。

一行代码快速部署「站内搜索」,app、小程序皆可使用。智能精准排序,毫秒级搜索体验。卡拉搜索 Demo,欢迎体验。

友情链接更新日志© 2020, 卡拉搜索, Built with ❤️ in San Francisco + Beijing

京ICP备15049164号-3