LeetCode:182.查找重复的电子邮箱

题目链接:https://leetcode-cn.com/problems/duplicate-emails/

题目

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

示例:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/duplicate-emails
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

---- oracle ----
/* Write your PL/SQL query statement below */
select Email
from Person
group by Email
having count(Email) > 1  ---- 2741ms
---- oracle ----
/* Write your PL/SQL query statement below */
select Email
from Person
group by Email
having count(1) > 1 ---- 1012ms
---- oracle ----
/* Write your PL/SQL query statement below */
select Email
from
(
    select Email, count(1) as cnt
    from Person
    group by Email
) b
where b.cnt > 1 ---- 564ms

思考

一样的代码,一样的提交,不一样的速度?

是不是跟网速有关?

Oracle & MySQL都不能放弃,都要学习,虽然常用语法相同,但某些具体函数的用法还是不太一样,必须掌握。

结论:使用group byhaving,记得优先顺序。

注意事项

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