MySQL leetcode刷题 (1):182.查找重复的电子邮箱

题目描述

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

示例:

±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+
根据以上输入,你的查询应返回以下结果:

±--------+
| Email |
±--------+
| [email protected] |
±--------+
说明:所有电子邮箱都是小写字母。

解题过程:

看到这道题目我一开始是拒绝的…老子没学过SQL啊!!!
不过历史上无数屌丝逆袭的经历都告诉我,只要有心,办法总比困难多
于是bing搜索,mySQL教程,嗯,菜鸟教程告诉我应该这么学mySQL:
mySQL需要HTML和PHP基础知识
PHP需要HTML和CSS基础知识
总结下:我想今日解出这道题是不可能的了,除非一天学完HTML,PHP,CSS和mySQL
正当绝望之际,我看到了豆瓣这样一篇文章:适合没有任何基础的Mysql初学者学习
作者所说的学习方法一下子击中了我:“一件事情先找到方法给干掉,先知道怎么用,再系统的看书学习。”——这不就是扎克伯格搭建facebook网页时所用的方法么!!!
查阅资料后直接上代码:

SELECT Email
FROM Person
GROUP BY email having count(1)>1

注意此处我GROUP BY后面那个“email”,即使和原表头大小写不统一,输出表头仍然为“Email”。(linux大小写敏感,而windows大小写不敏感,说实话我觉得数据库这么重要的东西,大小写不敏感容易出问题,或许是开发人员另有打算吧)

总结:

  1. SELECT column_name
    FROM table_name
    为基础检索语法
  2. GROUP BY 为分组
  3. HAVING字句可以让我们筛选成组后的各种数据,WHERE字句在聚合前先筛选记录,也就是说作用在GROUP BY和HAVING字句前,而 HAVING子句在聚合后对组记录进行筛选
  4. COUNT()函数是用来统计表中记录的一个函数,返回匹配条件的行数;COUNT(1)>1 表示在分成新的Email组后,找到重复的邮箱
  5. COUNT(1)和COUNT(*)没有区别,都是扫描主键进行计数

参考文献:

http://www.w3school.com.cn/sql/sql_groupby.asp GROUP BY用法
https://blog.csdn.net/love_xsq/article/details/42417917 HAVING用法
http://www.w3school.com.cn/sql/sql_func_count.asp COUNT用法
https://www.jb51.net/article/136212.htm count(*)、count(1)和count(col)的区别汇总

你可能感兴趣的:(sql刷题,leetcode)