1. SQL 基础:分组与聚合函数
GROUP BY子句:按email字段对表进行分组,将相同邮箱的记录归为一组。COUNT()聚合函数:统计每组中邮箱出现的次数。HAVING子句:对分组后的结果进行过滤,筛选出出现次数大于 1 的邮箱(注意:WHERE不能直接过滤聚合结果,必须用HAVING)。
2. 表结构与约束理解
- 表
Person包含主键id(唯一标识每条记录)和email字段(存储邮箱,非空且无大写)。 - 需求是找出重复出现的邮箱,即同一
email对应多条记录。
3. 结果集处理
- 最终输出仅包含重复的
email列,列名可自定义(如示例中的Email)。 - 结果顺序不做要求,符合 SQL 标准的任意顺序均可。
典型实现思路
sql
-- 方法1:GROUP BY + HAVING
SELECT email AS Email
FROM Person
GROUP BY email
HAVING COUNT(email) > 1;
-- 方法2:自连接(JOIN)
SELECT 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排除同一条记录的自匹配。