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

文章目录

  • 【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(*) numfrom RequestAcceptedgroup by requester_idunion allselect accepter_id id, count(*) numfrom RequestAcceptedgroup 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_2015from Insurance group by tiv_2015having count(*) > 1
) and (lat, lon) in (select lat, lonfrom Insurancegroup by lat, lonhaving 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) rankingfrom 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 e2where e2.salary > e1.salary and e1.DepartmentId = e2.DepartmentId
);

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

    select count(distinct e2.salary)from Employee e2where 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.mzph.cn/news/104715.shtml

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

相关文章

阿里云服务器不能访问网络之安装mysql 提示连接超时

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 过了一段时间后提示 fail .......time out 链接超时 有可能你的服务器不能访问网络 因为宽带套餐 我购买的时候没有购 重新购买就行了

登录中获取验证码的节流

一. 验证码框 <el-input placeholder"请输入验证码" prefix-icon"el-icon-lock" v-model"ruleForm.code"><el-button slot"suffix" :disabled"disabled" type"text" size"mini" click"ch…

今年的秋招面试,确实有点难。

不可否认的是&#xff0c;今年秋招确实有点难 从今年的形势来看&#xff0c;好的 offer 都掌握在少数人的手里&#xff0c;想要秋招找到理想的工作&#xff0c;要么学历好&#xff0c;要么技术功底很扎实&#xff0c;这两样都不占的话&#xff0c;就业压力就会比较大。 如何从…

nodejs+vue+elementui养老院老年人服务系统er809

“养老智慧服务平台”是运用nodejs语言和vue框架&#xff0c;以MySQL数据库为基础而发出来的。为保证我国经济的持续性发展&#xff0c;必须要让互联网信息时代在我国日益壮大&#xff0c;蓬勃发展。伴随着信息社会的飞速发展&#xff0c;养老智慧服务平台所面临的问题也一个接…

C语言水平测试题 过关斩将(3)辗转相除法,前n项求和,整数的正序分解,求最大公约数

我的个人主页&#xff1a;☆光之梦☆的博客_CSDN博客-C语言基础语法&#xff08;超详细&#xff09;领域博主 欢迎各位 &#x1f44d;点赞 ⭐收藏 &#x1f4dd;评论 我的专栏&#xff1a;C语言基础语法&#xff08;超详细&#xff09;_☆光之梦☆的博客-CSDN博客&#xff08;这…

Linux 编写一个 简单进度条

进度条 回车换行理解&#xff1a; 我们要理解&#xff0c;回车换行是两个概念&#xff1a; 换行是把光标移到下一行&#xff0c;是竖直的往下平移&#xff1b;" \n "回车是把光标移到当前行的最开始&#xff1b; " \r " 就和一起打字…

【计网】傻瓜式安装cpolar内网穿透

目录 一、注册账户 二、下载安装包 三、安装 四、查看AuthToken 五、简单使用 如果在本机部署项目外网是访问不到的&#xff0c;通过内网穿透就可以使本机部署的项目可被外网访问 一、注册账户 cpolar - secure introspectable tunnels to localhostcpolar secure intro…

数字技术助力智慧公厕,让公厕变身为全新创新应用

在如今数字化的时代&#xff0c;数字技术的集成应用已经渗透到了生活的方方面面。其中一个令人瞩目的领域就是智慧公厕。以前只是简单的厕所&#xff0c;如今借助数字技术的力量&#xff0c;智慧公厕变得功能强大、智能高效。接下来&#xff0c;我们将以智慧公厕源头领航厂家广…

数据治理是一个怎样的体系化的过程?_光点科技

数据治理是一个复杂而系统化的过程&#xff0c;旨在确保企业能够有效地管理、维护和利用其日益增长的数据资产。这一过程涉及多个层面和步骤&#xff0c;需要有明确的框架和战略规划。 数据治理的体系化始于明确定义的目标和愿景。企业需要明确意识到数据对于业务成功的重要性&…

微信小程序开发--入门

目录 前言 一.准备阶段 1.申请账号 2.安装开发工具 二.开发第一个小程序 1.创建项目 2.基础操作及语法 2.1目录结构 2.2 常见语法及文件类型 ​编辑 3.案例演示开发 1.新建页面 2.新建标题 3.后端传值 前言 简介&#xff1a; 微信小程序&#xff08;WeChat …

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

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

腾讯云国际站-阿里云OSS如何迁移到腾讯云COS?腾讯云cos迁移教程

下面小编将介绍当源对象存储部署在阿里云国际版OSS 时&#xff0c;如何配置全托管迁移任务和半托管迁移任务&#xff0c;实现顺利迁移数据至腾讯云国际版COS。 准备工作 阿里云对象存储 OSS 创建 RAM 子账号并授予相关权限&#xff1a; 登录 RAM 控制台。选择人员管理 > …

发货100虚拟商品自动发货系统存在SQL注入

漏洞描述 该系统存在SQL注入漏洞&#xff0c;可获取敏感信息及账号密码。 漏洞复现 构造SQL注入延时payload&#xff1a; M_id11%20AND%20(SELECT%208965%20FROM%20(SELECT(SLEEP(5)))sdhh)&typeproduct漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;…

ElasticSearch-Head 数据浏览406问题解决

解决方法&#xff1a; 1、打开Docker DeskTop的Containers&#xff0c;找到es-head容器 2、选择Exec Tab选项 3、编辑vendor.js文件 vim _site/vendor.js 4、显示行号 :set nu 5、修改配置 # 修改文件第6886、7574行 将"application/x-www-from-urlencodes"修改…

centos6/7 SOCKS5 堆溢出漏洞修复(RPM方式)curl 8.4 CVE-2023-38545 CVE-2023-38546

引用 https://darkdark.top/update-curl.html centos6 rpm 升级包下载&#xff1a;https://download.csdn.net/download/sinat_24092079/88425840 yum update libcurl-8.4.0-1.el6.1.x86_64.rpm curl-8.4.0-1.el6.1.x86_64.rpmcentos7 rpm 升级包下载&#xff1a;https://down…

BuyVM 挂载存储块

发布于 2023-07-13 on https://chenhaotian.top/linux/buyvm-mount-block-storage/ BuyVM 挂载存储块 参考&#xff1a; https://zhujitips.com/2653https://www.pigji.com/898.html 1 控制台操作 存储块购买完毕后&#xff0c;进入后台管理界面&#xff0c;进入对应 VPS …

多测师肖sir_高级金牌讲师_python之模块008

python之模块 一、模块的介绍 &#xff08;1&#xff09;python模块&#xff0c;是一个python文件&#xff0c;以一个.py文件&#xff0c;包含了python对象定义和pyhton语句 &#xff08;2&#xff09;python对象定义和python语句 &#xff08;3&#xff09;模块让你能够有逻辑…

【Tomcat】Apache发布两个新版本Tomcat修复多个Bug

Apache 官网发布了两个最新的 Tomcat 版本包&#xff0c;分别是&#xff1a;8.5.94、9.0.81 这两个最新版本修复了多个漏洞&#xff0c;统计信息如下表所示。有关漏洞的详细信息&#xff0c;请查阅官方相关文档&#xff08;见&#xff1a;参考&#xff09;。 严重等级漏洞说明…

卷积神经网络CNN基础知识

目录 1 前言2 卷积神经网络CNN2.1 LeNet-5相关介绍2.2 CNN基本结构2.2.1 卷积层2.2.2 池化层&#xff08;下采样层&#xff09;2.2.3 全连接层2.2.3.1激励层&#xff08;非线性激活&#xff09;2.2.3.2 线性层2.2.3.3 Dropout层2.2.3.4 总结 2.3 图像的上采样和下采样2.3.1 上采…

联盟链学习笔记-网络的创建

联盟链学习笔记 初始网络 下图是初始网络网络N的参考图 排序服务 在定义 网络 N 的时候&#xff0c;第一件事情就是定义一个 排序服务O4。O4 最初被配置并且由组织 R4 的一个管理员来启动&#xff0c;并且由 R4 管理。配置 NC4 包含了描述网络管理能力初始集合的规则。最初…