题目描述:
如下是Person表和Address表的信息,编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的FirstName, LastName, City, State四个字段信息。
Person表:PersonId 是上表主键
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
Address表:AddressId 是其主键
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
+-------------+---------+
解题思路: 1.由于Address表中的personId是Person表的外键,所以我们可以连接这两个表来获取一个人的地址信息。 考虑到可能不是每个人都有地址信息,我们应该使用 outer john 而不是默认的 inner join。 2.由于题目要求无论person是否有地址信息,都需要输出当前preson的字段信息,所以不可以使用where语句。 最终SQL语句: select FirstName,LastName,City,State from Person left join Address on Person.PersonId = Address.PersonId;
在left join时,ON与WHERE的区别:
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。