🎈写在前面
🙋♂️大家好呀,我是超梦。小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟【数据库】打交道的,为了更好的操作数据库,我们的SQL【知识储备】是必不可少的。想要掌握好SQL,那少不了每天的练习与学习。接下来小梦会带领小伙伴们一起每天刷一道LeetCode-数据库(SQL)相关的题目,然后在文章后例举相关知识点帮助小伙伴们学习与巩固,更好的掌握SQL。
🙋♂️ 小伙伴们如果在学习过程中有不明白的地方,欢迎评论区留言提问,小梦定知无不言,言无不尽。
目录
🍕题目概述
🍕解题思路
🍟方法1
🍟方法2
🍟方法3
🍕代码执行测试
🍟方法1
🍟方法2
🍟方法3
🍕知识点小结
🍕题目概述
题目:
编写一个 SQL 查询,查找
Person
表中所有重复的电子邮箱。Person表
+----+---------+ | Id | Email | +----+---------+ | 1 | a@b.com | | 2 | c@d.com | | 3 | a@b.com | +----+---------+
根据以上输入,你的查询应返回以下结果:
+---------+ | Email | +---------+ | a@b.com | +---------+
🍕解题思路
其实这道题很简单啦,相信小伙伴们心中已经知道该怎么做了,赶紧去LeetCode挥笔写下答案测试一番吧!!测试完可以再看看小梦与大家的思路是否一致呢,如果有多种思路,欢迎留言写下你们的思路与解法,大家互相学习学习~
根据题意,要找出表中所有重复的电子邮箱,也就是Email字段对应的数据有重复的我需要查找出来。那我们可以使用count函数来获取Email中各电子邮箱的数量,只要数量大于1就是题目中要求的。接下来,根据该思路,小梦列出一下三种解法,小伙伴们如果有其它思路,欢迎补充~
🍟方法1
我们可以先查出Email和对应Email的个数,把查出的内容当作一个临时表,在通过查该临时表,找出Email数量大于的1的,这样我们就查找出了题目所要求的【找出表中所有重复的电子邮箱】。
题解:
select Email from (select Email, count(Email) as num from Person group by Email) as temporary where num > 1;
🍟方法2
我们可以通过group by对Email进行分组,然后通过having进行条件筛查,having后面可以运用聚合函数非常方便(知识点小结部分会有group by与having的简单讲解,小伙伴们记得查阅哦~)。通过聚合函数count(Email)在having后进行条件筛查,找出Email个数大于1的,这样我们就查找出了题目所要求的【找出表中所有重复的电子邮箱】。
题解:
select Email from Person group by Email having count(Email) > 1;
🍟方法3
第三种方法大家可以发散一下思维,如果不用count函数怎么知道重复的Email呢?怎么查呢?小梦来带小伙伴们一起思考,首先我们可以想想,前两种方法实质上都是通过查出Email数判断是否大于1,大于1就是我们所要的答案,不大1就不是。那大家有没有注意表Person虽然Email有重复的,但是id是唯一的,那我们就可以把Person表看成两张表,一张a表和一张b表。连接两张表,where语句后面加上a表的Email等于b表的Email和a表的id不等于b表的id。然后查询Email做去重操作,就得到了我们想要的答案。
题解:
select distinct a.Email from Person a,Person b where a.Email = b.Email and a.id <> b.id;
🍕代码执行测试
🍟方法1
select Email from
(select Email, count(Email) as num from Person group by Email) as temporary
where num > 1;
输入题解,进行测试
测试成功!
🍟方法2
select Email from Person group by Email having count(Email) > 1;
输入题解,进行测试
测试成功!
🍟方法3
select distinct a.Email from Person a,Person b where a.Email = b.Email and a.id <> b.id;
输入题解,进行测试
测试成功!
🍕知识点小结
通过今天这一道题,小梦觉得有个知识点是需要简单分享一下的,那就是gruop by子句和having子句。group by与having的语法什么的小梦在这里就不一一细说了,小梦简单说一下group by与having在使用时一些需要注意的地方,希望小伙伴们用心记下来,绝对有用!
GROUP BY(数据分组)与HAVING子句
SQL中的数据可以按列名分组,可以搭配聚合函数一起使用,方便我们对于数据的查询与获取。
例:
SELECT count(stuname) FROM student GROUP BY student_class;
使用GROUP BY分组语句可以与WHERE语句一起使用,当然这里有个非常重要的地方希望小伙伴们记下来,非常重要!->当一条SQL中有聚合函数,WHERE语句,GRUOP BY语句时,他们的执行顺序是怎么的呢?WHERE >GROUP BY>聚合函数。
所以在WHERE语句执行过滤条件中我们不能使用聚合函数,使用的话就会报错,在这我们可以使用HAVING子句执行过滤条件筛查时使用聚合函数。小伙伴们一定要记住!
最后呢小梦再分享一下SQL查询语句各关键字的执行顺序,可以拿小本本记一下了,有用的很~
【重点】SQL的执行顺序:
- 先执行FROM
- 再执行WHERE条件过滤
- 再执行GROUP BY分组
- 再执行SELECT,聚集函数
- 再执行HAVING条件过滤
- 再执行ORDER BY 排序