LeetCode每天一题

182.查找重复的电子邮箱

题目:

182. 查找重复的电子邮箱

难度简单207

SQL架构

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

示例:

1
2
3
4
5
6
7
+----+---------+
| Id | Email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+

根据以上输入,你的查询应返回以下结果:

1
2
3
4
5
+---------+
| Email |
+---------+
| a@b.com |
+---------+

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

解题思路

这个题一看好像很简单呀,解题思路就是,查询Email并查出Email的出现多次的邮箱。如何查询出现多次呢?肯定要用函数count()了。

但是怎样写sql语句呢?where里面是不能使用聚合函数的哦,那该咋办呢?

这里就需要了解一个having!!!

我们先看一下:

where和having的概述

“Where” 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数。

“Having”是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。

where和having的区别

1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数。
2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

结论

1.当分组筛选的时候 用having

2.其它情况用where
-—————————————————-
用having就一定要和group by连用,
用group by不一有having (它只是一个筛选条件用的)

只要条件里面的字段, 不是表里面原先有的字段就需要用having

SQL在查询表的时候先把查询的字段放到了内存里,而where查询的时候是从表里面查的,其余需要用having

注:

上面的文章复制使用了 oathevil老哥的这篇文章https://blog.csdn.net/oathevil/article/details/5521757

答案解析

1
2
3
4
5
6
7
8
9
10
11
12
# Write your MySQL query statement below
select Email
from Person
group by Email
having count(Email)>1;

输入
{"headers": {"Person": ["Id", "Email"]}, "rows": {"Person": [[1, "a@b.com"], [2, "c@d.com"], [3, "a@b.com"]]}}
输出
{"headers": ["Email"], "values": [["a@b.com"]]}
预期结果
{"headers": ["Email"], "values": [["a@b.com"]]}
点击查看
-------------------本文结束 感谢您的阅读-------------------