leetcode学习之路

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
实际上就是将两个表进行笛卡尔积运算,结果表的行数等于两表行数之积

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值