【LeetCode高频SQL50题-基础版】打卡第5天:第26~30题

本文介绍了LeetCodeSQL高频题目的基础版解析,涵盖知识点如groupby、having、count、max和自连接等。通过实例解析5道题目,包括查找超过5名学生的课程、关注者数量、只出现一次的最大数字、买下所有产品的客户和每位经理的下属员工数量,旨在帮助读者提升数据库操作技能。
摘要由CSDN通过智能技术生成

【LeetCode高频SQL50题-基础版】打卡第5天:第26~30题

⛅前言

  在这个博客专栏中,我将为大家提供关于 LeetCode 高频 SQL 题目的基础版解析。LeetCode 是一个非常受欢迎的编程练习平台,其中的 SQL 题目涵盖了各种常见的数据库操作和查询任务。对于计算机科班出身的同学来说,SQL 是一个基础而又重要的技能。不仅在面试过程中经常会遇到 SQL 相关的考题,而且在日常的开发工作中,掌握 SQL 的能力也是必备的。

  本专栏的目的是帮助读者掌握 LeetCode 上的高频 SQL 题目,并提供对每个题目的解析和解决方案。我们将重点关注那些经常出现在面试中的题目,并提供一个基础版的解法,让读者更好地理解问题的本质和解题思路。无论你是准备找工作还是提升自己的技能,在这个专栏中,你可以学习到很多关于 SQL 的实践经验和技巧,从而更加深入地理解数据库的操作和优化。

  我希望通过这个专栏的分享,能够帮助读者在 SQL 的领域里取得更好的成绩和进步。如果你对这个话题感兴趣,那么就跟随我一起,开始我们的 LeetCode 高频 SQL 之旅吧!

超过5名学生的课

🔒题目

题目来源:596.超过5名学生的课

image-20231010085417801

🔑题解

  • 考察知识点group byhavingcount
select class
from Courses
group by class
having count(*) >= 5;

求关注者的数量

🔒题目

题目来源:1729.求关注者的数量

image-20231010085634651

🔑题解

  • 考察知识点countgroup byorder by
select user_id, count(*) followers_count
from Followers
group by user_id
order by user_id asc;

order by 默认排序就是 asc,所以这里的 acs 可以直接省略

只出现一次的最大数字

🔒题目

题目来源:619.只出现一次的最大数字

image-20231010093434229

🔑题解

  • 考察知识点maxgroup byhaving子查询

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(*) total
    from MyNumbers
    group by num
    having 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编译器问题

image-20231010162739469

解决方法

select if(count(num)=1, num, null) num
from MyNumbers
group by num
order by num desc
limit 1;

买下所有产品的客户

🔒题目

题目来源:1045.买下所有产品的客户

image-20231010093528517

🔑题解

  • 考察知识点

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.每位经理的下属员工数量

image-20231010093622529

🔑题解

  • 考察知识点自连接avgcountround

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识汲取者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值