LeetCode175:组合两个表
一、题目描述
SQL架构
表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
二、解题思路
-
因为表 Address 中的 personId 是表 Person 的外关键字,所以我们可以连接这两个表。
-
考虑到可能不是每个人都有地址信息,我们应该使用 outer join 而不是默认的 inner join;在MySql中,用 LEFT JOIN即可。
-
如果没有某个人的地址信息,使用 where 子句过滤记录将失败,因为它不会显示姓名信息。
三、我的代码
# Write your MySQL query statement below
SELECT
FirstName, LastName, City, State
FROM
Person
LEFT JOIN
Address
ON
Person.PersonId = Address.ONPersonId
;
四、相关知识
SQL LEFT JOIN 关键字:
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SQL LEFT JOIN 语法:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
注释:LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。
另外:
- RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
- FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
- FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。