mysql删除重复数据仅仅保留一条——学习笔记

本文介绍了一种使用SQL去除数据库表中重复记录的方法。通过多个步骤,包括定位重复数据、提取这些数据的ID、选择每组数据中的特定ID并最终删除不需要的重复项,实现了数据清洗的目的。

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

1、创建表并且插入数据

create table `test` (
	`id` int (11),
	`name` varchar (765),
	`address` varchar (765)
); 
insert into `test` (`id`, `name`, `address`) values('1','aa','cc');
insert into `test` (`id`, `name`, `address`) values('2','aa','cc');
insert into `test` (`id`, `name`, `address`) values('3','aa','cc');
insert into `test` (`id`, `name`, `address`) values('4','bb','cc');
insert into `test` (`id`, `name`, `address`) values('5','bb','cc');
insert into `test` (`id`, `name`, `address`) values('6','a','1');
insert into `test` (`id`, `name`, `address`) values('7','b','2');

2、根据nameaddress作为重复数据的字段条件

SELECT `name`,`address`,COUNT(*) AS '重复条数'  
FROM `test` 
GROUP BY `name`,`address` 
HAVING COUNT(*)>1

在这里插入图片描述

HAVING COUNT(*)>1 分组后将组内数据条数大于1的筛选出来

3、获取到重复数据的id集合

SELECT id FROM `test` a 
	WHERE (a.`name`,a.`address`) 
	IN (
		SELECT `name`,`address` FROM `test` 
		GROUP BY `name`,`address` 
		HAVING COUNT(*)>1
	)

在这里插入图片描述
4、从分组中取出每一组数据的一个最大或者最小id(最大、最小id对于聚合函数中的max和min)

SELECT MIN(`id`) 
FROM `test`
GROUP BY `name`,`address` 
HAVING COUNT(*)>1

在这里插入图片描述
5、查询出需要删除的数据

思路:表中数据的id属于重复字段中的id,但是又不是(最小和最大id),得到的id就是需要删除的数据

SELECT *  FROM `test` WHERE `id`  
	IN (SELECT id FROM `test` a WHERE (a.`name`,a.`address`) 
	
	IN (SELECT `name`,`address` FROM `test`
		GROUP BY `name`,`address` HAVING COUNT(*)>1)) 
	AND `id` NOT IN (SELECT MIN(`id`) FROM `test`GROUP BY `name`,`address` HAVING COUNT(*)>1)

在这里插入图片描述
6、将得到的数据进行删除

这里需要将得到的数据做为另一张表进行条件删除

DELETE FROM `test` WHERE `id`  IN (
	SELECT `id` FROM(
	
	SELECT *  FROM `test` WHERE `id`  
	IN (
		SELECT id FROM `test` a WHERE (a.`name`,a.`address`) IN 
		   (SELECT `name`,`address` FROM `test`
		    GROUP BY `name`,`address` HAVING COUNT(*)>1)
		) 
	AND `id` NOT IN (
		SELECT MIN(`id`) FROM `test`GROUP BY `name`,`address` HAVING COUNT(*)>1)
	)
	 AS a
)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值