LeetCode #查找重复的电子邮箱

102 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第43天,点击查看活动详情

一、题目

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

示例:

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

+---------+
| Email   |
+---------+
| a@b.com |
+---------+

说明:所有电子邮箱都是小写字母。

二、解题思路

创建数据表

根据题意创建数据表,并填充数据

CREATE TABLE IF NOT EXISTS Person (
	id INT, 
	email VARCHAR(255)
);

INSERT INTO Person VALUES
(1, 'a@b.com');
(2, 'c@d.com');
(3, 'a@b.com');

解题

  • 根据题意这里要查询表中重复的数据,这里要处理emial的计算
  • 第一种方式,先以email为分组,计算email的数量并设置假名,把得到的值作为假表,再次进行查询,这时,查询数量大于1的数据
  • 第二种,还是以email数据为分组,这里不在使用第一种方式,这里使用常规的group by 后跟 having 进行再一次的数据处理,使用count 判断大于1的用户
  • 最后,执行语句
SELECT email FROM (
	SELECT 
	  email, COUNT(email) num
	FROM
	  Person
	GROUP BY email
) emilnum
WHERE num > 1;

SELECT 
  email
FROM
  Person
GROUP BY email
HAVING COUNT(email) > 1;

  • 显示结果

image.png

三、执行语句

第一种测试结果

image.png

group+ having

image.png

四、总结

  • group by: 该语法通过一定规则将一个数据集分成多个数据集,然后再分块处理,select 后需要跟count(),sum(),avg等函数
  • having: having语句通常与group by 语句联合使用,用于过滤group by语句返回的记录集。该语句弥补了where 关键字不能与聚合函数联合使用的不足,haveing后可以根count()或者sum() 之类的聚合函数。
  • count(): 该函数也是一个聚合函数,用于统计数据
    • count(1): 计算不为NULL的记录
    • count(*): 计算所有的记录包括null
    • count(字段): 统计该字段不为null的记录
    • count(distinct 字段): 统计该字段去重后且不为null的记录

本题比较简答,主要解决数组的第二次处理问题,在已经分组的情况下,如果在进行深一步的处理,这里创建假表是一种方式,在group by 后使用having再处理也是一种方式。