3 查找重复的电子邮箱(having与where区别,distinct去重使用)
表: Person
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
id 是该表的主键(具有唯一值的列)。
此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。
编写解决方案来报告所有重复的电子邮件。 请注意,可以保证电子邮件字段不为 NULL。
以 任意顺序 返回结果表。
结果格式如下例。
示例 1:
输入:
Person 表:
+----+---------+
| id | email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+
输出:
+---------+
| Email |
+---------+
| a@b.com |
+---------+
解释: a@b.com 出现了两次。
解答:
select a.email as Email
from
(select *,count(email) as num
from Person
group by email) as a
where num > 1;
对表先进行分组聚合出一张新表,新表再进行筛选,因为group by不能与count在一张表里使用
select Person.email as Email
from Person
group by email
having count(email)>1;
想要不新建一张表节约计算时间,使用having 他与 where不同可以与count一起使用
select distinct a.email as Email
from Person as a , Person as b
where a.id != b.id and a.email = b.email;
更快的一种计算方法,复制出来一张表,id不同,Email相同,有多少条就会筛选出多少条,对Email进行去重,去重使用 distinct