计算机小白QAQ,因为想找数分岗暑期实习所以充了会员想集中刷一下leetcode的mysql部分。写这个系列博文和大家们交流一下,后面也会持续更新面经准备的一些问题,欢迎同好们一起交流,求大佬轻喷QAQ。因为自己初学也走了很多弯路,所以会尽量写得详细一点,如果可以帮助到后来的朋友们,请各位留言鼓励一下哈哈哈哈。
175.组合两个表
题目:编写一个SQL查询,满足条件,无论person是否有地址信息都需要基于上述两表提供person的以下信息:
FirstName, LastName, City, State
都是知识点呐朋友们!
关于表的连接join:格式 join(选择连接类型)on (表示条件,格式为表1.列名=表2.列名)
其中表1和表2可以采用 原表名as新表名 的格式实现重命名因为有的表名实在是太长了QAQ
join连接方式:
在这个地方mysql和mssql是略有区别的,先说一下共同有的left join,right join和inner join
在数学中我们都学过交集和并集的概念inner join类似于交集也就是返回两个表中有共同存在的部分,left join 是完全保留第一个表的内容看第二个表有那些和第一个表是一样的进行返回,right join刚好相反。这么说是不是有点听不懂哈哈哈哈,来给大家举个栗子,比如说第一个表的id序号为1,2,3第二个为2,3,4,然后inner join一下返回的就是2,3,left join返回1,2,3 right join 返回2,3,4,这么说就清晰很多了吧QAQ。
有区别在于MSSQL也就是SQL Server是有full server的(问题来了我当年为啥分别写俩QAQ)
full server是类似于集合中的并集,利用前面的例子就是说返回的是1,2,3,4.
mysql中是没有这个函数的,但是也是可以实现这个功能。具体做法是这样的,先左连接然后右连接再把两个表拼接再一起,在这个例子中,左连接得到1,2,3,右连接得到2,3,4然后拼在一起就得到1,2,3,4与full join的效果一样,拼接在一起用的函数是union,如果说join是左右连接,union就是上下连接,这样说清晰多了吧。这里的union是去重的拼接方式,union all是不去重的,如果在上述例子中用union all返回的是1,2,3,2,3,4,这一点在后面写较为复杂的sql中是常踩的坑之一(当然我说了也没啥用很多坑只有自己踩过了才知道QAQ)
害这只是个简单题我写了这么多,一百多题得写到哪百年QAQ
代码:
select FirstName, Lastname,City,State
from Person as p1 ##重命名
left join Address as p2 ##选择连接类型、重命名
on p1.PersonId=p2.PersonId ##条件
结果:
{"headers": ["FirstName", "Lastname", "City", "State"], "values": [["Allen", "Wang", null, null]]}##左连接过程中保留第一个表全部信息,但是有两项在第二个表里是没有信息的所以会返回null,在之前例子中左连接返回1,2,3但是如果select提到1,在表2中信息则该项会返回为null。