先创建一张测试表Test(id,name,age)。
添加 4条测试数据,其中Name 小明有3个,Name 小明 Age12 重复了一次。
一、GROUP BY查找重复数据
单字段查找:按Name查找
select * from Test t where t.Name in(select s.name from test s group by s.name having count(*)>1)
Name为小明的数据都被查找出来了。由于可能是同名但年龄不同的两个人,即Name 小明 Age 12和Name 小明 Age 14是两个人,所以需要根据Name和Age两个字段查重复。
多个字段查找:按Name 和Age查找
select * from Test t where (t.name,t.age) in(select s.name,s.age from test s group by s.name,s.age having count(*)>1)
二、GROUP BY删除多余的重复数据
单字段判断:
由于ID是唯一的,而id 1,3,4全是NAME为小明重复了,现在要删除重复的数据,只保留一条Name为小明的数据,这里我需要保存ID最大的那条数据。
delete from Test t
where t.Name in
(select s.name from test s group by s.name having count(*) > 1)
and t.id not in
(select max(id) from test group by name having count(*) > 1)
也可以多次执行下列语句来得到结果:
delete from Test t
where t.id in
(select min(id) from test s group by s.name having count(*) > 1)
执行后,查看表
Name为小明的数据只留下了ID最大的。
多字段判断:
还是保留ID最大的
delete from Test t
where (t.name, t.age) in (select s.name, s.age
from test s
group by s.name, s.age
having count(*) > 1)
and t.id not in (select max(id)
from test s
group by s.name, s.age
having count(*) > 1)
ID1与4重复,ID为1的被删除了