00:00
那咱们接着来讲,大家呢,这个脑子别晕,我这块呢,简单两句话做一个小结啊,时刻呢,这个咱们说呢,叫大处着眼,呃,大处着眼,小处着手,对吧?那么咱们刚才呢,是深入进去呢,去学这些语法规则了,那现在呢,咱们抬起头来看一看,咱们现在是讲到哪了,那么关于我们这个多表查询啊,咱们有三个分类的角度。呃,前面呢都还好让大家呢见见这个市面什么叫非等值连接,什么叫自连接,对吧?那么整体上来看的话呢,我们更习惯上呢,把这个连接呢,称为叫内连接和外连接了。那内连接和外连接,注意咱们SQ92语法和SQ99语法是不是说都能够去解决外连接的问题啊。啊,这个你一定要说是是的啊,只不过呢,咱们my circleq呢,不支持这个SQL92这种语法呢,来解决这个Y连接了,但不是说呢,这个circleq规范里边九二里边没有解决外链接啊,只是说呢,它不支持而已。好,诶Oracle支持是吧?好,那MYSQ不支持九二了,行,那咱们把目光呢,是不是就投向九九了,那在九九当中呢?哎,这个支持左外右外满外,但是呢,MYSQ呢,只支持这个左外和右外,没有支持买外。
01:14
啊,那当然了,人家Oracle呢,什么都支持啊,都是这个跟呃SQ这个官方标准呢,都是完全同步的,那卖SQ呢,比较矫情一点啊,又不支持买卖了,那不支持买卖,当然这个诉求咱们在MYSQ当中还是有必要的,那既然如此,我们就得想办法,呃在MYSQ当中是不是实现这个买卖的效果,就希望呢,能够看到我们的查询结果啊,这个这个没出来是吧,就希望呢,我们看到这个查询结果呢,是在这个的基础之上呢,是不是再加了一条,那上面员工没有部门那个员工的信息一共是123对吧?好,那也就是说呢,我们如果能解决的话呢,就相当于是把这个图给搞定了,那还有其他几个情况,一会儿呢,我们整体上做一个总结,大家在这个,呃,一个是笔试当中啊,这个笔试面试当中,另外呢,在实际开发当中,这呢都会遇到的,那什么是重点内容啊,就是笔试会考,面试会问开发会用的技术,那自然而然就是我们必须要掌握的技术,那这个呢,毫无疑问在咱们多半。
02:14
查询这个章节当中整个东西呢,你说我们融汇到一起啊,凝聚到一起以谁来表示呢?就是以这张图来表示,看看你能不能搞得定。啊,面试呢,就会问是吧?哎,多表查询呢,咱们说一个开发中也会用,另外呢,在优化方面呢,是不是也会呃,多次提到这个多表查询呢,所以这张图呢很重要啊行,那么要想实现啊这个满外连接的效果啊,咱们先要给大家再补一个内容,这个内容啊叫做union关键字的使用。咱们先来说一下这个unit。啊,先来说这个UN叫合并查询结果。合并查询结果说利用union关键字呢,可以给出多条select的语句,然后并将它们的结果呀组成单个结果集,那合并时呢,两个表对应的列数和数据类型必须相同,这就是一些要求了啊,哎,简单来说的话就是这意思,Unit内呢,咱们说就是联合的意思。
03:11
啊,联合的意思啊,这个联合国是吧?啊,我们团结起来啊,我们就union啊,啊就是把啊就是其实说白了就是取并集的意思,我们这里边这个呃,A表呢,大家可以看到是这个员工表,B表呢,可以看到是这个叫部门表。啊,部门表,那我们在这个查询的时候呢,是不是所谓的这个他们的这个公共部分呢,就咱们角内连接了嘛,对吧?啊,那么这个union的话呢,大家可以看到是啥呀,就是左表和右表中这个数据都要叫并集,那还有一个符号呢,叫做unit all。UNO啊,大家你能看出来这两个的区别吗?还能看出区别吧?区别呢,说这还不简单,不就是加了一个弧吗?啊,这这倒是哈,我这问的有毛病,那加了这个弧呢,你能感觉出来他想表达的意思有什么变化呢?
04:01
哎,那变化呢,就是那想通这个图呢,想描述出来的就是关于这个公共的部分呢,如果我们只计算一份的话呢,你像这个里边呢,相当于是以以这个B这块来衡量来计算了,是吧,就是纯粹的就是A这个缺的啊,就是不完整的A再加上一个完整的B,而我们这个加上O的话呢,就是把完整的A和完整的B呢都加上,那中间重复的部分呢,相当于是多算了一份。多算了一份,我以咱们讲这个员工表和这个部门表为例,我画的有点丑了啊,这儿呢,他们共同的内链接是不是106条记录这呢,有一条,这是不是有16条啊,这是员工表,这是部门表对吧?好,那如果说呢,意味着如果咱们要是用这个union的话呢,来去做,相当于结果就是一加上106加上16。就这个意思,这叫unit,那如果要用unito呢,那就是一加上106,这是人家A是吧,然后呢,哎,106加上16,那是不是人家这个B啊,所以这个结果呢,UN or和union的区别就是多了一套公共的交集部分。
05:07
啊,交际部分,那问大家,你说我们要是做这个买卖连接的时候,咱们用这个union还是用union all啊。啊,这个应该都能清楚,是不是,我们按说呢,应该用这个union吧,因为呢,咱们结果呢,就应该是123,你不能是123123再加个106吧,就不合适了是吧?哎,这是没问题的,行,这没问题好,那是不是就意味着我们这个用尼奥就开发中就就不用它了呢。哎,那么我想说的是,恰好。想法。蒙了是吧,恰好相反,咱们开发当中能用UNO的时候啊,大家尽量呢,就不要用union。我再说一遍,能用union all的地方呢,我们就尽量的不要用union,为什么呀,因为union all呢,就是纯粹的把A的数据集和B的数据呢,就是并在一起就可以了,而union呢,是不是要在union all的基础之上呢?再要去除一部分重复数据啊。
06:06
哎,就是咱哥俩呢,哪些重复的,我把重复的是不是要去掉,只算一份啊,所以说呢,Union在操作的时候呢,因为它要去重,所以导致它的效率低了。所以呢,如果说这哥俩都能用的情况下呢,咱们推荐使用union all。啊,推荐使用尼奥,那有同学就有问题了,说老师那要用药的话呢,刚才一说不就是多了一份106吗?那我们就可以不那样去做呀。对吧,你看我们发挥一下这个聪明才智啊。咱们现在呢,是不是想做这个图,做这个图的话呢,你是不是可以选择用这个图和这个图他俩union起来呀。他俩联合起来是吧,你要选择这个左上图和这个右上图,他俩要是联合起来的话。那中间你看是不是就有交集了,那你只能是用这个union。只能用,因为你要用in on的话呢,是不是就重复了一部分是吧,好哎,那没办法,哎,但是咱们都不建议用,那怎么办啊,大家你可以看啊,我是不是可以考虑左上图和右中图这哥俩连一起啊。
07:13
这个俩连一起,这个俩连一起的话呢,你看他们是不是就没有这种交集的部分了,进而的话呢,他俩咱们是不是就可以用这个叫a union all了呀。因为他们没有交际部分嘛,就也无所谓,就我就不用你再去多做一个驱龙的操作了,所以我们用UN奥iro用UN奥和UN奥union都一样,哎,都可以是吧?但是我们说用union的话效率会更高一些是吧?哎,或者的话呢,大建你用这个右上图和这个左中图,它俩一搭配用union or是吧?比这个union是不是就要效哎,效率更高一些是吧?哎,我们搭配完以后呢,就可实现这个图。那那这样的话呢,这个左中途和这个右中途他俩呢,作为一个UN是不是就是这哥们就出来了。哎,就出来了,行,那好了,咱们首先呢,大家能够明确一下这个UN和UN all它俩的一个区别啊,这个关于它俩呢,我就不具体体写例子了,因为咱们这个嗯,马上讲这七种情况呢,就都会讲啊,这是这个7.3,我这块呢写一个这个八啊,这个八呢,就是这个unit。
08:19
啊和这个IUN的使用。哎,它的一个开始使用啊,这块呢,我们想给大家强调的点呢,刚才我也已经说过了。啊,在这里边,诶在哪呢,在这呢。说这个执行UN尼奥时所需要的资源呢,比UN呢语句要少,就是它的效率会更更高一点,如果明确知道合并数据以后的结果,数据不存在重复的数据啊,或者呢,不需要去重这个数据,我们要用用尼奥啊,以提高查询的效率啊,这块呢就是他俩的一个对比情况。啊,或者我这块先写一下它这个union呢。哎,他呢,是不是会啊,执行这个驱虫的操作对吧,而这个UN奥。
09:06
哎,他呢,哎,不会执行驱虫的操作。哎,这个大家理解的话呢,你就这样想,就是它这多个单词嘛,Or呢,就本身就是都要嘛,所以呢,它就不去重了啊,就这样一个场景啊,这呢,我们想要说的这个结论呢,呃,是它。行,那关于这个UN和UN呢,我们就说到这儿,然后接下来的话呢,咱们说这个九是不是就是诶七种。哎,这个join。哎,七种照样的这个实现对吧,好,那七种照样的实现,来,咱们就上这个终极的图了啊。哎,我这样盯一下啊,把它变小一点,方便呢,咱们在这块呢,去一边看一边写,嗯,那咱们这块呢,相当于也算是一个总结了啊,这个七个图,咱们把这个A呢就当成是员工表,B呢就当成是部门表,咱们把这七种图,七个图呢都完整的去实现一下,那么我这块呢,起个名,这叫左上图左中图,左下图右上图右中图,右下图中图好,那首先呢,我们来实现这个中途比较简单,中途呢相当于是不是就是那链接。
10:16
好,来写一个例子,Select,我们就叫做啊。比如叫employee ID吧,然后呢,叫department name是吧?好,From employ employees,交个E,然后join一下啊,Departments叫D,然后呢,On啊,员工的啊,Department跟部门的department相等,这呢,是不是就我们说的这个内连接呀?一共呢有106条记录没问题是吧,好过了,然后接着呢,我们来看这个叫左上图,左上图呢,实际上就是叫左外连接吧。对吧,哎,我们只需要呢,把它CTRLC拿过来,哎,在这来一个left。
11:00
Left a。哎,Left啊,Al呢,省略了啊来走一下,这呢,107是不是就这哥们啊啊出来了接着。这个右上图。那就是右外连接。那我们呢,就只需要呢,把这个同样的操作拿过来,把这个left呢,咱们改成是一个right啊就可以了,来选中啊执行。哎,122没问题是吧,好,现在呢,我们把这个这个这个啊,这仨就都搞定了,然后呢,咱们先搞定谁啊。哎,我说一下,咱们先搞定中间这俩,只要这俩搞定了,嗯,这样呢,一搭配是不是就出来了啊,或者这俩一搭配出来这个,然后这俩一搭配出来这个,所以这俩呢是关键,这俩呢其实套路一样,所以呢,其中一个是关键,好那我们就先。说一下叫左中途。啊,左中图是吧,左中图怎么做呀,大家可以理解成是在咱们左上图的基础是上呢,把它俩相同的部分呢,给抹掉了是吧?在左上图的基础之上,那我们就是这个它的基础之上呢,哎,抹掉啊中间这个部分相当于给中间部分给它相同的过滤掉啊。
12:14
这个怎么过滤呢?哎,这有个小技巧,小技巧就是这儿呢,是他们关联的这个数据。啊,关联的数据呢,能能能找到,所以我们就都要了,现在呢,我就想要这个D的department ID呢,呃,是no。哎,这样的数据。我就想要啊,注意你看在我们这个左中途的时候呢,诶B呢,是咱们部门表啊,我找这个部门表里边这个盘是no的。那咱们这块呢,是不是都不是闹啊,你对你就要闹的,那我这块中间那个部分不就没有了吗。啊,一个小技巧来,我们走一下,哎,是不是就只把这个178这个人给查出来了。啊,这叫左中土。注意一下啊,刚才的解释,因为本身人家这个呃,相同的部分呢,就本身就都不是闹,你现在就非要闹的,那不就没有了吗?所以就不要它了,就啊好。
13:07
哎,这就我们说的这个意思啊,嗯,或者大家你怎么去体会啊,就是你看我们这俩查的时候呢,咱们可以再加上一个,比如我们叫department ID是吧,加上departmentd,然后这个位置呢,我们写上叫哎地点,哎别地点我写个E点吧。嗯,E点啊,或者叫D的也行是吧,好,你看我们先这样啊,去选择一下直行。啊,这样选择一下执行,哎,当然你会发现呢,咱们这块你看查出来的,就我这块没选择这个where啊,咱们查出来的话呢,你看这有107条记录啊,然后呢,是不是只有咱们这个人的这个位置是个闹是吧,那我现在就想要这个是闹的,那是不是就只有这一条记录了,因为这些都不是no啊。啊,这样的话呢,大家是不是也能理解。就是你要说刚才不好理解的话呢,我刚才这个解释呢,是另外一种方式啊好,左中途要是搞定了以后,接着呢,是不是就右中途了。
14:01
看右中图,就这哥们儿,那同样的道理,左中啊,你会了,右中是不是就在右上图的基础之上?咱们在这加上一个where是吧?Where什么呀,是不是就是你,诶他俩的这个A的这个字段呢,是no啊A相当于是E点,哎,Dependd,它呢是is not。啊,它是is not的啊解释方式呢,跟上面一样,哎,选中执行,诶这边16条记录就出来了。就是这个16条记录好,那么左中右中搞定以后呢,我们离成功呢就不远了,咱们接下来呢,去看谁啊,这哥俩呢,大家先做谁后做谁都可以。啊都可以好,那我们比如说就做这个了啊,咱们这呢,是不是叫左下图啊。哎,这个左下图相当于是不是就是马外连接啊。还没问题啊好,那这个满外连接咱们怎么做呢?哎,我这块呢可以选择啊,或者这样说啊,方式一咱们就是左上图是不是加上一下,或者咱们这样吧,Union呗。
15:06
哎,我用UN尼奥啊,哎是不是,哎又中途啊。中土。啊,左上图让他啊跟我们这个图取个并集,因为呢,他俩根本就没有交集,所以我是不是就用UN all哎,要更好一些是吧?啊用union行不行啊。哎,当然行了,但是他俩又没有交集,那你用UN尼奥效率会更高嘛,好,左上图,左上图是这个。哎,把它拿过来,右中途是这个。哎,CTRLC把这个呢,我们,诶往这放中间呢,加上一个。加上一个unit。哎,加上个unito是吧,好哎,这就可以了,这时候大家你要注意一下啊,咱们从语法上来讲,这是一个,哎,相当于我们查询出来是不是一个结果集摆这了,下面呢,也是个结果集,就是把这两个呢,我们就给它拼到一起了,所以呢,要求你是不是这个列首先列数得一样,其次的话呢,你这个列的这个字段的类型也得一样啊,这个是一个要求,你像我们这块呢,这是都是ID,这呢是不是都是name啊类型啊这个呃,这个这个这个个数啊,是不是都是相同的啊,这个时候我们去unit它才有意义啊,好选中以后执行。
16:20
当当当当,我们123出来了。咱们要查的是不是就是123呀。哎,你看最上面这块呢,相当于阻碍的那个不满足的一,然后再往下。哎,这是不是就出来了,是相当于我们那个原来的右外连接是吧,是不是感觉有点悲壮啊,明明在这个Oracle当中很省事的啊,也不一定非Oracle了,就是麦这个CIRCLE99语法当中。SQL99语法当中就写一个for out join了就能解决的问题啊,可惜MYSQL不支持啊,直接呢,非得让我们这样去弄一下。啊,还挺复杂的是吧,啊,但是呢,总归呢是能搞定了啊,然后呢,这是一种方式,咱们也可以呢,你选择这个方式二,咱们是左中途是吧。
17:06
左中图呢,是不是跟这个右上图去配啊。啊也可以行,那咱们找一下左中图啊,就这个。左中图啊,然后这个右上图。啊,右上图,右上图在这个。好,CTRLC。然后在这个位置我们写上啊UN看哦是吧,哎,把这个粘过来。没问题,好,然后呢,我们选中执行一下,那是不是也是123啊好,那我这个要把这个O去掉呢。哎,是不是也123,哎,因为呢,他哥俩呢,本身就没有这个重复数据啊,那你这块呢,加上没加on的话呢,他要去重,去重完以后发现也没有重复的啊,仅此而已,所以建议大家呢,就把这个on呢给加上啊。好,这呢就是我们说这个满外连接啊,说完了啊,满外连接说完了,然后接着呢,我们看这个啊,这个呢,就直接左中是不是跟右中它俩呢?哎,这个用内凹一下就行了。
18:05
啊,这个是我们叫又。下图是吧?哎,他呢,就是左中图。啊,UN一下这个右中图。哎,就可以了,是好左中图,左中图,哎,刚才我们这块呢,这是不是就那个左中图啊。哎,左中途,然后他去这个UN all。哎,又引啊,咱们这个右中图啊,右中图,右中图这个CTRLC。好,那么这个结果的话呢,应该是不是一加16是17吧,来选中啊执行那17条记录出来了。那就是这个是吧,哎,17项记录好,那这样的话呢,咱们哎呀终于啊,是不是把这七个图就够搞定了呀,好注意这块呢,我没有举具体的一个场景啊,说我们要查询什么什么什么,我们有具体查这个场景,然后呢,这里边呢,咱们就只是呢,把这七个图呢,把最本质的这个事儿呢,给大家说清楚了,一呢是我们从这个位置开始做的。
19:06
啊,七种这个重要的实现下边这七个操作,大家呢,需要去掌握啊,需要去掌握啊,那咱们这个课后练习这块。啊,咱们先看一下啊,这个课后练习这一块呢,咱们分成了这个两部分。哎,多表查询打开。那分成两部分,这个叫多表查询,一这块呢练的呢,不是我们说这个就当然里边也有这个外连接的问题了,只不过呢,我这块还专门给大家提供了一个多表查询的,二这个里边呢,专门是让大家去练这七个操作的啊,就是咱们不是说一共是有七种情况嘛,哎,你看这块呢,就有这七种情况。啊,这呢是以一个实际的案例来说的,这个案例呢,需要大家去,呃,用到这个新的这个表和这个数据了啊,你可以把这个操纵呢,给大家加一下什么意思啊,哎,我就不在咱们这里边去加了啊,比如我再去新建一个这个编辑器,呃,大家呢,这样去做,你找到这个练习以后呢,哎,你就从这儿一直到。
20:04
一直到这块啊,我们CTRLC一下。啊,回过来你CTRLV啊,这个我就去了啊哎,然后过来之后的话呢,上边这块呢,是创建两个表啊,你单独创建也行,把它选中呢执行一下啊这呢造了一张表,你看我这块选中表F5刷新,这不出来一个表就是它,然后这块的话呢,也去创建一张表啊一执行。然后这块呢,再一刷新,这不又做一张表,然后下边这块呢,你可以整体上去选中。啊,每一个都是一个词后语句,所以说每一个都得一个分号结束啊整体选中之后呢,我们做一个执行。啊然后呢,这块你F5哎,刷新一下啊,刷新一下这两个表里边呢,就有数据了啊,我就直接呢不写测库了啊直接打开这呢就是我们刚才添加的这些数据啊,员工表呢就是这些数据,然后呢,哎大家呢就可以在这个基础之上啊你把哎我们这个练习里边呢这呃七个问题啊CTRLC啊在这块拿过来,哎根据这个提示你就去写这呢就是具体的有这个需求了。
21:05
啊,有这个需求了,然后这块呢,是翻译出来,我们对应集合当中的是哪种解释啊,大家去练一练,然后这个呢,咱们一讲完这一章练习以后呢,关于多表查询的这个课后练习题,这是两波嘛,这个第二波这个呢,我就不讲了,就。啊,因为这七种情况呢,现在咱们都已经说过了,对吧,大家呢,自己去练啊,这个对应的答案呢,也都给大家了,那咱们呢,给大家呢,到时候再讲练习的话呢,主要就讲这个第一波这九个题目。啊是这个意思行,那么关于我们说这个七种照的话呢,咱们就说到这儿。
我来说两句