mysql进阶学习-查找删除重复行

如何查找重复行

首先,我们新建一个测试表,然后插入一些重复数据,一些不重复数据

create table test
(
    id  int  not null primary key,
    day date not null
);

insert into test(id, day)
    value (1, '2006-10-08'),
    (2, '2006-10-08'),
    (3, '2006-10-09');

insert into test(id, day)
values (4, '2006-10-08');

查询结果:
在这里插入图片描述
我们发现,id为1,2,4为重复行。现在我们将具有相同day字段值的行归为一组,然后计算组的大小。

select day, count(*)
from test
group by day
having count(*);

运行结果:
在这里插入图片描述
然后,如果我们希望只显示重复行,必须使用having子句

select day, count(*)
from test
group by day
having count(*) > 1;

在这里插入图片描述

为什么不能使用where子句?

因为where子句过滤的是分组之后的行,having子句过滤的是分组之后的行

如何删除重复行

这里,我们的任务是:删除所有重复行,除了分组id字段具有最小值的行。因此,需要找出大小大于1的分组,以及希望保留的行。你可以使用min()函数,这里的语句是创建临时表,以及查找需要用DELETE删除的行

create temporary table to_delete
(
    day    date not null,
    min_id int  not null
);

insert into to_delete(day, min_id)
SELECT day, min(id)
from test
group by day
having count(*) > 1;

select *
from to_delete;

在这里插入图片描述
有了这些数据,你可以开始删除“脏数据”行了。

delete
from test
where exists(
              select *
              from to_delete
              where to_delete.day = test.day
                and to_delete.min_id <> test.id
          );

然后再查看具有脏数据的表格,预期结果只剩1和3

select *
from test;

查询结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值