力扣刷MySQL-第一弹(详细解析)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 力扣刷MySQL-第一弹(详细解析)

🚀组合两个表

表: Person

+-------------+---------+

| 列名         | 类型     |

+-------------+---------+

| PersonId    | int     |

| FirstName   | varchar |

| LastName    | varchar |

+-------------+---------+

personId 是该表的主键(具有唯一值的列)。

该表包含一些人的 ID 和他们的姓和名的信息。

表: Address

+-------------+---------+

| 列名         | 类型    |

+-------------+---------+

| AddressId   | int     |

| PersonId    | int     |

| City        | varchar |

| State       | varchar |

+-------------+---------+

addressId 是该表的主键(具有唯一值的列)。

该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。

编写解决方案,报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为 null

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入:

Person表:

+----------+----------+-----------+

| personId | lastName | firstName |

+----------+----------+-----------+

| 1        | Wang     | Allen     |

| 2        | Alice    | Bob       |

+----------+----------+-----------+

Address表:

+-----------+----------+---------------+------------+

| addressId | personId | city          | state      |

+-----------+----------+---------------+------------+

| 1         | 2        | New York City | New York   |

| 2         | 3        | Leetcode      | California |

+-----------+----------+---------------+------------+

输出:

+-----------+----------+---------------+----------+

| firstName | lastName | city          | state    |

+-----------+----------+---------------+----------+

| Allen     | Wang     | Null          | Null     |

| Bob       | Alice    | New York City | New York |

+-----------+----------+---------------+----------+

解释:

地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。

addressId = 1 包含了 personId = 2 的地址信息。

思路:

1.观察到问题中有一个关键:如果 personId 的地址不在 Address 表中,则报告为 null 。

2.很显然,通过这句话无论 person 是否有地址信息都要返回信息,那么返回null,其实就是因为没有对应的城市和州

3.既然都要返回人的PersonId ,FirstName, LastName,要左表的全部信息,所以使用左查询

4.让person作左表,Address 作右表

5.我们分析出这一步还不算完成,我们还要知道左外连接on的具体知识,请看下面

6..很明显,在person表中,personId是它的主键,Address表中addressId对应了personId

7..那么我们的on后面的条件肯定是从personld这个字段来建立关系,关系就是p.PersonId = a.PersonId,由此可以返回出address表中的数据

8.select * from Person as p left join Address as a on 条件

9.把*优化一下

10.代码如下

select FirstName, LastName, City, State
from Person as p
left join Address as a
on p.PersonId = a.PersonId

执行:

注意:如果没有某个人的地址信息,使用 where 子句过滤记录将失败,因为它不会显示姓名信息。

🚀总结:关于on

在 MySQL 中,多表查询中的左外连接(LEFT JOIN)是一种用于连接两个表的查询操作,它会返回左表中的所有记录,以及符合连接条件的右表记录。在左外连接中,ON 后面连接的条件具体是指定两个表之间的连接条件,它决定了在连接时哪些行应该被匹配。

具体来说,ON 后面的条件通常是用来指定连接两个表的列之间的关联关系。这些条件可以是等值比较(例如,table1.column1 = table2.column2),也可以是其他类型的比较操作(例如,大于、小于、包含等)。这些条件决定了在连接时哪些行应该被匹配起来。

ON 的作用是在进行表连接时指定连接条件,它告诉数据库引擎在进行左外连接时应该如何匹配两个表的行。通过指定连接条件,可以确保在连接时只有符合条件的行会被匹配起来,从而实现多表查询的目的。

举个例子,假设我们有两个表 A 和 B,我们想要以 A 表的所有记录为基础,同时将符合某些条件的 B 表记录连接起来。在这种情况下,我们可以使用左外连接来实现这一目的。ON 后面的条件将决定 A 表和 B 表之间的连接条件,只有满足条件的记录才会被连接起来。

🚀超过经理收入的员工

表:Employee

+-------------+---------+

| Column Name | Type    |

+-------------+---------+

| id          | int     |

| name        | varchar |

| salary      | int     |

| managerId   | int     |

+-------------+---------+

id 是该表的主键(具有唯一值的列)。

该表的每一行都表示雇员的ID、姓名、工资和经理的ID。

编写解决方案,找出收入比经理高的员工。

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入:

Employee 表:

+----+-------+--------+-----------+

| id | name  | salary | managerId |

+----+-------+--------+-----------+

| 1  | Joe   | 70000  | 3         |

| 2  | Henry | 80000  | 4         |

| 3  | Sam   | 60000  | Null      |

| 4  | Max   | 90000  | Null      |

+----+-------+--------+-----------+

输出:

+----------+

| Employee |

+----------+

| Joe      |

+----------+

解释: Joe 是唯一挣得比经理多的雇员。

思路:

方法一

1.在这里面只有一张表,表中有一个很大的缺陷就是并没有去记录员工的直属领导是谁,只有一个字段managerId

2.这个managerId指的就是领导的id,所以managerId指代的就是当前表的主键,员工id

3.那么我们可以先找出员工对应的领导,如遇到这种类型的题,只有一个表,那必然是用到自连接的

4.提到自连接,就自然联想到了一句话,自连接查询中,必须要为表起别名,很简单的逻辑,自连接其实就是把这题想成两个表,一个员工表,一个领导表,只是说两个表长的一样而已,所以名字肯定是要不同,那么我们假设员工表是a,领导表是b

5.那么我们的员工对应的领导的连接条件是什么呢?

6.员工的managerId  = 领导的id

7.来实现一下这个过程(自连接的语法)

8.select * from Employee a join Employee b on b.id = a.managerId

9.但我们的目的并不是找员工对应的领导,我们还有一个条件,要员工工资大于领导工资,也就是a.salary > b.salary

10.我们又想起,连接两个条件的关键字是什么?and

11.此时select * from Employee a join Employee b on b.id = a.managerId and a.salary > b.salary

12.此时优化一下 *  

select a.name as Employee
from 
Employee as a
    join
Employee as b
    on
a.managerId =b.id and a.salary>b.salary ;

执行:

方法二:

1.嵌套查询,直接抓着工资硬刚

2.Employee表还是取一个别名a 作为员工表

3.select name as Employee from Employee as a where salary >  经理的薪资

4.也就是select name as Employee from Employee as a where salary > (select salary from Employee where Id = a.Managerid )

5.大于号后面的条件就理解为,查取员工对应的领导的薪资

6.整体理解为员工的薪资 大于 员工对应的领导的薪资,则查询出来了

select name as Employee from Employee as a where salary > (select salary from Employee where Id = a.Managerid ) ;

写到这里,每日两题的力扣就结束了,但是对于第二题来说,我个人认为肯定是自连接的方式让大家更为接受!

相关文章
|
6月前
|
算法 Go 索引
【LeetCode 热题100】45:跳跃游戏 II(详细解析)(Go语言版)
本文详细解析了力扣第45题“跳跃游戏II”的三种解法:贪心算法、动态规划和反向贪心。贪心算法通过选择每一步能跳到的最远位置,实现O(n)时间复杂度与O(1)空间复杂度,是面试首选;动态规划以自底向上的方式构建状态转移方程,适合初学者理解但效率较低;反向贪心从终点逆向寻找最优跳点,逻辑清晰但性能欠佳。文章对比了各方法的优劣,并提供了Go语言代码实现,助你掌握最小跳跃次数问题的核心技巧。
220 15
|
2月前
|
存储 SQL 关系型数据库
MySQL中binlog、redolog与undolog的不同之处解析
每个都扮演回答回溯与错误修正机构角色: BinLog像历史记载员详细记载每件大大小小事件; RedoLog则像紧急救援队伍遇见突發情況追踪最后活动轨迹尽力补救; UndoLog就类似时间机器可倒带历史让一切归位原始样貌同时兼具平行宇宙观察能让多人同时看见各自期望看见历程而互不干扰.
152 9
|
3月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
3月前
|
存储 SQL 关系型数据库
MySQL 核心知识与性能优化全解析
我整理的这份内容涵盖了 MySQL 诸多核心知识。包括查询语句的书写与执行顺序,多表查询的连接方式及内、外连接的区别。还讲了 CHAR 和 VARCHAR 的差异,索引的类型、底层结构、聚簇与非聚簇之分,以及回表查询、覆盖索引、左前缀原则和索引失效情形,还有建索引的取舍。对比了 MyISAM 和 InnoDB 存储引擎的不同,提及性能优化的多方面方法,以及超大分页处理、慢查询定位与分析等,最后提到了锁和分库分表可参考相关资料。
|
5月前
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
133 11
|
5月前
|
Go
【LeetCode 热题100】155:最小栈(详细解析)(Go语言版)
本文详细解析了力扣热题155:最小栈的解题思路与实现方法。题目要求设计一个支持 push、核心思路是使用辅助栈法,通过两个栈(主栈和辅助栈)来维护当前栈中的最小值。具体操作包括:push 时同步更新辅助栈,pop 时检查是否需要弹出辅助栈的栈顶,getMin 时直接返回辅助栈的栈顶。文章还提供了 Go 语言的实现代码,并对复杂度进行了分析。此外,还介绍了单栈 + 差值记录法的进阶思路,并总结了常见易错点,如 pop 操作时忘记同步弹出辅助栈等。
149 6
|
5月前
|
Go 索引
【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)
这篇文章详细解析了 LeetCode 第 739 题“每日温度”,探讨了如何通过单调栈高效解决问题。题目要求根据每日温度数组,计算出等待更高温度的天数。文中推荐使用单调递减栈,时间复杂度为 O(n),优于暴力解法的 O(n²)。通过实例模拟和代码实现(如 Go 语言版本),清晰展示了栈的操作逻辑。此外,还提供了思维拓展及相关题目推荐,帮助深入理解单调栈的应用场景。
153 6
|
4月前
|
关系型数据库 MySQL
MySQL字符串拼接方法全解析
本文介绍了四种常用的字符串处理函数及其用法。方法一:CONCAT,用于基础拼接,参数含NULL时返回NULL;方法二:CONCAT_WS,带分隔符拼接,自动忽略NULL值;方法三:GROUP_CONCAT,适用于分组拼接,支持去重、排序和自定义分隔符;方法四:算术运算符拼接,仅适用于数值类型,字符串会尝试转为数值处理。通过示例展示了各函数的特点与应用场景。
|
6月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
268 10
|
6月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
282 9

推荐镜像

更多