如何在MySQL中查找重复值

时间:2019-11-20 08:52:30  来源:igfitidea点击:

简介:在本教程中,您将学习如何在MySQL中查找一个或多个列的重复值。

发生数据重复的原因很多。
查找重复值是使用数据库时必须处理的重要任务之一。

设置样本表

首先,创建一个名为contact的表,该表有四列:id,first_name,last_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
);

其次,将行插入联系人表:

INSERT INTO contacts (first_name,last_name,email) 
VALUES ('Carine ','Schmitt','[email protected]'),
       ('Jean','King','[email protected]'),
       ('Peter','Ferguson','[email protected]'),
       ('Janine ','Labrune','[email protected]'),
       ('Jonas ','Bergulfsen','[email protected]'),
       ('Janine ','Labrune','[email protected]'),
       ('Susan','Nelson','[email protected]'),
       ('Zbyszek ','Piestrzeniewicz','[email protected]'),
       ('Roland','Keitel','[email protected]'),
       ('Julie','Murphy','[email protected]'),
       ('Kwai','Lee','[email protected]'),
       ('Jean','King','[email protected]'),
       ('Susan','Nelson','[email protected]'),
       ('Roland','Keitel','[email protected]');

第三,从联系人表中查询数据:

SELECT * FROM contacts
ORDER BY email;

在联系人表中,我们有一些行在first_name,last_name和email列中具有重复的值。
让我们学习如何找到它们。

在一列中查找重复的值

在表的一列中查找重复的值,您可以使用以下步骤:

  • 首先,使用GROUP BY子句按目标列对所有行进行分组,目标列是您要检查重复项的列。

  • 然后,在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;

此图显示查询的输出,该查询显示重复的电子邮件:

在多列中查找重复值

有时,您希望基于多个列而不是一个列来查找重复的行。
在这种情况下,可以使用以下查询:

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

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

仅当列的组合重复时才将行视为重复,因此我们在HAVING子句中使用AND运算符。

例如,要在联系人表中查找在first_name,last_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;

下面说明了查询的输出:

在本教程中,您学习了如何根据MySQL中一个或多个列的值查找重复的行。