leetcode学习:mysql
组合两个表
表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的关键字,所以我们可以连接这两个表来获取一个人的地址信息,考虑到可能不是每个人都有地址信息,我们应该使用left join
若地址表中查询的所有人的地址都存在
select Person. FirstName, Person. LastName, Address. City, Address. State from Person, Address where Person. PersonId=Address. PersonId ;
这么做没问题,但是,题目中强调了,人一定存在,地址不一定,所以where语句就行不通了
所以正确代码
select FirstName, LastName, City, State from Person left join Address on Person. PersonId=Address. PersonId;
知识点扩展
外连接包含三个方向
左外连接 left (outer) join
结果表中除了匹配行外,还包括左表有而右表中不匹配的行,对于这样的行,右表选择列置为null
右外连接 right (outer) join
结果表中除了匹配行外,还包括右表有而左表中不匹配的行,对于这样的行,左表选择列置为null
全连接 full (outer) join
完整外部连接返回左表和右表中的所有行,当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值,若表之间有匹配行,则整个结果集行包含基表的数据值
内连接 (inner) join
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行,例如,检索students和courses表中学生标识号相同的所有行
交叉连接 cross join
实际上就是将两个表进行笛卡尔积运算,结果表的行数等于两表行数之积