LeetCode第175题:组合两个表(MySQL)


前言

明天的希望,让我们忘了今天的痛苦。

本题难度不大,在看题的过程意识到之前学习过的MySQL中的关于表格连接的知识掌握相对薄弱,借着这道题将表格连接的内容进行复习并在此留下记录。


一、题目内容

表1: Person

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+
PersonId 是上表主键

表2: Address

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+
AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

FirstName, LastName, City, State

SQL架构:

Create table Person (PersonId int, FirstName varchar(255), LastName varchar(255))
Create table Address (AddressId int, PersonId int, City varchar(255), State varchar(255))
Truncate table Person
insert into Person (PersonId, LastName, FirstName) values ('1', 'Wang', 'Allen')
Truncate table Address
insert into Address (AddressId, PersonId, City, State) values ('1', '2', 'New York City', 'New York')

代码模板:

# Write your MySQL query statement below


二、解题过程

1. 解题思路

数据库查询问题相对简单,本题要求无论Person表是否有地址信息,都要将两个表中的FirstName, LastName, City, State四个字段查出来。观察题目中的两个表可以发现,Person表中的字段PersonId是Address表中的外键,因此在连接时可以通过PersonId将两张表连接起来。在看到题目的第一想法是使用left join,因为Person表中的用户不一定具有具体的地址信息,所以想要在查询结果中保存Person表中的数据就需要使用left join的方式将左表的数据保存下来。

2. 解题代码

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

三、提交结果

在这里插入图片描述


四、MySQL连接的使用

如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。就涉及到了连接的问题,在MySQL中常用的连接有inner join(内连接或等值连接),left join(左连接),right join(右连接),full join(全连接)

  1. inner join:获取两个表中字段匹配关系的记录
  2. left join:获取左表所有记录,即使右表没有对应匹配的记录
  3. right join:获取右表所有记录,即使左表没有对应匹配的记录
  4. full join:如果某表中某一行在另一表中,没有匹配行,则相应列的内容为NULL

图示:

INNER JOIN … ON …

在这里插入图片描述

总结:inner join 连接查询到的内容为两张表的交集

LEFT JOIN … ON …

在这里插入图片描述
总结:left join 查询出左表的所有数据,右表中的数据如果有对应的数据就显示出来,没有对应的数据就用NULL来代替

RIGHT JOIN … ON …

在这里插入图片描述

总结:right join 查询出右表的所有数据,左表中的数据如果有对应的数据就显示出来,没有对应的数据就用NULL来代替

FULL JOIN … ON …

在这里插入图片描述

总结:full join为左表和和右表的集合,如果某一张表中某一行在另一表中没有匹配行,则相应列的内容用NULL来代替


总结

在实际的应用中数据库中经常会使用多张表的查询,很少会使用单张表的查询,因此对于多表查询的掌握更为重要,在多表查询中表格的连接查询首当其冲,接着这一道题再次对数据表连接方式做一个回顾与总结
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_飞翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值