携手创作,共同成长!这是我参与「掘金日新计划 · 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;
- 显示结果
三、执行语句
第一种测试结果
group+ having
四、总结
- 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再处理也是一种方式。