SQL——查找重复数据/去重
查找重复的电子邮箱
题目来源:力扣182. 查找重复的电子邮箱
要求,编写一个SQL查询查找Person表中所有重复的电子邮箱
Create table If Not Exists Person (Id int, Email varchar(255))
Truncate table Person
insert into Person (Id, Email) values ('1', 'aaa@qq.com')
insert into Person (Id, Email) values ('2', 'aaa@qq.com')
insert into Person (Id, Email) values ('3', 'aaa@qq.com')
方法一:
使用group by 和辅助表
select Email from
(select Email,count(Email) as num
from Person
group by Email) as statistic
where num>1;
方法二:group by 和 having条件
select Email
from Person
group by Email
having(count(Email)>1);
这里需要注意
使用以下语句是错误的,因为 where 子句不能与聚合函数一起使用。
它们的执行顺序:where>group by>having>order by,如果where语句与count()一起使用的时候group by 还没有执行,无法使用counting
select Email
from Person
group by Email
where count(Email)>1;
删除重复电子邮箱
题目来源:力扣196. 删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
方法一:使用delete+子查询
第一步:对Email进行分组,并将最小的id拿出来select min(Id) from person group by Email;
第二步:把它保存为一个虚拟表(select min(Id) from Person group by Email) as need;
第三步:把need表中的id提取出来
select need.id from
(select min(Id) as Id
from Person
group by Email)
as need;
第四步:删除不在need中的id中的数据
delete from Person
delete from Person
where Id
not in
(select need.Id from
(
select min(Id) as Id
from Person
group by Email
)as need
);
方法二:使用表的自连接
DELETE p1 FROM Person p1,
Person p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id
这里需要注意的一个是deletezhong使用表的别名:
参考Mysql DELETE 不能使用别名? 是我不会用!
该题目也不可以使用distinct来解决,关于distinct的文章可参考:
SQL中distinct的用法
参考链接
一只猪的解题思路
删除重复的电子邮箱
上一篇: hadoop架构之BlockPoolManager源码分析讲解
下一篇: 游戏保护大放送之HS
推荐阅读
-
sql查出一张表中重复的所有记录数据
-
sql里将重复行数据合并为一行数据使用逗号进行分隔
-
删除一个表中的重复数据同时保留第一次插入那一条以及sql优化
-
sql2000数据库清除重复数据的二种方法
-
SQL高级应用之同服务器上复制表到另一数据库中并实现去重复
-
pandas 实现将重复表格去重,并重新转换为表格的方法
-
关于mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句的深入理解
-
数据库SQL实战:从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略(题解)
-
PHP二维数组去重的方法(保留各个键值的同时去除重复的项)-- 二维数组的唯一性
-
2020.7.24 一个130行代码的清洗数据的小工具,多种表分类聚合去重补全-zkjs_wang