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

    image-20231010085417801

    🔑题解

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

    求关注者的数量

    🔒题目

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

    image-20231010085634651

    🔑题解

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

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

    只出现一次的最大数字

    🔒题目

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

    image-20231010093434229

    🔑题解

    • 考察知识点maxgroup byhaving子查询

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

    select num, count(*) total
    from MyNumbers
    group by num
    having total = 1;
    
    • 1
    • 2
    • 3
    • 4
    | num | total |
    | --- | ----- |
    | 1   | 1     |
    | 4   | 1     |
    | 5   | 1     |
    | 6   | 1     |
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    select max(num) num
    from (
        select num, count(*) total
        from MyNumbers
        group by num
        having total = 1
    ) single;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

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

    select num, count(num) total
    from MyNumbers
    group by num
    having total = 1
    order by num desc
    limit 1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    | num | total |
    | --- | ----- |
    | 6   | 1     |
    
    • 1
    • 2
    • 3

    2)但是要使用 if 处理一下这个 total

    select if(count(num)=1, num, 0) total
    from MyNumbers
    group by num
    order by total desc;
    
    • 1
    • 2
    • 3
    • 4
    | total |
    | ----- |
    | 6     |
    | 5     |
    | 4     |
    | 1     |
    | 0     |
    | 0     |
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3)此时我们把 total 换成 num 即可,再加一个 limit

    select if(count(num)=1, num, 0) num
    from MyNumbers
    group by num
    order by num desc
    limit 1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    | num |
    | --- |
    | 0   |
    
    • 1
    • 2
    • 3

    嘿嘿,看到这个结果很让人惊讶,为什么 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    买下所有产品的客户

    🔒题目

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

    image-20231010093528517

    🔑题解

    • 考察知识点

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

    select customer_id
    from Customer
    group by customer_id
    having count(customer_id) = (select count(*) from Product);
    
    • 1
    • 2
    • 3
    • 4

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

    select customer_id
    from Customer
    group by customer_id
    having count(distinct product_key) = (select count(*) from Product);
    
    • 1
    • 2
    • 3
    • 4

    每位经理的下属员工数量

    🔒题目

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

    image-20231010093622529

    🔑题解

    • 考察知识点自连接avgcountround

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

    select *
    from Employees e1 join Employees e2 on e1.employee_id = e2.reports_to;
    
    • 1
    • 2
    | 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  |
    
    • 1
    • 2
    • 3
    • 4

    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;
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    读书系列2022(上)
    彻底搞懂内存屏障(下)
    【数据结构】图的实现
    Linux发展史
    耗时两个月整理了这份史上最全Spring知识总结,全部掌握直接冲P8架构师
    云上办公兴起,华为云桌面Workspace更靠谱
    在服务器的docker里 装anacond3深度学习环境的全流程超基础
    Centos7处理openssh漏洞后造成GNOME桌面启动异常
    GBASE 8A v953报错集锦60--在线扩容过程中使用 swap 导致业务性能下降
    亚马逊卖家自己掌握测评养号技术的重要性
  • 原文地址:https://blog.csdn.net/qq_66345100/article/details/133760858