Mysql 简明教程

MySQL - Find Duplicate Records

表中的重复记录会降低 MySQL 数据库的效率(通过增加执行时间、使用不必要的空间等)。因此,查找重复项对于有效使用数据库来说变得有必要。

但是,我们还可以通过对所需列添加约束(例如 PRIMARY KEY 和 UNIQUE 约束)来阻止用户向表中输入重复值。

但是,由于人机错误、应用程序 Bug 或从外部资源中提取的数据等各种原因,如果重复项仍然输入到数据库中,则有多种方法可以查找记录。使用 SQL GROUP BYHAVING 子句是筛选包含重复项的记录的常用方法之一。

Finding Duplicate Records

在查找表中的重复记录之前,我们需要定义需要重复记录的条件。您可以通过两个步骤执行此操作 -

  1. 首先,我们需要使用 GROUPBY 子句,按想要检查重复项的列对所有行进行分组。

  2. 然后使用 Having 子句和 count 函数,我们需要验证上述任何已形成组是否具有 1 个以上的实体。

Example

首先,让我们使用以下查询创建一个名为 CUSTOMERS 的表 -

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

现在,让我们使用 INSERT IGNORE INTO 语句将一些重复记录插入到上述创建的表中,如下所示 -

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

表创建如下 −

在以下查询中,我们尝试使用 MySQL COUNT() 函数返回重复记录的计数 -

SELECT SALARY, COUNT(SALARY)
AS "COUNT" FROM CUSTOMERS
GROUP BY SALARY
ORDER BY SALARY;

Output

以上查询的输出如下所示:

With Having Clause

MySQL 中的 HAVING 子句可用于筛选表中一组行的条件。在此,我们将 HAVING 子句与 COUNT() 函数一起使用,以查找表中一列或多列中的重复值。

Duplicates values in single column

以下是查找表中单列中重复值的方法:

Step-1: 首先,我们需要使用 GROUP BY 子句对希望检查重复项的列中的所有行进行分组。

Step-2: 接下来,要在 HAVING 子句中使用 COUNT() 函数查找重复组,以检查是否有任何组有多个元素。

Example

可以使用以下查询,我们可以找到宠物表中具有重复 DOG_NAMES 的所有行-

SELECT SALARY, COUNT(SALARY)
FROM CUSTOMERS
GROUP BY SALARY
HAVING COUNT(SALARY) > 1;

Output

输出如下 −

Duplicate Values in Multiple Columns

我们可以在 HAVING 子句中使用 AND 运算符查找多列中的重复行。仅当列组合重复时,这些行才被认为是重复的。

Example

在以下查询中,我们正在宠物表中查找 DOG_NAME、AGE、OWNER_NAME 列中具有重复记录的行-

SELECT SALARY, COUNT(SALARY),
AGE, COUNT(AGE)
FROM CUSTOMERS
GROUP BY SALARY, AGE
HAVING  COUNT(SALARY) > 1
AND COUNT(AGE) > 1;

Output

输出如下 −

The ROW_NUMBER() function with PARTITION BY

在 MySQL 中,ROW_NUMBER() 函数和 PARTITION BY 子句可用于查找表中的重复记录。分区子句根据特定列或多列对表进行划分,然后 ROW_NUMBER() 函数为每个分区内的每一行分配一个唯一行号。具有相同分区和行号的行被视为重复行。

Example

在以下查询中,我们正在分配 a

SELECT *, ROW_NUMBER() OVER (
   PARTITION BY SALARY, AGE
   ORDER BY SALARY, AGE
) AS row_numbers
FROM CUSTOMERS;

Output

以上查询的输出如下-

Find Duplicate Records Using Client Program

我们还可以使用客户程序查找重复记录。

Syntax

Example

以下是这些程序 −