查找重复的邮箱:GROUP BY + HAVING
LeetCode 182 · 分组计数、HAVING
面试怎么回答
按 Email 分组后用 HAVING COUNT(*) > 1 过滤。WHERE 作用在分组前、HAVING 作用在分组后,聚合条件只能写在 HAVING。真实数据里我还会先统一大小写和去空格,否则会漏判重复。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
找出人员表里出现了不止一次的邮箱,每个重复邮箱输出一次。
表结构
- Person:Id(主键)、Email
思路
按邮箱分组,组内行数大于 1 的就是重复邮箱。对分组结果的过滤要用 HAVING,WHERE 只能过滤分组前的原始行。
参考解法
select Email
from Person
group by Email
having count(*)>1
易错点
- 把
COUNT(*) > 1写在 WHERE 里会报错,聚合结果只能在 HAVING 里过滤。 - 实际业务里邮箱大小写、首尾空格不一致也算重复,要先 LOWER/TRIM 再分组。