MySQL之LeetCode-182(查找重复的电子邮箱)

本文提供三种SQL查询方法,用于从Person表中找出所有重复的电子邮箱,包括使用子查询、group by与having以及自连接的方式,每种方法都有其适用场景和性能考量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目(简单)

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

示例:

±—±--------+
| Id | Email |
±—±--------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
±—±--------+
根据以上输入,你的查询应返回以下结果:

±--------+
| Email |
±--------+
| a@b.com |
±--------+
说明:所有电子邮箱都是小写字母。

解题语句

使用子查询

SELECT
  t.Email
FROM
  (SELECT
    p.Email,
    SUM(
      CASE
        WHEN p.Email = pe.Email
        THEN 1
      END
    ) AS num
  FROM
    Person AS p,
    (SELECT DISTINCT
      Email
    FROM
      Person) AS pe
  GROUP BY p.Email) AS t
WHERE t.num > 1

这里的思路可以分为三步:

  1. 先找出所有的邮箱(去重)
  2. 计算出每个邮箱出现的次数(计数)
  3. 筛选出出现次数大于一的(筛选)

使用 group by 与 having

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

这种方式比较推荐

使用自连接

select distinct 
       a.email as Email 
from 
       person a ,
       person b 
where 
       a.id<>b.id 
       and a.email=b.email;

这种方式在数据量多的情况下性能应该不好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值