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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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

三、提交结果


image.png

四、MySQL连接的使用


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

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

图示:

INNER JOIN … ON …


image.png

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

LEFT JOIN … ON …


image.png

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

RIGHT JOIN … ON …


image.png

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

FULL JOIN … ON …


image.png

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

总结


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

image.png


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
安全 关系型数据库 MySQL
【MySQL】表的增删查改
【MySQL】表的增删查改
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
SQL 关系型数据库 MySQL
mysql sql语句删除一个库下的所有表
mysql sql语句删除一个库下的所有表
92 1
|
分布式计算 DataWorks MaxCompute
DataWorks产品使用合集之需要将mysql 表(有longtext类型字段) 迁移到odps,但odps好像没有对应的类型支持,该怎么办
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
112 0
|
关系型数据库 MySQL
LeetCode //MySQL - 184. Department Highest Salary
LeetCode //MySQL - 184. Department Highest Salary
57 2
|
关系型数据库 MySQL
蓝易云 - 如何修复MySQL中损坏的表
最后,为了防止数据丢失,定期备份数据是非常重要的。
226 3
|
SQL 存储 关系型数据库
MySQL数据库——SQL(1)-SQL通用语法、SQL分类、DDL(数据库操作、表操作)
MySQL数据库——SQL(1)-SQL通用语法、SQL分类、DDL(数据库操作、表操作)
152 1
|
存储 关系型数据库 MySQL
【MySQL】表的约束
【MySQL】表的约束
127 1
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表

推荐镜像

更多