LeetCode习题总结-数据库(1)

第二十天LeetCode刷题-数据库

第二十天习题(1)—— 对个人信息的查询输出

此题仅为个人总结参考,如有错误还请指出

首先先上原题:

来源:力扣(LeetCode)
原题链接:https://leetcode-cn.com/problems/combine-two-tables/

该题总体来说,不算简单,属于基础类型的题目。题目中给定两个表,要完成对两表指定个人信息查询和输出(无论此人所对应的元素属性是否存在,如地址)。面对涉及多表查询时,我们一般通过对两表的连接操作来实现对两表的合并查找操作。
LeetCode习题总结-数据库(1)_第1张图片
而在选择联结操作的时候,会有三种可供选择的联结方式,分别如下:
1)左联结(left join):联结结果保留左表的全部数据
2)右联结(right join):联结结果保留右表的全部数据
3)内联结(inner join):取两表的公共数据
而根据题目要求我们可知:在给定的个人信息党人,对应人员的地址信息可能为空,所以我们此时则需要保存下对应的个人的身份信息,因为每个人一定有属于他的姓和名字。所以在这里,我们需要把以Person表进行左连接的操作,以此来保存所有Person表的所有消息。而针对链接条件,从该图中我们可以看出,两个表中所都拥有的属性为PersonId,所以我们可以根据PersonId为链接条件对两表进行链接。所以对应此题的查询操作过程如下:

# Write your MySQL query statement below
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
LeetCode习题总结-数据库(1)_第2张图片

第二十天习题(2)—— 指定查找表中第n大的元素

首先先上原题:

来源:力扣(LeetCode)
原题链接:https://leetcode-cn.com/problems/second-highest-salary/

拿到这道题目,题目给定一个工资表,要求完成第n大数的查找工作。对应于此题,我们一般可以有两种思路:(1)、利用max函数查找出的双重查询来实习。即先找出所有人中工资最高的那个人,然后再次使用max函数来实现查找比第一人低的最大值。(2)、使用函数解析的方法来进行查询,如此题中利用isfull函数来判断数据是否为空limit函数来实现对数据的跳跃查询等。
LeetCode习题总结-数据库(1)_第3张图片

方法1——使用嵌套查询方式和ifnull函数来实现对指定大小元素的查找

因为要本题要求如果对应指定查找元素不存在,则需要将对应的查询值返回为Null。所以在此我们可以使用isfull函数来实现对空元素的判定。对应的语法为:ifnull(a,b) ;如果value1 不是空,结果返回a;如果value1 是空,结果返回b。具体的查询方法见下:

# Write your MySQL query statement below
select ifnull(
(select max(distinct Salary) 
from Employee where Salary < (select max(distinct Salary) 
from Employee)),null) as SecondHighestSalary
;

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
在这里插入图片描述

方法2——使用ifnull函数和limit函数来实现对指定大小元素的查找

除了第一种方法中利用子查询来实现对指定元素的查询操作以外,我们还可以利用limit函数offset函数来实现对指定数据的跳跃查询方法。
limit函数的语法为:limit m, n;当limit后面跟两个参数的时候,第一个数表示要跳过的数量后一位表示要取的数量,例如:select* from article LIMIT 1,3 就是跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据。当 limit后面跟一个参数的时候,该参数表示要取的数据的数量。例如 select* from article LIMIT 3 表示直接取前三条数据。而当 limit和offset组合使用的时候,语法则为:limit m offset n;limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 。因此,利用该方法完成对指定数据查询的过程如下:

# Write your MySQL query statement below
select ifnull((select distinct Salary
from Employee
order by Salary desc
limit 1,1),null) as SecondHighestSalary
;

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
LeetCode习题总结-数据库(1)_第4张图片

第二十天习题(3)—— 指定查找表中比指定元素大的元素下标

首先先上原题:

来源:力扣(LeetCode)
原题链接:https://leetcode-cn.com/problems/second-highest-salary/

本题通过给定一张Employee表,要求通过查询对应员工的ManagerId查询其对应经理的Salary值,以此来查找出对应员工工资比经理工资高的员工名字。面对这样的需求,我们通常可以利用表的联结方式来实现对应。而从习题1中我们可知,一般的联结方式有三种:左联结、右联结以及内联结。在此我们利用内联结的方式来实现对表的复制操作,让原表的ManagerId复制表的ManageId作为联结条件来完成对数据的查询操作。对应的查询过程可参考下面:
LeetCode习题总结-数据库(1)_第5张图片

# Write your MySQL query statement below
select a.Name as Employee
from Employee as a inner join Employee as b on a.ManagerId = b.Id
where a.Salary > b.Salary

总结

通过对这三题的分析,我们可以知晓。如果所对应的数据操作涉及多表之间的查询操作,我们可以用利用三种联结方式(内联结、左联结和右联结)以及设定对应的联结方式来完成对指定数据的查询操作。而在针对指定查找第n大的元素时,我们可以单纯的利用子查询的嵌套或者利用函数解析(利用limit函数和offset函数等)来完成对指定元素的查询和输出操作。

你可能感兴趣的:(LeetCode习题总结-数据库(1))