简介:在本教程中,您将学习如何在MySQL中查找一个或多个列的重复值。
发生数据重复的原因很多。查找重复值是使用数据库时必须处理的重要任务之一。
设置样本表
首先,创建一个表命名为contacts
四列:id
,first_name
,last_name
,和email
。
简介:在本教程中,您将学习如何在MySQL中查找一个或多个列的重复值。
发生数据重复的原因很多。查找重复值是使用数据库时必须处理的重要任务之一。
首先,创建一个表命名为contacts
四列: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 );
其次,在表中插入行contacts
:
INSERT INTO contacts (first_name,last_name,email) VALUES ('Carine ','Schmitt','carine.schmitt@verizon.net'), ('Jean','King','jean.king@me.com'), ('Peter','Ferguson','peter.ferguson@google.com'), ('Janine ','Labrune','janine.labrune@aol.com'), ('Jonas ','Bergulfsen','jonas.bergulfsen@mac.com'), ('Janine ','Labrune','janine.labrune@aol.com'), ('Susan','Nelson','susan.nelson@comcast.net'), ('Zbyszek ','Piestrzeniewicz','zbyszek.piestrzeniewicz@att.net'), ('Roland','Keitel','roland.keitel@yahoo.com'), ('Julie','Murphy','julie.murphy@yahoo.com'), ('Kwai','Lee','kwai.lee@google.com'), ('Jean','King','jean.king@me.com'), ('Susan','Nelson','susan.nelson@comcast.net'), ('Roland','Keitel','roland.keitel@yahoo.com');
第三,从联系人表中查询数据:
SELECT * FROM contacts ORDER BY email;
在contacts
表格中,我们有一些行具有在重复的值first_name
,last_name
和email
列。让我们学习如何找到它们。
在表的一列中查找重复的值,您可以使用以下步骤:
GROUP BY
子句将所有行按目标列进行分组,目标列是您要检查重复项的列。COUNT()
函数HAVING
检查是否任何组的元素数均超过1。这些组是重复的。
以下查询说明了这种想法:
SELECT col, COUNT(col) FROM table_name GROUP BY col HAVING COUNT(col) > 1;
通过使用此查询模板,您可以查找contacts
表中具有重复电子邮件的行,如下所示:
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 ...
仅当列的组合重复时才将行视为重复,因此我们AND
在HAVING
子句中使用了运算符。
例如,要查找的行contacts
表中重复值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中一个或多个列的值查找重复的行。
以下查询返回表中的重复电子邮件contacts
:
SELECT email, COUNT(email) FROM contacts GROUP BY email HAVING COUNT(email) > 1;
如您所见,我们有四行重复的电子邮件。
DELETE JOIN
语句删除重复的行MySQL为您提供了DELETE JOIN
允许您快速删除重复行的语句。
以下语句删除重复的行并保留最高的ID:
DELETE t1 FROM contacts t1 INNER JOIN contacts t2 WHERE t1.id < t2.id AND t1.email = t2.email;
该查询两次引用联系人表,因此,它使用表别名 t1和t2。
输出为:
Query OK, 4 rows affected (0.10 sec)
它表示已删除四行。您可以执行再次查找重复电子邮件的查询以验证删除:
SELECT email, COUNT(email) FROM contacts GROUP BY email HAVING COUNT(email) > 1;
查询返回一个空集,这意味着重复的行已被删除。
让我们验证contacts
表中的数据:
SELECT * FROM contacts;
ID为2、4、7和9的行已删除。
如果要删除重复的行并保留最低的ID,可以使用以下语句:
DELETE c1 FROM contacts c1 INNER JOIN contacts c2 WHERE c1.id > c2.id AND c1.email = c2.email;
请注意,您可以contacts
再次执行用于创建表的脚本并测试此查询。以下输出显示了contacts
删除重复的行后的表数据。
下面显示了使用中间表删除重复行的步骤:
以下查询说明了步骤:
步骤1.创建一个新表,其结构与原始表相同:
CREATE TABLE source_copy LIKE source;
步骤2.将不同的行从原始表插入到新表中:
INSERT INTO source_copy SELECT * FROM source GROUP BY col; -- column that has duplicate values
步骤3.删除原始表并将立即表重命名为原始表
DROP TABLE source; ALTER TABLE source_copy RENAME TO source;
例如,以下语句从contacts
表中删除具有重复电子邮件的行:
-- step 1 CREATE TABLE contacts_temp LIKE contacts; -- step 2 INSERT INTO contacts_temp SELECT * FROM contacts GROUP BY email; -- step 3 DROP TABLE contacts; ALTER TABLE contacts_temp RENAME TO contacts;
ROW_NUMBER()
函数删除重复的行ROW_NUMBER()
自MySQL 8.02版以来,该功能已受支持,因此您应在使用该功能之前检查MySQL版本。以下语句使用该ROW_NUMBER()
函数为每行分配一个连续的整数。如果电子邮件重复,则行号将大于一。
SELECT id, email, ROW_NUMBER() OVER ( PARTITION BY email ORDER BY email ) AS row_num FROM contacts;
以下语句返回重复行的id列表:
SELECT id FROM ( SELECT id, ROW_NUMBER() OVER ( PARTITION BY email ORDER BY email) AS row_num FROM contacts ) t WHERE row_num > 1;
而你只是删除从重复的行contacts
使用该表DELETE
与语句子查询 中的WHERE
条款:
DELETE FROM contacts WHERE id IN ( SELECT id FROM ( SELECT id, ROW_NUMBER() OVER ( PARTITION BY email ORDER BY email) AS row_num FROM contacts ) t WHERE row_num > 1 );
MySQL发出以下消息:
4 row(s) affected
在本教程中,您学习了如何通过使用DELETE JOIN
语句或中间表在MySQL中删除重复的行 。
本文:Mysql: 搜索重复数据, 搜索重复值, How To Find Duplicate Values in MySQL