题目:
Write a SQL query for a report that provides the following information for each person in the Person table, regardless if there is an address for each of those people:
FirstName, LastName, City, State
解答:
SELECT FirstName,LastName,City,State FROM Person
left join Address
on Person.PersonId=Address.PersonId;
解析:
本题主要考察的的数据库中对 left join
的用法 :
left join
的实现效果就是保留左表的全部信息,将右表往左表上拼接,即使在右表中没有匹配的行,如果匹配不上则为NULL
join
的底层操作过程,其实就是从驱动表里面依次取出每一个值,然后去非驱动表里面进行匹配。其中,驱动表就是主表,如left join
中的左表就是驱动表,right join
中的右表是驱动表。被驱动表也叫做匹配表。
除了left join
以外,还有right join
、inner join
、outer join
等。
其中,Inner Join
返回满足第一个(顶端)输入与第二个(底端)输入联接的每一行。这个和用select
查询多表是一样的效果,所以很少用到
outer join
则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。所以通常意义上的left join
就是left outer join
,right join
就是right outer join
。
举例看一下两者的具体区别:
Table A:
aid | adate |
---|---|
1 | a1 |
2 | a2 |
3 | a3 |
TableB
bid | bdate |
---|---|
1 | b1 |
2 | b2 |
4 | b4 |
两个表A,B相连接,要取出id相同的字段
select * from a inner join b on a.aid = b.bid
这是仅取出匹配的数据
此时的取出的是:
1 | a1 | b1 |
2 | a2 | b2 |
select * from a left join b on a.aid = b.bid
首先取出a表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 | a1 | b1 |
2 | a2 | b2 |
3 | a3 | 空字符 |
select * from b right join a on b.bid = a.aid
指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 | a1 | b1 |
2 | a2 | b2 |
4 | 空字符 | b4 |