题目
表: 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 。
以 任意顺序 返回结果表。
解答
select FirstName,LastName,City,State from Person left join Address on Person.PersonId = Address.PersonId
知识点
解题思路
1.确定查询结果
题目要求查询所有学生的姓名,学号,课程和成绩信息
select 学号,姓名,课程,成绩
查询结果的列名“学号”、“姓名”,在“学生”表里,列名“课程”、“成绩”在“成绩”表里,所以需要进行多表查询。
2.哪种联结呢?
涉及到多表查询,在之前的课程《从零学会sql:多表查询》里讲过需要用到联结。
多表的联结又分为以下几种类型:
- 左联结(left join),联结结果保留左表的全部数据
- 右联结(right join),联结结果保留右表的全部数据
- 内联结(inner join),取两表的公共数据
这个题目里要求“所有学生”,而“所有学生”在“学生”表里。为什么不在“成绩”表里呢?
如果有的学生没有选修课程,那么他就不会出现在“成绩”表里,所以“成绩”表没有包含“所有学生”。
所以要以“学生”表进行左联结,保留左边表(学生表)里的全部数据。
from 学生信息表 as a left join 成绩表 as b
3.两个表联结条件是什么?
两个表都有“学号”,所以联结条件为学号。
on a.学号=b.学号
4.最终sql
select a.学号,a.姓名,b.课程,b.成绩 from 学生 as a left join 成绩 as b on a.学号=b.学号;
本题考点
考察多表联结,以及如何选择联结的类型。记住课程里讲过的下面这张图,遇到多表联结的时候从这张图选择对于的sql。