182. 查找重复的电子邮箱
编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。
示例:
±—±--------+
| Id | Email |
±—±--------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
±—±--------+
根据以上输入,你的查询应返回以下结果:
±--------+
| Email |
±--------+
| a@b.com |
±--------+
说明:所有电子邮箱都是小写字母。
SELECT distinct //在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。DISTINCT 关键词用于返回唯一不同的值。
a.Email
FROM
Person as a,
Person as b
WHERE
a.Id!=b.Id AND a.Email = b.Email
官方解题
使用GROUP BY和临时表
算法
重复的电子邮箱存在多次,要计算每封电子邮件的存在次数,可以使用如下代码
select Email ,count(Email) as num
from Person
group by Email;
num | |
---|---|
a@b.com | 2 |
c@d.com | 1 |
此表作为临时表,可以得到下面的解决方案
select Email from
(
select Email, count(Email) as num
from Person
group by Email
)
as statistic //用作临时表, 必须命名
where num > 1;
使用 GROUP BY 和 HAVING 条件
向 GROUP BY 添加条件的一种更常用的方法是使用 HAVING 子句,该子句更为简单高效。
所以我们可以将上面的解决方案重写为:
select Email
from Person
group by Email
having count(Email) > 1;