[SQL]LeetCode NO.182 查找重复的电子邮箱

一、题目

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id 是该表的主键(具有唯一值的列)。
此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。

编写解决方案来报告所有重复的电子邮件。 请注意,可以保证电子邮件字段不为 NULL。

以 任意顺序 返回结果表。

二、示例

 

输入: 
Person 表:
+----+---------+
| id | email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+
输出: 
+---------+
| Email   |
+---------+
| a@b.com |
+---------+
解释: a@b.com 出现了两次。
三、答案

3.1、having +聚合函数

select email 
from Person
group by email
having count(id)>1;

使用了 GROUP BY 将数据按照 email 地址进行分组,并使用聚合函数 COUNT 统计每个分组内 email 地址出现的次数。最后通过 HAVING 子句筛选出出现次数大于 1 的分组,即出现了多次的 email 地址。

3.2、自链接

select DISTINCT p1.Email 
from Person p1, Person p2 
where p1.Email = p2.Email and p1.Id != p2.Id;

通过distinct对数据进行去重,当p1的邮箱在p2中出现,且p1、p2的ID不一致。

3.3、子表查询

select Email 
from (select count(1) as t, Email from Person group by Email) r
where r.t > 1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值