175. 组合两个表

106 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

一、题目

表: Person

+-------------+---------+
| 列名         | 类型     |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+
  • personId 是该表的主键列。
  • 该表包含一些人的 ID 和他们的姓和名的信息。  
表: Address

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+
  • addressId 是该表的主键列。
  • 该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。  

编写一个SQL查询来报告 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 的地址信息。

  • 来源:力扣(LeetCode)

  • 链接:leetcode.cn/problems/co…

  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

创建数据表

根据题意创建Person表和Address表,并设置各自的主键

CREATE TABLE Person(
	PersonId INT PRIMARY KEY,
	FirstName VARCHAR(20),
	LastName VARCHAR(20)
);

CREATE TABLE Address(
	AddressId INT PRIMARY KEY,
	PersonId INT,
	City VARCHAR(20),
	State VARCHAR(20)
);

INSERT INTO Person VALUES
(1,'Wang','Allen'),
(2,'Alice','Bob');

INSERT INTO Address VALUES
(1,2,'New York City','New York'),
(2,3,'Leetcode','California');

题解

上题讲要查看Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空  null 。首先因为要Person的所有数据,那么选择要么inner JOIN ON或者LEFT JOIN ON,这里不存在为null,那么久选择LEFT JOIN ON

SELECT FirstName,LastName,City,State FROM 
Person p LEFT JOIN Address a ON p.`PersonId` = a.`PersonId`

在写的过程中给Person和Address假名

  • 数据表显示

image.png

三、执行语句

测试结果

image.png

四、总结

INNER JOIN ON

内联查询:返回符合条件的交集

INNER JOIN .... ON ...

LEFT JOIN ON

左连接查询:返回左表全部数据以及符合条件的右表数据

LEFT JOIN .... ON

RIGHT JOIN ON

右连接查询:返回右表所有数据以及左表符合条件的数据

RIGHT JOIN ... ON

SELF JOIN ON

自连接查询: 返回自己表中符合数据的集合

SELF JOIN .... ON