MySQL查找并且删除表中重复的字段

MySQL查找并且删除表中重复的字段
如果我们的数据表中出现了重复记录,且数据量比较庞大时,通过逐个浏览的方式删除重复记录是不现实的,那么我们如何查找且删除表中的重复字段呢?
一、我们先创建一张表,创建表的过程不再赘述,表的名称为emp2,表的内容如下:
select * from emp2 ORDER BY name
这里写图片描述
创建好的表如上图,这里面的name字段有重复记录,分别是aa有3条,bb有2条。
二、首先要查找出有哪些重复字段
在数据表比较少时我们可以采用查找全部数据,并且通过用排序的方式将重复字段找出,但数据量比较大时这种方式不可取。我们可以采用分组函数找出重复的字段。查询的结果如下,这些就是有重复记录的数据。
select * from emp2 group by name having count(id) > 1
这里写图片描述
查得的结果是名字aa、bb有重复记录,我们也可以采用如下语句查出有几条重复的记录
select , count() ‘count’ from emp2 group by name having count(*) > 1
这里写图片描述
三、显示有重复字段的所有记录
select * from emp2 where name in (select name from emp2 group by name having count(id) > 1) order by name
这里写图片描述
这样就查出了所有有重复字段的记录,没有重复记录的不显示
四、删除重复的记录,只留下记录号最小的记录。
我们再看下第二步的结果,分组查到的结果只显示最小行号的记录,这样我们就只保留这个号就可以,我们的思路就可以这样,删除掉那行名字在分组函数中查到的名字,且id不为此id的记录,sql语句如下:
delete e.* from emp2 e
where e.id not in (select e1.id from emp2 e1 group by e1.name having count(e1.name)>1)
and e.name in (select e2.name from emp2 e2 GROUP BY e2.name having count(e2.name)>1)
但结果为:
[Err] 1093 - You can’t specify target table ‘e’ for update in FROM clause
大概意思是说:你不能将目标表用在from语句中用于更新操作。实际上就是where后面的表不能与from后面的表相同,那这种写法就行不通,既然这样不行,我们就换另一个写法,将查询的结果作为临时表与要删除记录的表连接,如下:
delete e.*
from emp2 e inner join (select e2.id, e2.name from emp2 e2 group by e2.name having count(e2.id) > 1) t
where e.id != t.id and e.name = t.name
执行后再进行查询,(注意,这里一定要用内连接,不用能外链接,具体原因大家select一下就清楚了)
select * from emp2 ORDER BY name DESC
这里写图片描述
结果如上图,删除成功。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值