?🎉欢迎您来到我的MySQL基础复习专栏
☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
?博客主页:小小恶斯法克的博客
🎈该系列文章专栏:重拾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对应了personId7..那么我们的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
?子句过滤记录将失败,因为它不会显示姓名信息。?
在 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 ) ;
写到这里,每日两题的力扣就结束了,但是对于第二题来说,我个人认为肯定是自连接的方式让大家更为接受!