表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
题目来源:力扣(LeetCode)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combine-two-tables
解题:
首先分析,这是一道多表查询的题,题目就是组合两个表。需要用到SQL join 关键字。
SELECT Person.FirstName, Person.LastName, Address.City, Address.State
from Person
LEFT JOIN Address on Person.PersonId = Address.PersonId;
因为没有重复的列名可直接
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId;
先执行 ON
,后执行 WHERE
;ON
是建立关联关系,WHERE
是对关联关系的筛选。
所以不能用where,
如果没有人的地址信息,则使用子句过滤记录将失败,因为它不会显示名称信息。
如果要查询具体的某条数据需要在上边的sql后面加上where条件。
解题知识补充:
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
INNER JOIN 关键字在表中存在至少一个匹配时返回行。查询结果里Orders.OrderNo必须有结果才返回:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行:
返回左表所有的行,只是右表没有对应的匹配。
本题就用这个语句,题目要求:
无论 person 是否有地址信息,都需要基于上述两表提供 person 的信息,说明这个查询结果还是person的信息表,保留了person的所有信息,Address表如果有信息就匹配,没有就空着。
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
和left join刚好相反。
FULL JOIN: 只要其中一个表中存在匹配,就返回行
需要查询最全的表需要用这个关键字。