龙空技术网

数据分析师的SQL第22课:查询数据-10-连接查询

Python-Jack 227

前言:

现时我们对“连接查询分为哪几种”可能比较讲究,我们都想要知道一些“连接查询分为哪几种”的相关文章。那么小编同时在网上收集了一些关于“连接查询分为哪几种””的相关知识,希望各位老铁们能喜欢,同学们一起来学习一下吧!

继续来写下一个查询,下一个查询要求查出每个学生的姓名和选课数量。在之前的查询中已经写过查学生的姓名和选课数量,但是这里查到的只有七个学生的名字,因为有三个学生是没有选课的。如果想把三个没有选课的学生也查到,这是应该怎么做?

·首先这里不能再使用类连接或者用自然连接的方式,因为这两种连接都只能把两张表里面同时满足连表条件的数据拿出来。比如在写内连接的时候,连表条件肯定是学生表的学号要和临时表的学号相同。

·在临时表里面只有七个学生的学号,因为这里的学号是来自于选课记录表,只有七个学生选了课,所以最后的查询结果里面只会有这七个学生,不管是用自然连接还是类连接都是同样的效果。

·这时候要怎么办?如果希望把学生表的十个学生能够完整的查上来,这个时候连表方式不能使用内连接或者使用自然连接了,取而代之的是外连接。这里需要使用的是一种叫左外连接的外连接,所以阻碍连接就是要把左表的数据完整的拿到,不管它满不满足连表条件。

·也就是当两张表形成迪卡尔集以后,在筛选数据的时候只要是着表的数据就要保留下来。这里有个新的问题,什么叫着表?所谓的着表就是写在表连接这个操作左边的表。比如在刚才查询里面,学生表写在均匀的左边就是左表,而临时表写在均匀的右边就是右表。

·左外连接是要让左表的数据完整的保留下来,不满足连接条件的地方会填上空值。所以请大家看一下,要把这里的自然连接修改为左外连接。left outer join,这个outer可以省略,所以也可以写成叫left join。

·现在让学生表做一个左外连接,连接上临时表。接下来这里需要写连表条件的,连表条件是什么?连表条件肯定是两张表的学号要相通,学生表的s、t、o、i、d等于临时表里面的s、t、o、i、d,这是联表条件。

·最后会得到什么样的结果?这里查到了一共有十个学生,其中包括了三个没有选课的学生也把它查上来了。刚才有说到在连表的时候不满足连表条件的地方会有空值填进来,这就是所谓的左外连接的结果。

·如果不想看到空值,比如学生没有选课,想把选课的数量记为零,可以稍微的处理一下空值。之前有讲过,如何处理空值?这里可以用一个函数叫colus,之前有说过coordinates是返回它的参数列表中第一个非空值。如果选课数量是有的就返回选课数量,如果选课数量是一个空值就返回零。

经过这么一个处理看一下最后的查询结果。每个学生的姓名以及选课数量都查出来了,所以将来在进行连表的时候有可能内连接得到的结果并不能满足需求,这个时候就要考虑使用外连接。除了左外连接还可以使用右外连接来进行连表。

所谓右外连接顾名思义就是把右表写在均匀后面的表的数据,完整的拿到。也就是说当在两张表做连接形成迪卡侬之后用连表条件去筛选数据,只要是来自于右表的数据就把它完整的保留下来,即便不满足连表条件,不满足连表条件条件的地方填上空值。

除了右外连接之外还有一种叫全外连接,所有的全外连接就是左右两表不满足连表条件的数据都要留下来,不满足连表条件就在对应的地方填上空值。如果要写右外连接可以使用right outer joint outer可以省略,如果要写全外连接可以写full outer joint outer可以省略。

有一点需要跟大家交代一下,就是mysicle并不支持全外连接,如果想达到全外连接的效果可以使用左外连接做一个查询,再使用右外连接做一个查询。把两个查询的结果用之前讲到过的一个关键词叫union,通过求并集的方式把左外连接的结果和右外连接的结果连接起来,这样相当于就是一个全外连接的效果。

再来看下面一个查询,下一个查询要求查询没有选课的学生的姓名。刚才是查到了所有学生的姓名还有选课的数量,其实在刚才这个结果的基础上就可以知道怎么去判断学生选没选课。

刚才在连表的时候如果右表那边产生了空值就说明不满足连表条件,而不满足连表条件的就是没有选课的学生。sq语句可以这样书写,查学生表用左外连接的方式连接选课记录表,但这里要给出连表的条件,连表条件仍然是两张表的学生的学号要一致。

刚才的查询已经发现了,在使用左外连接的时候三个没有选课的学生也能被查上来,但是对应到右表的字段的时候右表对应的字段都会填上空值,所以这个时候可以写上右表选课记录表里面的学生的学号为空。当然这里也可以写右表的选课记录号是空值或者写其他的字段都是可以的。

加上这个条件以后就会把那些没有选课的学生留下来,因为选了课的学生,对应到幼表是有记录的,对应的字段是不会为空值的。

看一下最后的结果,可以看到这里的三个学生就是没有选刻的,这就是阻碍连接的效果。可以用一张图为大家解释一下之前讲的连接查询连表操作到底有什么意义,有什么作用。

大家看这张图,之前讲的内连接相当于做的是两个集合的交集,两个集合只有满足连表条件的数据会被拿出来,而左外连接相当于可以把左表能够完完整整的拿到,而右外连接可以把右表完完整整拿到,相当于这里拿的是a级和这里拿的是b级和。

而刚才说了如果想达到a减b的差级的效果,也是用左外连接再加上一个筛选条件,b这边对应的字段是空值,或者要拿到b减a的差级可以使用uy连接加上一个筛选条件,a表这边的字段是空值。

由于买c口不支持全外连接,所以不能使用f auto join去拿到这么一个a集合并上b集合的效果,但是可以使用左外连接去unia一个右外连接来达到同样的效果。

如果要做两个集合的对称插,这里本来是应该用outer dream做这样的操作,然后设定好条件,a表这边的字段是空值,或者b表这边的字段是一个空值来拿到a、b集合的对称差。但是由于买c口不支持全外连接,所以就要用a减b的差级uni一个b减a的差级来达到对称差的效果。

所以大家可以通过这张图来了解都讲的连接查询连表操作到底有什么样的用处,会给我一个什么样的结果。这里还给大家留下了十个补充练习,也是使用学生选课系统可以完成的操作,大家可以好好思考一下这几个查询如何去写,通过做这些补充练习来提升写sq查询的能力,因为这项能力对于数据分析师来说真的是非常非常重要的。

标签: #连接查询分为哪几种 #连接查询有哪两类表示形式 #连接查询分为哪几种情况 #连接查询sql