查找重复的电子邮件

编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。

示例:

1
2
3
4
5
6
7
+----+---------+
| Id | Email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+

根据以上输入,你的查询应返回以下结果:

1
2
3
4
5
+---------+
| Email |
+---------+
| a@b.com |
+---------+

说明:所有电子邮箱都是小写字母。

解题思路:

  1. 判定两者邮箱一样,但是id又不一样的邮箱
    • 查找两个邮箱相同的email
    • 同时两者的Id不一致
  2. 使用 GROUP BY 和临时表
    • 使用count函数和GROUP BY统计电子邮件的存在次数
    • 以此作为临时表,获取存在次数大于1的电子邮件
  3. 使用GROUP BYHAVING条件

代码:

判定两者邮箱一样,但是id又不一样的邮箱

1
2
3
4
5
6
SELECT DISTINCT p1.Email
FROM Person p1,Person p2
WHERE
p1.Email=p2.Email
AND
p1.Id != p2.Id

需要借助ID

全表扫描

使用 GROUP BY 和临时表

1
2
3
4
5
SELECT Email FROM
(SELECT Email, COUNT(Email) AS num
FROM Person
GROUP BY Email) AS statistic
WHERE num > 1

全表扫描

使用GROUP BYHAVING条件

1
2
3
4
SELECT Email
FROM Person
GROUP BY Email
HAVING COUNT(Email) > 1

较第二种方法更为高效