MySQL中删除重复行

1、重复行的定义

在数据库的表中,往往会有重复的数据行,什么是重复的数据行,这个要根据具体业务而定。如下表:

在这里插入图片描述

这里将name和address都相同的定义为相同的数据行,现在想要去掉重复的数据行,只保留一条数据行,去掉其余相同的行。比如name为陆小凤address为藏剑山庄的有3条相同记录,想要删掉其余2条重复的,注意,这里用的数据库是MySQL,下面将演示如何去掉重复数据。

2、找出重复数据行

我们可以先找出重复的数据行,SQL如下:

select 
name,address
from d8
group by name,address

因为group by是默认做了一次distinct操作的,按照name和address进行分组,name和address都相同的记录只会显示一条,查询结果如下:

在这里插入图片描述
可以看到,陆小凤和叶孤城的记录只显示出一条。在以上SQL的基础上加having过滤语句,就可以找出重复的记录,SQL如下:

select 
name,address
from d8
group by name,address
having count(name)>1 and count(address)>1;

having过滤的条件是name相同和address相同,这两个条件同时满足才定义为重复行,所以用了and连接,所以过滤的条件为:count(name)>1 and count(address)>1。查询结果如下:

在这里插入图片描述
可以看到,正确的找出了重复的数据行。找出重复的数据行后可以进一步的查看id,这里查看最小id,修改上面的SQL,如下:

select 
min(id)
from d8
group by name,address
having count(name)>1 and count(address)>1;

查询结果如下:
在这里插入图片描述
可以看到只保留了重复记录的最小id,那么下面可以利用查出来的最小id来进行删除,修改以上SQL,如下:

select 
min(id)
from d8
group by name,address;

查询结果如下:

在这里插入图片描述
可以对比一下原表,这里只看id,SQL如下:

在这里插入图片描述

3、删除重复行

可以看到id为5、6、8的数据行没有显示出来,而恰巧是重复的数据行,也就是说重复的数据行的id不在查询结果集中,那么可以考虑用not in来实现删除,SQL如下:

delete from d8 where id not in(
select id
from d8 
group by name,address
);

执行的时候报出了一条错误:

在这里插入图片描述
因为MySQL是不支持子查询的同时update一个表的,所以这里不能这么写,所以考虑采用建立临时表,如下:

create TEMPORARY table to_delete(
min_id int not null,
name varchar(11) not null,
address varchar(11) not null
);

然后将查询的结果插入到临时表中,如下:

insert into to_delete(min_id,name,address)
 select min(id),name,address
 from d8
 group by name,address;

查看临时表中记录,SQL如下:
在这里插入图片描述
然后用临时表做关联来做删除,SQL如下:

delete from d8 where id not in(
 select min_id from to_delete
);

执行成功,然后再查询一下原表,结果如下:

在这里插入图片描述
可以看到, name和address都相同的数据行只保留了一行,而其他相同的数据行删掉了,那么到这里删除相同行就成功了。当然,肯定有其他的方法删除,这里就不做讨论了。

一起学习,一起进步,每天只要进步一点点,时间久了,就是质的飞跃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值