【LeetCode】--- MySQL刷题集合

1.组合两个表(外连接)

select p.firstName,p.lastName,a.city,a.state 
from Person p left join Address a 
on p.personId = a.personId;

以左边表为基准,去连接右边的表。取两表的交集和左表的全集 

2.第二高的薪水 (子查询、ifnull)

解法一(子查询与LIMIT 子句):

limit的两种写法

limit 起始索引,查询数据的个数

limit 起始索引 offset 查询数据的个数

select 
(select distinct salary from Employee order by salary desc limit 1 offset 1) 
as SecondHighestSalary;

这样的写法就类似于

select 1+2 as SecondHighestSalary;

不需要有数据来源,因为这个表达式的计算结果已经是一个数据了。

这里只是给数据起一个别名。若是子查询数据为空,那么返回的就是null 而不是空了

总之。在 SQL 中使用子查询而没有 FROM 子句的情况通常是为了计算一个表达式或获取一个基于特定逻辑的单一结果,子查询本身提供了数据来源和处理逻辑,无需再通过 FROM 从物理表中获取数据。但在实际应用中,需要考虑性能和可维护性,避免过度复杂的子查询结构。 

解法二(使用 IFNULL 和 LIMIT 子句): 

select ifnull(
(select distinct salary from Employee order by salary desc limit 1,1),null
) 
as SecondHighestSalary;

由于若查询结果为空,返回null

因此使用 ifnull 流程控制函数 更加合适

ifnull(value1,value2)

如果value1为null,就返回value2

如果不为空,就返回value1

注意,若是value1为一个sql语句,要给它加上括号

 3.第N高的薪水(函数、limit不能跟表达式)

 

答案: 

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
declare M INT;set M = N-1;RETURN (select distinct salary from Employee order by salary desc limit M,1);
END

注意,limit中参数不能写成表达式的形式。也就是不能写成N-1

需要单独定义一个变量 M = N-1 

代码解释 

这个 SQL 代码创建了一个名为 getNthHighestSalary 的函数,该函数接收一个整数参数 N,用于表示要查找第 N 高的薪水。函数的返回值是一个整数,代表第 N 高的薪水值。

变量声明

declare M INT;

变量赋值

set M = N-1;


查询语句

RETURN (select salary from Employee order by salary desc limit M,1
);

 4.分数排名(窗口函数(排名函数dense_rank())

窗口函数的基本结构

<窗口函数>([参数]) OVER ([PARTITION BY <分区列1>, <分区列2>,...][ORDER BY <排序列1> [ASC | DESC], <排序列2> [ASC | DESC],...][ROWS | RANGE <窗口范围说明>]
)

各部分解释

窗口函数

  • 这是核心部分,可以是聚合函数(如 SUM()AVG()COUNT()MAX()MIN() 等)或排名函数(如 RANK()DENSE_RANK()ROW_NUMBER() 等)。
  • OVER 子句

    • 是窗口函数的关键字,表明后面的内容是对窗口的定义。
  • PARTITION BY:
    这是可选的。用于将数据划分为不同的分区,类似于 GROUP BY 的功能,但不会像 GROUP BY 那样对数据进行聚合操作。窗口函数会在每个分区内独立执行。
    例如:partition by ...
    PARTITION BY department 
    会将数据按照部门进行分区,窗口函数将在每个部门内分别计算。
  • ORDER BY:
    通常是必需的,用于对分区内的数据进行排序。这会影响排名函数的结果,以及聚合函数的计算顺序。
    例如:
    ORDER BY salary DESC
    会将分区内的数据按照薪水降序排列。
  • ROWS | RANGE 窗口范围说明:
    这也是可选的,用于进一步定义窗口的范围。
    ROWS 基于物理行,例如
    ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
    表示当前行的前一行到后一行的范围。
    RANGE 基于逻辑值,例如
     RANGE BETWEEN 10 PRECEDING AND 10 FOLLOWING
    表示在当前行的值的基础上,范围是比当前行的值小 10 到大 10 的数据范围。

 排名函数(如 RANK()DENSE_RANK()ROW_NUMBER() 等)。

方法一:排名函数dense_rank()(推荐)

rank()               排名的特点是  1 2 2 4 5 5 5 8 9

dense_rank() 排名的特点是  1 2 2 3 4 5 5 5 6

ROW_NUMBER()      特点是   1 2 3 4 5 6 7 8 9

select s.score,dense_rank() 
over(order by s.score desc) as 'rank' 
from Scores s;

 方法二:使用 COUNT(DISTINCT ...) 的相关子查询

SELECTS1.score,(SELECTCOUNT(DISTINCT S2.score)FROMScores S2WHERES2.score >= S1.score) AS 'rank'
FROMScores S1
ORDER BYS1.score DESC;

这段 SQL 代码的主要目的是为 Scores 表中的每个 score 计算排名。它使用了一个相关子查询来计算排名,排名的依据是大于或等于当前分数的不同分数的数量。

主查询

SELECT S1.score:从 Scores 表中选择 score 列作为主查询的一部分。

子查询部分:

COUNT(DISTINCT S2.score):计算不同分数的数量。
FROM Scores S2:从 Scores 表中选取数据。
WHERE S2.score >= S1.score:这是关键部分,对于主查询中的每个 S1.score,子查询会统计 Scores 表中大于或等于 S1.score 的不同分数的数量。

 最终结果是通过 ORDER BY S1.score DESC 对主查询的结果按照分数降序排列。

5.连续出现的数字 (自连接)

自连接使用场景

1.比较同一表中不同行的数据

  • 示例场景:查找表中相邻行的数据关系,例如找出连续出现的记录。

2.查找父子关系或层次关系

  • 示例场景:在存储了层次结构信息的表中查找父子节点关系。

3.找出重复记录

  • 示例场景:找出表中具有相同数据的行。

4.时间序列分析

  • 示例场景:在存储了时间序列数据的表中,找出连续时间点的数据。

select distinct l1.num as ConsecutiveNums
from Logs l1,Logs l2,Logs l3
where 
l1.id = l2.id-1 and
l2.id = l3.id-1 and
l1.num = l2.num and
l2.num = l3.num;

找出至少出现三次的数字。因此进行自连接三次

条件是

第一张表id 等于 第二张表 id-1

第二张表id 等于 第三张表 id-1

第一张表num 等于 第二张表 num

第二张表num 等于 第三张表 num

6.超过经理收入的员工(自连接)

解法一:自连接(隐式where语句)

select e1.name as Employee
from Employee e1,Employee e2 
where e1.managerId = e2.id and e1.salary > e2.salary; 

SQL解释 

表的自连接

from Employee e1, Employee e2

这里将 Employee 表自连接,使用别名 e1 表示员工,e2 表示经理。

where e1.managerId = e2.id and e1.salary > e2.salary;

 e1.managerId = e2.id:
这是自连接的关键条件,它将 e1 表中的 managerId 与 e2 表中的 id 进行连接,意味着 e2 表中的员工是 e1 表中员工的经理。
e1.salary > e2.salary:
这是筛选条件,它确保只选择那些员工的工资(e1.salary)高于其经理的工资(e2.salary)的记录。

 解法二:自连接(显示on语句)

SELECTa.NAME AS Employee
FROM Employee AS a JOIN Employee AS bON a.ManagerId = b.IdAND a.Salary > b.Salary
;

 一、自连接过程:
首先,将 Employee 表自连接,形成笛卡尔积。这意味着 e1 和 e2 表的组合将包含所有可能的行对,即每个 e1 中的行将与 e2 中的所有行组合在一起,总共会有  种组合(假设 Employee 表有 n 行)。对于我们的示例表,会有6的平方 = 36  种组合,但很多组合将不符合条件。

e1.managerId = e2.id:
这一条件将确保 e1 中的员工的经理是 e2 中的员工。例如:
对于 e1 中的 Bob(id = 2,managerId = 1),只有当 e2 中的 id = 1 时,这个条件才满足。所以,Bob 可以和 Alice 组合。 

e1.salary > e2.salary:
在上述满足 e1.managerId = e2.id 的组合中,进一步筛选出员工(e1)工资高于经理(e2)工资的组合:
对于 Bob(e1)和 Alice(e2)的组合:Bob 的工资是 6000,Alice 的工资是 5000,满足 e1.salary > e2.salary,所以 Bob 会被选中。 

注意e1.managerId = e2.id 与 e1.id = e2.managerId的区别

e1.managerId = e2.id 
这个条件表示 e2 表中的员工是 e1 表中员工的经理。也就是说,通过 managerId 建立了从员工(e1)到其经理(e2)的关联。 

e1.id = e2.managerId:
这个条件表示 e1 表中的员工是 e2 表中员工的经理。与第一个语句相反,这里是通过 managerId 建立了从经理(e1)到其下属员工(e2)的关联。 

7.找到重复的电子邮箱(自连接 | group by... having)

法一:自连接(效率低一点)

select distinct p1.email as Email 
from Person p1, Person p2 
where p1.id <> p2.id and p1.email = p2.email; 

法二:(GROUP BY 和临时表) (比自连接效率高)

表子查询

select email, count(*) as num from Person group by email

得到临时表

再根据这个表找到email数量大于 1 的 email就可以了

select  email as Email 
from  (select email, count(*) as num from Person group by email) t
where num > 1;

法三、使用 GROUP BY 和 HAVING 条件 (效率相对高一点)

select email from Person 
group by email 
having count(*) > 1;

分完组之后,再用having count(*)来计算组内的行数。

再筛选组内行数大于1的email 

 8.从不订购的客户(is null)

 注意:判断是否为null 要用 is 而不是 =

法一:列子查询(子查询返回的是一列数据)

select name as Customers from Customers
where id 
not in (select customerId from Orders);

法二:左连接(Left Join)

select name as Customers from Customers c
left join Orders o 
on c.id = o.customerId  where customerId is null; 

9.部门工资最高的员工 

法一:隐式内连接

select d.name Department,e.name Employee,e.salary 
from Employee e,Department d
where e.departmentId = d.id
and e.salary >= 
all (select salary from Employee t where e.departmentId = t.departmentId);

e.salary >= 
all (select salary from Employee t where e.departmentId = t.departmentId);

员工薪资 ≥ 相同部门的薪资。

法二、窗口函数(MAX()+行子查询) 

select d.name AS 'Department',e.name AS 'Employee',Salary
FROM Employee e JOIN Department d ON e.DepartmentId = d.Id
where (e.DepartmentId , Salary) in
(select DepartmentId, MAX(Salary) from Employee 
GROUP BY DepartmentId);

 where 条件 绑定了部门 id 和 薪资水平 in

查出来的 部门id 和最高的薪资水平。

select DepartmentId, MAX(Salary) from Employee 
GROUP BY DepartmentId;

法三:窗口函数(dense_rank() partition by)(推荐)

select d.name AS 'Department',e.name AS 'Employee',e.salary Salary
from 
(select *,dense_rank()  over(partition by departmentId order by salary desc) as erank 
from Employee) e ,Department d 
where e.departmentId = d.Id
and erank <= 1;

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

 

法一:窗口函数(dense_rank()) 

select d.name as Department, e.name as Employee,salary Salary from
(select *, dense_rank()
over(partition by departmentId order by salary desc) as erank
from Employee) e
left join Department d on e.departmentId = d.id
where erank <= 3;

其中 

select *, dense_rank()
over(partition by departmentId order by salary desc) as erank
from Employee;

#根据部门id分组,再对组内按照薪水从大到小排序,并生成对应的排名编号

再右连接Deparment表 输出排名编号≤3的

 

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

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

相关文章

DRG/DIP 2.0时代下基于PostgreSQL的成本管理实践与探索(下)

五、数据处理与 ETL 流程编程实现 5.1 数据抽取与转换(ETL) 在 DRG/DIP 2.0 时代的医院成本管理中,数据抽取与转换(ETL)是将医院各个业务系统中的原始数据转化为可供成本管理分析使用的关键环节。这一过程涉及从医院 HIS 系统中抽取患者诊疗数据,并对其进行格式转换、字…

数据缺失补全方法综述

数据缺失补全方法综述 摘要1. 引言2. 数据缺失的类型3. 数据缺失补全方法3.1 简单插补方法3.1.1 均值插补3.1.2 中位数插补3.1.3 众数插补3.1.4 前向填充和后向填充3.1.5 线性插值3.1.6 多重插补 3.2 基于模型的插补方法3.2.1 线性回归插补3.2.2 加权回归插补3.2.3 主成分分析&…

算法竞赛之离散化技巧 python

目录 离散化实战演练总结 离散化 不改变数据相对大小的情况下&#xff0c;对数据进行相应的下标映射&#xff0c;即离散化。 例如&#xff1a;【100,200,300,400,500】&#xff0c;离散化后为【1,2,3,4,5】 什么时候可以离散化&#xff1a;当数据只与它们之间的相对大小有关&a…

系统思考—业务协同

最近在和一些客户的沟通中&#xff0c;企业老板都提到一个共同的困惑&#xff1a;每个部门都感觉自己在解决问题&#xff0c;做了正确的事情&#xff0c;但为什么组织的绩效就是没有增长&#xff1f;更糟糕的是&#xff0c;大家都不知道问题到底出在哪里&#xff1f; 在这种情…

Git 详细安装教程以及gitlab添加SSH密钥

目录 一、下载安装 二、gitlab添加SSH密钥 一、下载安装 &#xff08;1&#xff09;去官网下载 找到下载的安装包双击进行安装。 &#xff08;2&#xff09;使用许可声明 双击下载后的 Git-2.47.1.2-64-bit.exe&#xff0c;开始安装&#xff0c;这个界面主要展示了 GPL 第…

编程题-两数相加(中等)

题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这…

电子应用设计方案103:智能家庭AI浴缸系统设计

智能家庭 AI 浴缸系统设计 一、引言 智能家庭 AI 浴缸系统旨在为用户提供更加舒适、便捷和个性化的沐浴体验&#xff0c;融合了人工智能技术和先进的水疗功能。 二、系统概述 1. 系统目标 - 实现水温、水位和水流的精确控制。 - 提供多种按摩模式和水疗功能。 - 具备智能清洁…

【MySQL】 库的操作

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】 库的操作 发布时间&#xff1a;2025.1.23 隶属专栏&#xff1a;MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…

一位前端小白的2024总结

目录 简要 一、迷茫点的解决 &#xff08;1&#xff09;前端领域该怎么学&#xff1f; &#xff08;2&#xff09;旧技术还需要学吗&#xff1f; &#xff08;3&#xff09;我该学些什么&#xff1f; 二、折磨点的解决 &#xff08;1&#xff09;学技术成果回报太慢怎么…

kettle与Springboot的集成方法,完整支持大数据组件

目录 概要整体架构流程技术名词解释技术细节小结 概要 在现代数据处理和ETL&#xff08;提取、转换、加载&#xff09;流程中&#xff0c;Kettle&#xff08;Pentaho Data Integration, PDI&#xff09;作为一种强大的开源ETL工具&#xff0c;被广泛应用于各种数据处理场景。…

Linux探秘坊-------5.git

1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…

Linux网络之TCP

Socket编程--TCP TCP与UDP协议使用的套接字接口比较相似, 但TCP需要使用的接口更多, 细节也会更多. 接口 socket和bind不仅udp需要用到, tcp也需要. 此外还要用到三个函数: 服务端 1. int listen(int sockfd, int backlog); 头文件#include <sys/socket.h> 功能: …

【2024年华为OD机试】 (C卷,200分)- 字符串拼接(JavaScriptJava PythonC/C++)

一、问题描述 问题描述 给定一个字符列表&#xff08;字符范围为 a-z&#xff0c;且字符数量 M 满足 0 < M ≤ 30&#xff09;&#xff0c;从中选取字符&#xff08;每个字符只能使用一次&#xff09;拼接成长度为 N&#xff08;0 < N ≤ 5&#xff09;的字符串。要求拼…

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器&#xff0c;支持轨迹控制与相机镜头控制 学习前言相关地址汇总源码下载地址HF测试链接MS测试链接 测试效果Image to VideoText to Video轨迹控制镜头控制 EasyAnimate详解技术储备Qwen2 VLStable Diffusion …

软件测试 —— 性能测试(jmeter)

软件测试 —— 性能测试&#xff08;jmeter&#xff09; 什么是jmeter安装jmeterjmeter常用组件线程组取样器结果树 我们之前学习了接口测试工具Postman&#xff0c;我们今天要学习的是性能测试工具——jmeter 什么是jmeter Apache JMeter 是一个开源的性能测试工具&#xff…

vs code为不同项目设置不同的背景图

vs code不同项目显示不同的背景图 效果展示 项目1-图 {"background.enabled": true, "background.interval": 0,"background.customImages": ["file:///C:/Users/Administrator/Pictures/bg.png"],"background.style": {&q…

防火墙安全策略

目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域&#xff1b;VLAN 3属于生…

OpenStack基础架构

openstack是一套IaaS云的解决方案&#xff0c;是一个开源的云计算管理平台 每一台物理机上都会有一个nova服务器 虚拟化其实是在nova主机里启用的 COW技术&#xff1a; 这么来看&#xff0c;3个物理机上产生10个虚拟机&#xff0c;所以把服务分散到10个虚拟机上和分散到4个虚拟…

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

如何实现各种类型的进度条

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了浮动按钮相关的内容&#xff0c;,本章回中将介绍进度条相关的Widget,闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 进度条是常用的组件之一&#xff0c;它主要用来显示某种动作的完成进度。Flu…