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

文章目录

  • 【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名学生的课

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

题解

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

求关注者的数量

题目

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

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

题解

  • 考察知识点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.只出现一次的最大数字

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

题解

  • 考察知识点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编译器问题

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

解决方法

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

买下所有产品的客户

题目

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

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

题解

  • 考察知识点

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

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

题解

  • 考察知识点自连接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;

你可能感兴趣的:(#,编程练习,leetcode,mysql)