查找重复的邮箱
一、题目
表:
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 Email from
(select Email, count(Email) as numfrom Persongroup by Email
) as statistic
where num > 1
;
三、解题思路
1.子查询部分:
select Email, count(Email) as num
from Person
group by Email
(1)这部分是一个子查询,它的功能是统计每个邮箱地址在表中出现的次数
(2)group by Email 表示按照邮箱地址进行分组,将相同的邮箱地址归为一组
(3)count(Email) as num 表示计算每个分组中邮箱地址的出现次数,并将这个计数结果命名为 num
(4)子查询的结果会形成一个临时表,包含两列:Email(邮箱地址)和 num(出现次数),并通过 as statistic 给这个临时表起了个别名
2.主查询部分:
select Email from [子查询] where num > 1
(1)主查询从子查询生成的临时表中筛选数据
(2)where num > 1 表示只选择那些出现次数(num)大于 1 的记录
(3)最终返回这些符合条件的邮箱地址(Email)
四、总结
先按邮箱地址分组,统计每个邮箱出现的次数
再从统计结果中找出出现次数超过一次的邮箱地址