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

文章目录

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

⛅前言

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

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

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

超过5名学生的课

🔒题目

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

🔑题解

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

求关注者的数量

🔒题目

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

🔑题解

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

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

只出现一次的最大数字

🔒题目

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

🔑题解

  • 考察知识点maxgroup byhaving子查询

1)首先审题,我们明确我们需要从只出现一次的数字中,选出一个最大的,所以我们可以先查询出只出现一次的数字

mysql 复制代码
select num, count(*) total
from MyNumbers
group by num
having total = 1;
复制代码
| num | total |
| --- | ----- |
| 1   | 1     |
| 4   | 1     |
| 5   | 1     |
| 6   | 1     |

2)只要我们查询出了单个出现的数字,剩下的就很简单的,直接使用 max过滤出最大值即可

mysql 复制代码
select max(num) num
from (
    select num, count(*) total
    from MyNumbers
    group by num
    having total = 1
) single;

还有一种写法,不使用子查询,使用 排序+分页来实现

温馨提示:更加推荐第一种使用 max+子查询 的方式来获取最大的单个数字,因为 max+子查询 方式更加通用,可读性、性能更高

1)直接编写下面一个SQL即可,但是需要对结果进行处理

mysql 复制代码
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

mysql 复制代码
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

mysql 复制代码
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编译器问题

解决方法

mysql 复制代码
select if(count(num)=1, num, null) num
from MyNumbers
group by num
order by num desc
limit 1;

买下所有产品的客户

🔒题目

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

🔑题解

  • 考察知识点

1)审题,我想要计算出购买所有产品的用户,我的想法是先计算出产品的数量,然后判断一下用户的数量是否等于产品的总数,相等则说明这个用户购买了所有的产品

mysql 复制代码
select customer_id
from Customer
group by customer_id
having count(customer_id) = (select count(*) from Product);

2)结果运行报错了,因为我没有认真审题,Customer表中可能存在重复的记录,因为一个用户可能多次购买同一个产品,对上面的代码作出更正,因为我们已经进行了分组,我们 只需要计算出分组后每一个用户的产品数量即可(注意需要去重)

mysql 复制代码
select customer_id
from Customer
group by customer_id
having count(distinct product_key) = (select count(*) from Product);

每位经理的下属员工数量

🔒题目

题目来源:1731.每位经理的下属员工数量

🔑题解

  • 考察知识点自连接avgcountround

1)首先审题,我们可以通过自连接将相关联的两条记录变为一条,这样就好进行后面的逻辑处理了

mysql 复制代码
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)然后对上表进行操作,即可得到正确的结果了

mysql 复制代码
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;
相关推荐
AA-代码批发V哥12 分钟前
MySQL-DDL语句深度解析与实战指南
数据库·mysql
Once_day26 分钟前
代码训练LeetCode(33)字符串首次匹配
算法·leetcode·c
进击的CJR2 小时前
MySQL 8.0 OCP 英文题库解析(十八)
android·mysql·开闭原则
进击的CJR2 小时前
MySQL 8.0 OCP 英文题库解析(十四)
android·mysql·开闭原则
Forest_HAHA2 小时前
<8>-MySQL复合查询
数据库·mysql
xx155802862xx4 小时前
centos转移mysql的数据存储目录
linux·mysql·centos
进击的CJR4 小时前
MySQL 8.0 OCP 英文题库解析(十五)
数据库·mysql·开闭原则
羊小猪~~4 小时前
数据库学习笔记(十五)--变量与定义条件与处理程序
数据库·人工智能·笔记·后端·sql·学习·mysql
GalaxyPokemon5 小时前
LeetCode - 76. 最小覆盖子串
运维·服务器·数据结构·算法·leetcode
fie88895 小时前
MySQL:Prepared Statement 预处理语句
android·数据库·mysql