重复记录(duplicate records)数据的相关操作

本文介绍MySQL中如何查找和删除重复数据,包括通过不同SQL语句实现重复数据的筛选及删除,适用于初学者和有一定经验的数据库管理员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 创建表和测试数据

/* 表结构 */
DROPTABLEIFEXISTS `t1`;
CREATETABLEIFNOTEXISTS `t1`(
`id`
INT(1)NOTNULL AUTO_INCREMENT,
`name`
VARCHAR(20)NOTNULL,
`
add`VARCHAR(20)NOTNULL,
PRIMARYKEY(`id`)
)Engine
=InnoDB;

/* 插入测试数据 */
INSERTINTO `t1`(`name`,`add`)VALUES
(
'abc',"123"),
(
'abc',"123"),
(
'abc',"321"),
(
'abc',"123"),
(
'xzy',"123"),
(
'xzy',"456"),
(
'xzy',"456"),
(
'xzy',"456"),
(
'xzy',"789"),
(
'xzy',"987"),
(
'xzy',"789"),
(
'ijk',"147"),
(
'ijk',"147"),
(
'ijk',"852"),
(
'opq',"852"),
(
'opq',"963"),
(
'opq',"741"),
(
'tpk',"741"),
(
'tpk',"963"),
(
'tpk',"963"),
(
'wer',"546"),
(
'wer',"546"),
(
'once',"546");

运行完上面的SQL,可以用
SELECT * FROM `t1` 测试一下。

  • 查找所有重复的数据

重复数据只显示其中一条:
/* 查找所有重复数据,重复数据只显示一次 */
SELECT 
    * 
FROM
    `t1` 
GROUP BY `name` 
HAVING COUNT(1) > 1 
#HAVING COUNT(1) = 1 #这条语句表示显示其中不重复的数据

效果如下:
    id  name    add     
------  ------  --------
     1  abc     123     
    12  ijk     147     
    15  opq     852     
    18  tpk     741     
    21  wer     546     
     5  xzy     123      


重复数据每条都显示
/* 查找所有重复数据(重复数据重复显示 */
SELECT 
    t1.* 
FROM
    t1,
    (SELECT 
        t1.name,
        t1.add 
    FROM
        t1 
    GROUP BY `name`,
        `add` 
    HAVING COUNT(1) > 1) AS `t2` 
WHERE `t1`.`name` = `t2`.`name` 
    AND `t1`.`add` = `t2`.`add` 


查询结果如下:


    id  name    add     
------  ------  --------
     1  abc     123     
     2  abc     123     
     4  abc     123     
     6  xzy     456     
     7  xzy     456     
     8  xzy     456     
     9  xzy     789     
    11  xzy     789     
    12  ijk     147     
    13  ijk     147     
    19  tpk     963     
    20  tpk     963     
    21  wer     546     
    22  wer     546     

  • 显示所有数据(重复数据只显示一次)

下面的SQL简单快速有效,但不能保证重复字段的records显示哪一个record。

SELECT 

    * 

FROM

    t1 

GROUP BY NAME 

#having count(*) > 1 #加上这条语句,重复字段的records只显示一次


  • 删除重复数据:

1 最简单快速 的方法:

1. 新建一个一样表结构的表,经重复内容字段设置为unique

2. 然后执行语句:INSERT IGNORE INTO new_table SELECT * FROM old_table

对于本题就是:

1. 新建t1_copy,然后将name,add设置为主键

2.执行INSERT IGNORE INTO t1_copy SELECT * FROM t1 ORDER BY t1.`id`, OK


2 笨方法UNION(数据量大时很慢):

SELECT 
    * 
FROM
    t1 
GROUP BY `name`,
    `add` 
HAVING COUNT(1) > 1 
UNION
SELECT 
    * 
FROM
    t1 
GROUP BY `name`,
    `add` 
HAVING COUNT(1) = 1 
ORDER BY id 



注意:

这里表中有一个主键id,若没有主键id,数据量大时会很慢,这样可以人为插入一个主键id。如

参考文章:


转载请注明出处:http://blog.youkuaiyun.com/acema/article/details/37692867


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值