文章目录
- 【LeetCode高频SQL50题-基础版】打卡第5天:第26~30题
- ⛅前言
- 超过5名学生的课
- 🔒题目
- 🔑题解
- 求关注者的数量
- 🔒题目
- 🔑题解
- 只出现一次的最大数字
- 🔒题目
- 🔑题解
- 买下所有产品的客户
- 🔒题目
- 🔑题解
- 每位经理的下属员工数量
- 🔒题目
- 🔑题解
【LeetCode高频SQL50题-基础版】打卡第5天:第26~30题
⛅前言
在这个博客专栏中,我将为大家提供关于 LeetCode 高频 SQL 题目的基础版解析。LeetCode 是一个非常受欢迎的编程练习平台,其中的 SQL 题目涵盖了各种常见的数据库操作和查询任务。对于计算机科班出身的同学来说,SQL 是一个基础而又重要的技能。不仅在面试过程中经常会遇到 SQL 相关的考题,而且在日常的开发工作中,掌握 SQL 的能力也是必备的。
本专栏的目的是帮助读者掌握 LeetCode 上的高频 SQL 题目,并提供对每个题目的解析和解决方案。我们将重点关注那些经常出现在面试中的题目,并提供一个基础版的解法,让读者更好地理解问题的本质和解题思路。无论你是准备找工作还是提升自己的技能,在这个专栏中,你可以学习到很多关于 SQL 的实践经验和技巧,从而更加深入地理解数据库的操作和优化。
我希望通过这个专栏的分享,能够帮助读者在 SQL 的领域里取得更好的成绩和进步。如果你对这个话题感兴趣,那么就跟随我一起,开始我们的 LeetCode 高频 SQL 之旅吧!
- 博客主页💖:知识汲取者的博客
- LeetCode高频SQL100题专栏🚀:LeetCode高频SQL100题_知识汲取者的博客-CSDN博客
- Gitee地址📁:知识汲取者 (aghp) - Gitee.com
- 题目来源📢:高频 SQL 50 题(基础版) - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
超过5名学生的课
🔒题目
题目来源:596.超过5名学生的课
🔑题解
- 考察知识点:
group by
、having
、count
select class
from Courses
group by class
having count(*) >= 5;
求关注者的数量
🔒题目
题目来源:1729.求关注者的数量
🔑题解
- 考察知识点:
count
、group by
、order by
select user_id, count(*) followers_count
from Followers
group by user_id
order by user_id asc;
order by 默认排序就是 asc,所以这里的 acs 可以直接省略
只出现一次的最大数字
🔒题目
题目来源:619.只出现一次的最大数字
🔑题解
- 考察知识点:
max
、group by
、having
、子查询
1)首先审题,我们明确我们需要从只出现一次的数字中,选出一个最大的,所以我们可以先查询出只出现一次的数字
select num, count(*) total
from MyNumbers
group by num
having total = 1;
| num | total |
| --- | ----- |
| 1 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 1 |
2)只要我们查询出了单个出现的数字,剩下的就很简单的,直接使用 max
过滤出最大值即可
select max(num) num
from (select num, count(*) totalfrom MyNumbersgroup by numhaving total = 1
) single;
还有一种写法,不使用子查询,使用 排序+分页来实现
温馨提示:更加推荐第一种使用 max+子查询 的方式来获取最大的单个数字,因为 max+子查询 方式更加通用,可读性、性能更高
1)直接编写下面一个SQL即可,但是需要对结果进行处理
select num, count(num) total
from MyNumbers
group by num
having total = 1
order by num desc
limit 1;
| num | total |
| --- | ----- |
| 6 | 1 |
2)但是要使用 if
处理一下这个 total
select if(count(num)=1, num, 0) total
from MyNumbers
group by num
order by total desc;
| total |
| ----- |
| 6 |
| 5 |
| 4 |
| 1 |
| 0 |
| 0 |
3)此时我们把 total 换成 num 即可,再加一个 limit
select if(count(num)=1, num, 0) num
from MyNumbers
group by num
order by num desc
limit 1;
| num |
| --- |
| 0 |
嘿嘿,看到这个结果很让人惊讶,为什么 limit 得到的是0,而不是6???
问题原因:😫这个问题害我想了好久,结果发现是LeetCode的在线SQL编译器问题
解决方法:
select if(count(num)=1, num, null) num
from MyNumbers
group by num
order by num desc
limit 1;
买下所有产品的客户
🔒题目
题目来源:1045.买下所有产品的客户
🔑题解
- 考察知识点:
1)审题,我想要计算出购买所有产品的用户,我的想法是先计算出产品的数量,然后判断一下用户的数量是否等于产品的总数,相等则说明这个用户购买了所有的产品
select customer_id
from Customer
group by customer_id
having count(customer_id) = (select count(*) from Product);
2)结果运行报错了,因为我没有认真审题,Customer表中可能存在重复的记录,因为一个用户可能多次购买同一个产品,对上面的代码作出更正,因为我们已经进行了分组,我们 只需要计算出分组后每一个用户的产品数量即可(注意需要去重)
select customer_id
from Customer
group by customer_id
having count(distinct product_key) = (select count(*) from Product);
每位经理的下属员工数量
🔒题目
题目来源:1731.每位经理的下属员工数量
🔑题解
- 考察知识点:
自连接
、avg
、count
、round
1)首先审题,我们可以通过自连接将相关联的两条记录变为一条,这样就好进行后面的逻辑处理了
select *
from Employees e1 join Employees e2 on e1.employee_id = e2.reports_to;
| employee_id | name | reports_to | age | employee_id | name | reports_to | age |
| ----------- | ----- | ---------- | --- | ----------- | ----- | ---------- | --- |
| 9 | Hercy | null | 43 | 6 | Alice | 9 | 41 |
| 9 | Hercy | null | 43 | 4 | Bob | 9 | 36 |
2)然后对上表进行操作,即可得到正确的结果了
select e1.employee_id, e1.name, count(e2.reports_to) reports_count, round(avg(e2.age), 0) average_age
from Employees e1 join Employees e2 on e1.employee_id = e2.reports_to
group by e1.employee_id
order by e1.employee_id;