182. 查找重复的电子邮箱

0 阅读1分钟

image.png

1. SQL 基础:分组与聚合函数

  • GROUP BY 子句:按 email 字段对表进行分组,将相同邮箱的记录归为一组。
  • COUNT() 聚合函数:统计每组中邮箱出现的次数。
  • HAVING 子句:对分组后的结果进行过滤,筛选出出现次数大于 1 的邮箱(注意:WHERE 不能直接过滤聚合结果,必须用 HAVING)。

2. 表结构与约束理解

  • Person 包含主键 id(唯一标识每条记录)和 email 字段(存储邮箱,非空且无大写)。
  • 需求是找出重复出现的邮箱,即同一 email 对应多条记录。

3. 结果集处理

  • 最终输出仅包含重复的 email 列,列名可自定义(如示例中的 Email)。
  • 结果顺序不做要求,符合 SQL 标准的任意顺序均可。

典型实现思路

sql

-- 方法1GROUP BY + HAVING
SELECT email AS Email
FROM Person
GROUP BY email
HAVING COUNT(email) > 1;

-- 方法2:自连接(JOINSELECT DISTINCT p1.email AS Email
FROM Person p1
JOIN Person p2
ON p1.email = p2.email AND p1.id != p2.id;

延伸知识点 💡

  • DISTINCT 关键字:在自连接方法中用于去重,避免同一邮箱重复输出。
  • 聚合函数过滤规则WHERE 用于过滤行,HAVING 用于过滤分组后的聚合结果。
  • 主键特性id 唯一,因此可通过 p1.id != p2.id 排除同一条记录的自匹配。