【LeetCode高频SQL50题-基础版】打卡第8天:第41~45题

news2024/11/23 20:22:13

文章目录

  • 【LeetCode高频SQL50题-基础版】打卡第8天:第41~45题
    • ⛅前言
    • 好友申请II
      • 🔒题目
      • 🔑题解
    • 2016年的投资
      • 🔒题目
      • 🔑题解
    • 部门工资前三高的所有员工
      • 🔒题目
      • 🔑题解
    • 修复表中的名字
      • 🔒题目
      • 🔑题解
    • 患某种疾病的患者
      • 🔒题目
      • 🔑题解

【LeetCode高频SQL50题-基础版】打卡第8天:第41~45题

⛅前言

  在这个博客专栏中,我将为大家提供关于 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)全球极客挚爱的技术成长平台

好友申请II

🔒题目

题目来源:602.好友申请II:谁有最多的好友

image-20231014144055564

🔑题解

  • 考察知识点子查询union all

分析:我的思路是先分别统计 requester_id 和 accepter_id 这两列 id 出现的次数,然后将这两个统计结果使用 union all 聚合起来,基于这张聚合的临时表作最终的统计

1)分别统计 requester_id 和 accepter_id,使用 union all 对结果进行一个合并

注意:这里一定要使用 union all,而不是 union,因为 union 会直接将查询的结果进行去重,按照题目的含义,这里是不需要进行去重的,两列 id 出现的次数都需要进行统计的

select requester_id id, count(*) num
from RequestAccepted
group by requester_id
union all
select accepter_id id, count(*) num
from RequestAccepted
group by accepter_id
| id | num |
| -- | --- |
| 1  | 2   |
| 2  | 1   |
| 3  | 1   |
| 2  | 1   |
| 3  | 2   |
| 4  | 1   |

2)基于上面的表进行一个最终的结果获取

这一部就相当简单, 可以直接对按照 id 进行一个分组,然后使用 sum 聚合函数统计每一个 id 出现的次数,最终在降序排序,limit截取第一个元素,即可筛选出最终的结果

select id, sum(num) num
from(
    select requester_id id, count(*) num
    from RequestAccepted
    group by requester_id
    union all
    select accepter_id id, count(*) num
    from RequestAccepted
    group by accepter_id
) t
group by id
order by num desc
limit 1;

2016年的投资

🔒题目

题目来源:585.2016年的投资

image-20231014150225342

🔑题解

  • 考察知识点roundsum子查询group byinhavingcount

分析:这一题题意还算十分清晰,我们只需要按照题目要求一步一步来即可,题目要求我们查询出满足下面两个条件的所有投保人的在2016年的总金额

  1. 在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同。
  2. 所在的城市必须与其他投保人都不同(也就是说 (lat, lon) 不能跟其他任何一个投保人完全相同)

我的思路是,先查询出满足第一个条件的所有 tiv_2015,然后插叙出所有满足第二个条件的 lat 和 lon,再将这两个条件进行取一个交集,最周在利用 sum + round 函数对筛选出的记录进行一个求和,最后就可以得到最终的答案了

1)查询出满足第一个条件的所有的 tiv_2015

select tiv_2015
from Insurance 
group by tiv_2015
having count(*) > 1
| tiv_2015 |
| -------- |
| 10       |

2)查询出满足第二个条件的所有的 lat 和 lon

这里可以巧妙的利用 group by进行两个字段的分组,可能平常我们都是使用一个字段进行分组,实际上 group by可以同时按照多个字段进行分组

select lat, lon
from Insurance
group by lat, lon
having count(*) = 1
| lat | lon |
| --- | --- |
| 10  | 10  |
| 40  | 40  |

3)利用 in 和 and 使用上面两个结果集进行交集,然后筛选出符合所有条件的记录,最终通过 round 和 sum 进行最终的计算

select round(sum(tiv_2016), 2) tiv_2016
from Insurance
where tiv_2015 in (
    select tiv_2015
    from Insurance 
    group by tiv_2015
    having count(*) > 1
) and (lat, lon) in (
    select lat, lon
    from Insurance
    group by lat, lon
    having count(*) = 1
);

部门工资前三高的所有员工

🔒题目

题目来源:185.部门工资前三高的所有员工

image-20231014153006689

🔑题解

  • 考察知识点dense_rank子查询自连接countdistinct

分析:这一题最开始我的第一反应就是使用窗口函数,因为这种分组排序使用窗口函数将十分的方便,具体的思路如下

  1. 确定使用哪一个窗口函数,这里可以明确使用 dense_rank 窗口函数(并列排序,不会跳过重复的序号 1、1、2)
  2. 剩下的就很好办的,我们只需要筛选出排名前三的即可

1)利用窗口函数对所有的记进行员工分组排序

select *, dense_rank() over(partition by d.name order by salary desc) ranking
from Department d left join Employee e on d.id = e.departmentId
| id | name  | id | name  | salary | departmentId | ranking |
| -- | ----- | -- | ----- | ------ | ------------ | ------- |
| 1  | IT    | 4  | Max   | 90000  | 1            | 1       |
| 1  | IT    | 6  | Randy | 85000  | 1            | 2       |
| 1  | IT    | 1  | Joe   | 85000  | 1            | 2       |
| 1  | IT    | 7  | Will  | 70000  | 1            | 3       |
| 1  | IT    | 5  | Janet | 69000  | 1            | 4       |
| 2  | Sales | 2  | Henry | 80000  | 2            | 1       |
| 2  | Sales | 3  | Sam   | 60000  | 2            | 2       |

2)筛选出排名前三的员工信息

select  Department, Employee, salary
from(
    select d.name Department, 
       e.name Employee,
       e.salary,
       dense_rank() over(partition by d.name order by salary desc) ranking
    from Department d left join Employee e on d.id = e.departmentId
) t
where ranking <= 3 and salary is not null

窗口函数虽然好用,但是MySQL的版本必须是8或8以上才能使用,所以我们还是有必要掌握使用不同函数进行操作

分析:我们进行一个自连接,然后统计出所有排名在前三的员工信息

select d.name Department, e1.name Employee, e1.salary
from Employee e1 join Department d on e1.DepartmentId = d.id 
where 3 > (
    select count(distinct e2.salary)
    from Employee e2
    where e2.salary > e1.salary and e1.DepartmentId = e2.DepartmentId
);

下面这个SQL是含义是查询出比当前员工(e1)薪资高的员工数量,因为比排名第一员工薪资高的员工数量为0,所以计数是从0开始,并不像先前窗口函数中排名是从1开始的,所以这里 3 是大于,不能取等号

    select count(distinct e2.salary)
    from Employee e2
    where e2.salary > e1.salary and e1.DepartmentId = e2.DepartmentId

PS:说实话这个SQL是我看官方题解是摘自官方题解,一开始看着是有点懵的,后面多看几遍才理解了,我个人任务使用窗口函数更易于理解,同时窗口函数提的SQL比这条SQL效率更高(窗口函数的SQL是90%左右,这条SQL是50%左右)

修复表中的名字

🔒题目

题目来源:1667.修复表中的名字

image-20231014170005644

🔑题解

  • 考察知识点substringupperlowerconcat

    • substring(column_name, start, length):这将从列的值中提取一个子字符串,从指定的起始位置开始,直到指定的长度。注意截取索引是从1开始的,不是0
    • upper(expression):这会将字符串表达式转换为大写。
    • lower(expression):这会将字符串表达式转换为小写。
    • concat(string1, string2, ...):这会将两个或多个字符串连接成一个字符串。

    PS:这里只是讲解这些函数大概的作用,关于这些函数的详细使用大家可以参考MySQL教程

分析:这一题其实说简单也简单,说难也难,因为只要你有了解相关操作字符的 函数 可以秒杀这一题,如果你并不了解相关的 函数 可能就毫无头绪,所以大家在做题的时候,不要去死磕题目,没做出来可以适当的直接看题解

select user_id, concat(upper(substring(name, 1, 1)), lower(substring(name, 2, length(name)-1))) name
from Users
order by user_id asc;

备注:substring(name, 2, length(name)-1)这个函数可以简写为substring(name, 2)

患某种疾病的患者

🔒题目

题目来源:1572.患某种疾病的患者

image-20231014171657619

🔑题解

  • 考察知识点like

分析:直接使用 like 就可以了,但是需要注意一些比较细节的地方,DIAB1不一定出现在第一个位置,可以是第二个单词的位置,但是不能使用%DIAB1%去过滤,需要使用% DIAB1%这个去过滤,因为它是单词首位

select *
from Patients
where conditions like 'DIAB1%' or conditions like '% DIAB1%';

这里再推荐一种更加简洁的写法,直接使用正则表达式,没想到正则表达式无处不在,在MySQL中也可以使用正则表达式,不得不说正则表达太强大了

select patient_id, patient_name, conditions
from Patients
where conditions REGEXP '\\bDIAB1.*';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入JTS事务引擎:理论与实践相结合,掌握高效事务管理的秘诀

事务是可靠应用程序的构建块 如果您阅读过任何有关 J2EE 的介绍性文章或者书籍&#xff0c;那么就会发现&#xff0c;只有一小部分资料是专门针对 Java Transaction Service&#xff08;JTS&#xff09;或 Java Transaction API&#xff08;JTA&#xff09;的。这并不是因为 J…

[补题记录] Atcoder Beginner Contest 295(E)

URL&#xff1a;https://atcoder.jp/contests/abc295 目录 E Problem/题意 Thought/思路 Code/代码 E Problem/题意 给定长度为 N 的数组 A。进行如下操作&#xff1a; 若 Ai 0&#xff0c;将 Ai 等概率地变为 1 ~ M 中的任意一个数&#xff1b;对 A 排序&#xff1b; …

SQL及数据库基础知识点总结

一. SQL&#xff08;Structured Query Language&#xff09;&#xff1a; 结构化查询语言。SQL语法不区分关键字的大小写&#xff0c;多条SQL语句必须以&#xff1b;分隔。 二. SQL的作用&#xff1a; SQL可以访问和处理数据库&#xff0c;包括数据的增删改查&#xff08;插…

【实战项目之网页聊天室】

目录 项目背景 需求分析 1.用户管理模块 注册 登录 2.主界面 个人信息模块 会话列表模块 好友列表模块 消息区域模块 消息传输模块 添加好友模块 编写项目 1.创建项目添加依赖 2.配置项目信息 3.功能实现 用户管理模块 个人信息模块 好友列表模块 消息区…

FPmarkets:MT4中Renko图表工具有哪些?怎么用

以下FPmarkets总结的在MT4中使用Renko图表的最有趣的工具&#xff1a; 第一个是KT Renko实时图表指标&#xff0c;这是一个简单的指示器&#xff0c;仅显示砖块&#xff0c;未添加其他元素&#xff0c;因此与其他自定义指标和顾问兼容。 第二个是Renko Live Chart开发人员提供…

Kafka消费者使用案例

本文代码链接&#xff1a;https://download.csdn.net/download/shangjg03/88422633 1.消费者和消费者群组 在 Kafka 中&#xff0c;消费者通常是消费者群组的一部分&#xff0c;多个消费者群组共同读取同一个主题时&#xff0c;彼此之间互不影响。Kafka 之所以要引入消费者群组…

源码选择指南:比较流行的同城外卖跑腿系统解决方案

随着现代生活的快节奏和数字化转型的浪潮&#xff0c;外卖和跑腿服务成为了不可或缺的一部分。不仅在城市&#xff0c;就连小镇和乡村也可以享受到这些便捷的服务。如果您计划开发或改进一个同城外卖和跑腿系统&#xff0c;选择适合的源码解决方案是至关重要的。在本文中&#…

Jenkins 结合 ANT 发送测试报告

目录 全局变量配置 新建任务 插件安装 HTML 报告配置 邮件配置 全局变量配置 点击 ManageJenkins进入Jenkins 管理 点击 Global Tool Configuration 进入全局变量配置 配置 Ant &#xff0c;Name 自己定义一个比较好理解的名称。 去掉 Install automatically 勾选&#x…

毕业设计选题Java+springboot校园新闻资讯系统源码 开题 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

VBA技术资料MF69:添加和删除工作表中的分页符

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

黑马JVM总结(三十三)

&#xff08;1&#xff09;运行期优化-逃逸分析 在运行期间java虚拟机会对我们代码做一些优化&#xff0c;时间会变短&#xff1a; 字节码反复调用&#xff0c;到达一定的阈值&#xff0c;会启用编译器对自己饿吗编译执行&#xff0c;从0层上升为1层C1 C1和C2他俩的区别是解释…

C语言进阶第六课-----------字符分类函数和内存的开辟

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

【Python从入门到进阶】39、使用Selenium自动验证滑块登录

接上篇《38、selenium关于Chrome handless的基本使用》 上一篇我们介绍了selenium中有关Chrome的无头版浏览器Chrome Handless的使用。本篇我们使用selenium做一些常见的复杂验证功能&#xff0c;首先我们来讲解如何进行滑块自动验证的操作。 一、测试用例介绍 我们要通过sel…

websocket逆向-protobuf序列化与反序列化

系列文章目录 训练地址&#xff1a;https://www.qiulianmao.com 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集实战一&#xff1a;Http轮询更新中 websocket逆向-protobuf序列化与反序列化基础 系…

操作系统 内存对齐

文章目录 内存管理内存对齐为什么需要内存对齐内存对齐的规则举例说明两个函数 内存管理 内存是计算机的重要组成部分&#xff0c;内存是与cpu沟通的桥梁&#xff0c;用来暂存cpu中的运算数据。在早期&#xff0c;程序直接运行在物理内存中&#xff0c;直接操作物理内存&#…

MathType7.5最新版本升级教程

MathType7.5是MathType6.9a的升级版本&#xff0c;这是一款好用的数学公式编辑器&#xff0c;软件支持win、mac等操作系统&#xff0c;可以与各类办公软件兼容&#xff0c;能够快速在office文档中进行各类数学公式、符号的输入和运算等操作&#xff0c;coco玛奇朵小编为大家带来…

LiveGBS流媒体平台GB/T28181常见问题-如何禁用删除已注册设备国标设备如何删除

LiveGBS常见问题-如何禁用删除已注册设备国标设备如何删除 1、禁用删除设备2、找到需要删除的设备3、接入控制黑名单4、配置到黑名单5、删除设备6、搭建GB28181视频直播平台 1、禁用删除设备 有的时候&#xff0c;需要将接入到平台的某些设备禁用&#xff0c;并删除。改如何操…

池化技术在真实业务中的实践

一些废话 作为一名Java开发人员&#xff0c;池化技术或多或少在业务代码中使用。常见的包括线程池、连接池等。也是因为Java语言超级丰富的基建&#xff0c;基本上这些池化能力都有着相对成熟的“工具”。比如&#xff0c;需要使用线程池的时候常常会选择Spring提供的 ThreadP…

DL Homework 4

目录 1 整理一下理论收获 1.1 基础理论 1.2 应用到机器学习 1.3 参数学习 1.4 反向传播算法 2.激活函数 3.神经网络流程推导(包含正向传播和反向传播) 4.数值计算 - 手动计算 5.代码实现 - numpy手推 6.代码实现 - pytorch自动 7.激活函数Sigmoid用PyTorch自带函数torc…

蓝桥杯(七段码,C++)

思路&#xff1a; 1、把灯管的连接转为图结构&#xff0c;相邻的灯管即认为有边。 2、用深度搜索&#xff0c;去计算有多少种不同字符。 3、因为有每种字符都会重复算两遍&#xff0c;最后的结果需要数以2。 #include <iostream> using namespace std;int graph[7][7…