00:00
那关于叫单行子查询,多行子查询,咱们就介绍到这儿了,那这呢是咱们从这个子查询的分类的一个角度,就是说你这个内查询的反馈的这个结果是一条还是多条是吧,我们进行一个分类,那我们第二个分类方式呢,就是又分为呢,叫相关子查询和不相关子查询,那其实我们刚才讲的这些呢,都属于叫不相关子查询,就是我们这个内查询跟外查询这个没有什么相关性。啊,这个怎么叫相关性,咱们前面已经解释过了,好,那下边的话呢,咱们来谈一谈,叫相关自查询,那相较于咱们上边这块呢,都叫不相关的,咱们做的那个案例呢,不是不是说这个注意哈,我不是说这个多行子查询和单行子查询本身是不相关的,是说呢,就是我们上边写的这些案例呢,恰好是不相关的而已,对吧。因为你像咱们分类的话呢,是从不同的角度来分的,你当然会出现这个单项子查询是相关的和不相关的,多项子查询也有相关的和不相关,这是不同的角度嘛,对吧,只不过咱们上面写这案例呢,恰好都是不相关的啊,注意这个说话还是要严密一点的啊,那接下来的话呢,我们看一看这个相关子查询的情况,从难度上来讲的话呢,这个相关子查询大家可能理解起来呢,就是稍微会有点儿困难。
01:11
来我们看它这样的一个执行过程,这个如果子查询的执行依赖于外部查询,通常情况下呢,是因为子查询中的这个表用到了外部的表了,并进行了条件关联。因此呢,每执行一次外部查询。那此查询呢,都要重新的计算一次。那么这样的这个子查询呢,我们称为呢,就称为呢,叫做关联子查询。下边还列出来这个关联子查询它的一个执行的一个步骤来啊,就是这样子的一个顺序,那说这个顺序之前啊,咱们先说一下这个不相关的子查询。不相关的杂询,你看咱们再回到最初这块说,谁的工资比阿贝尔的高?是不是这个问题啊,好,大家这个时候你再看一下,我们这个呢,叫做内查询,这样叫外查询,我们看谁的工资比阿倍的高,从外表上来看呢,一共有107条记录,我们就是一条记录一条记录的去取数据,那取完数据之后的话呢,我们去往里边放的时候,你会发现呢,每一条数据进去之后呢,是不是呃,都是跟阿贝的这个工资去比,那如果大家还有印象的话,咱们当时算出来应该是1100,一万一是吧,那每一个员工呢,都是跟这个一万一的这个值去比,一万一呢,相应相当于来讲,它就是一个常量。
02:25
那么我们这个不相关子查询它的一个执行步骤呢,其实就是两步,第一步呢,就是我们先呃执行这个内查询,把它这个结果呢计算出来是11000,然后第二步的话呢,就是我们去便利一下你这个表中的一条一条记录,每一条记录呢,取出salary,看看是不是跟一万一去比呢,是满足这种关系的,满足呢,那就是它就相当于这个结果是一,我们就要,如果结果呢是零,我们就不要了,最终呢,就查到哪些人是大于一万一的。就是第一步第二步就这两步好,那我们的这个相关子查询的话呢,它就跟我们刚才说的这个不相关的就不太一样了,以这个为例。
03:02
以这个为例,我这儿呢,就是个相关的,怎么来看呢,大家你会发现呢,我们在这个内查询的这个这个表的这个这个查询语句当中,我是不是出现了外部的这个表了呀。那不就相当于我们这个外部表中会把这个数据呢,给大家送进去。会送进去。来,你看举个例子,我们怎么叫这个内查询,此时呢,它的执行过程是这样子的,首先呢,取这个外表当中的一条记录,然后把这条记录呢给他送进去。给他送进去,这呢,就是我们说的第一步啊,就相当于这个是从主查询当中获取候选的列,那比如说我们员工表的话呢,就是呃,每一行的数据是吧,都是满足的,那我们把这个呢,第一条数据呢,先送进去,这是第一步,然后第二步呢,送进去的这条数据呢,你根据他题目的这个需要呢,你看他怎么去用,用的是你这边这条记录的哪一个字段,然后第二呢,就是相当于是我们内部的一个查询呢,就开始去做这个运算了,所以呢,叫ecute子查询呢,使用主查询的这个数据啊做这个运算,运算完以后呢,是不是就返回一个你select的这样的一个结果是吧,可能是一个列,也可能是两个列。
04:07
这是第二步,然后第三步是什么呢?第三步呢,就是拿着你当初送进去的那条记录和这个二返回的这条记录呢,去做一个比较。看看是不是满足你这个比较的这个条件,那如果满足呢,这个结果就是一我们就要,如果是零呢,就不要了。那就是这样的一个情况。就是这样个情况,这个大家呢,可能听起来还是有点抽象,你看我们下边这个例子。诶,咱们还是先剖析下边例子说查询员工这个当中工资大于本部门平均工资的员工的这个信息,那大家来看,如果我们这个外边呢,就是呃,员工表就是每一个员工啊,一共107个,对吧?那么我们这个内查询应该查什么呀?是不是就应该查你这个员工本部门的平均工资啊,那比如说进来的这个叫张三,然后我们就把张三呢,先取出来,把它送进去,第一步第二步呢,获取张三所在部门的这个叫什么呀?平均工资是吧?这是第二步,然后第三步呢,你再看看张三的工资跟呃,获取到的这个张三所在部门的平均工资呢,是不是满足这个大于的关系。
05:12
是不是要大于的吗?满足这个关系呢,结果是一我们就要,不满足呢,我们就不要了。这是我们说的这条记录好,这条记录完了以后呢,我们接下来是不是来看第二条记录,第二条记录比如叫李四,那么把李四呢,这条记录送进去,查一下李四所在部门的一个平均工资,那有可能跟张三他俩不是一个部门,所以说呢,每次我们都需要呢,是不是执行一次这个内查询呀。诶,查完之后呢,返回回来,这就是李四部门的平均工资了,再看看李四的工资跟得到的这个平均工资满不满足这个大于的关系,满足就要,不满足就不要了。这个呢,就是我们说的这个,诶叫相关子查询,每一次呢,大家会发现都会去执行一次这个内查询是吧,跟我们刚才说到的这儿不一样,这块呢,是不是就执行一次,得到的是一个常量了,你谁过来比都是11000,哎,所以跟我们这个就不一样,嗯,那个呢叫不相关,这个呢就是相关的,好那我们来看一下这道题目呢,咱们该怎么去做。
06:06
Con。哎,这个我们拽到最下边这呢,是我们这个第六个点叫做这个诶相关子查询啊,整体来讲呢,相较于我们上面不相关的,它要难度大一些,来CTRLV一下粘过来。来这道题呢,我们去看看怎么去做,行,那我们要查询的是员工的,还是这个意思,查询员工中啊这个呢,相当于整体上还是一个定语,查询的就是这几个字段,好,Select lastname。哎,然后呢,这个salary。还有呢,叫department ID。对吧,哎,From an employees。没问题,好,那怎么着呢,说where,我想查的是这个员工的这个工资得大于什么要求呢?我们这个salary。得大于哎某一个东西是吧,那原来的话呢,咱们上面做过一道题,说呢,这个工资大于本公司平均工资的信息,哎,这个题目呢,这样子吧,我们先改成是一个比较简单的啊大于我我我这么着。
07:13
CTRLC一下,咱们先写到,我把这个先放到这儿,大于本公司。这个呢,不是一个咱们相关的查询呢,这写成是一个回顾,这个题目呢就比较简单了,大于公司平均工资的,那这个位置呢,我们就是不是获取公司的平均工资啊,好,大家看select一下,叫avg的一个salary。那from。那employees。没问题,行,那这呢,我们算出来的是公司的一个平均工资,然后呢,说每个员工的工资看是不是大于这个6461,每个人比的话呢,相当于内部返回的都是一个常量,对吧?哎,那有这样的一些员工呢,他是满足的。这个呢,大家清楚以后呢,我们再看下边的问题,刚才呢,我们提到了说里边查出来的,对于外边的每一个数据来讲,它都是这个6000多那个数据,那大家你看啊,我先写一个不满足我们的题面的,但是大家呢,有助于大家理解的,比如我这我写个where where什么呢?我叫做department ID等于等于。
08:15
我就随便写一个60的。但是你看我们要这样写的话呢,你能理解什么意思吗?我相当于这个时候呢,是不是查询员工当中这个工资啊,大于是不是60号部门平均工资的员工的信息啊,那60号部门员工的平均工资是多少呢?是这个数,那只要呢,工资比这个数大是不是就可以。对吧,就可以,那此时的话呢,相当于它还是一个叫不相关子查询,因为呢,我们是拿每一条数据都跟这个5760呢去比较的。对吧?好,那我们现在呢,不希望说比的是60,比的是谁啊,我们现在变的是不是这个数,它变成谁呢?变成谁,那就看你外边呢是跟谁去比了,第一条数据呢,你看你是哪个部门的,我们这个位置呢,就用那个部门,你第二条数据是哪个部门的,我这个位置呢,就也用那个部门,诶那相当于这个位置呢,是始终在变的,那怎么去体现这个变化呢?我说呀,这个位置呢,我起一个表的名字叫一一,这个呢,我们叫一二。
09:11
一个一一,一个一二,或者你这个叫al也行,这个叫inner是吧,好,那么我们这个60的话呢,就不能写成60的,咱们写成一一的department ID。诶,大家此时看,我们在这个内查询当中,我就使用了这个外部查询中的这个表了,那此时呢,就构成了一个叫相关性的概念。相关性的概念对吧,那怎么去理解呢?我们外部的这第一步是吧,外部呢,我们一共呢,有107条记录,咱们先取出来其中的一条,然后把这一条记录呢给他送进去,这是第一步,然后第二步的话呢,我们送进来的这条记录呢,获取一下你的这个底盘卖地,举个例子啊,比如说是90万部门,然后我们里边的话呢,是不是就查询一下,过滤完数据以后呢,我只要90号部门的一个平均工资啊,这不就第二步嘛,然后把92部门平均工资呢给获取这个这个查出来了,然后外边呢,你再看你第一条数据,92部门的这个人是不是工资大于这个平均的是呢?就要不是就不要了。
10:08
然后接着的话呢,是不是接着我们再走一下这个第二条记录,同样的进去之后呢,第二条记录如果是80号部门的,那我们里边呢,是不是就算80号部门的平均工资了,哎,就是这样的思路,从形式上来看呢,来讲的话呢,就是我们外部的这个表呢,你会发现呢,它存在于我们这个内部的这个查询当中了。那此时呢,就构成了一个叫相关自查学。来,我们执行一把。那这个就出来了。啊,只不过这个大家你不好去验证了,不好去验证了,那你就得看他具体这个部门里边的平均工资是多少是吧,那才行好,那这个题目呢,就这样来做。那希望大家呢,能够去体会一下。啊,去体会一下好,那这道问题的话呢,咱们就讲了一个叫做相关查询。啊使用啊相关。哎,大逊来做的。好,然后呢,我这道题,咱们咱们单说这道题来讲,实际上呢,这道题呢,还有其他的一个写法,那我这再讲一种写法。
11:03
啊,只不过这种写法呢,它不是这个叫相关查询了啊,什么写法呢,我们就是在这个from当中呢,去写这个查询。哎,在from当中去声明这个查询,咱们在上边讲的时候呢,是不是也出现过了,我呢,是不是也在这个from当中去写这个查询呢,是吧,哎,这个呢,也用的是这样的一种方式。好,嗯,这个呢,要想写的话呢,需要大家你对这个题目呢,有一个整体的一个把控啊,比如说我们现在呢,你看我在form中写,相当于是不是我们把查询的结果呢,作为一张表了,是吧,现在我们有的是什么呢?是不是有的就是这个员工表啊啊一共呢,有107条记录,我们现在缺一个什么呀,你不是要跟这个每个部门的平均工资,呃,跟自己所在部门的平均工资去比吧,如果说我们现在有一个表是什么呀,就是各个部门。啊,以及各个部门的一个平均工资,如果这个表要是有的话呢,我们是不是就这块儿取一条记录,然后呢,你去找他对应的这个部门呢,看一下这个平均工资是多少,是不是满足这个大意的关系,进行一个多表的查询也是可以的呀。
12:03
哎,那我们这个题目的思路呢,它就是这样子的。就这样子的。如果大家呢,你要是听懂的话呢,最好没听懂了,我们下边来写,我呢查询一下各个部门的。平均工资。Employees。那然后呢,接着加上这个勾。好,这呢,是不是我们查出来了,各个部门的一个叫平均工资啊。哎,没问题是吧,哎,这个闹呢,留着就先留着,这个查转完以后呢,我呢,意思就是说把这个结果咱们当成是一张新的表。把它当成新的表,那就意味着我们把它呢,是不是放到这个from当中是吧,那from的话呢,其实我们还要用一下这个员工表啊,所以我就先写个E,然后逗号一下,然后把我们这个呢给它包起来。那相当于呢,我们此时呢,这个查询的结构呢,就充当了另外的一张表,好,这有两张表了,那那这是一张表,我们说呢,刚才上边演示的时候也是必须要给这个表起个别名,对吧,我们就t dept,然后呢,Avg的一个SL行,这是一个table啊,通过这个T呢能够看出来。
13:12
那么这是一张表,这张表,然后呢,我们现在呢,是要查什么呀?哎,就是首先呢,先先说把这个加上吧,既然两张表呢,一定有这个连接条件,连接条件就是这个员工里边,里边的这个叫department ID,它跟我们诶自己这个相当于组合出来的这张表。它的一个叫department ID是不是应该是相等的是吧,那这有一个这个相等的这样一个关系好了,然后接下来的话呢,我们需要呢,找什么呀,是不是我们要求这个员工里边这个找到的这个员工,他的这个工资啊,是不是得比他对应的你找到跟他同一个部门的这个值要大才行啊。哎,那就好说了,那我们就来一个and and呢,就是E的这个salary,它应该大于咱们对应的这里边儿这个表中的那个。是不是这个平均工资了,对吧,这时候注意注意一个细节,大家这时候再写的话呢,你就不要这样去写了。
14:04
因为呢,此时咱们这块呢,是把这个结果是不是当成是一张表了,那么此时呢,这个就呃是作为一个具体的字段出现了,不要让不要把它再看成是个函数了,所以呢,大家必须呢给它写成是一个别名,注意我这块说的是必须啊,那么这时候呢,我们只是作为咱们这个表的一个字段出现的,而不是说呢,作为一个函数功能出现的了,那这时候我们这样写,诶,那这个就是大家是同一个部门的了,然后呢,我们看一下这个员工的工资呢,是不是比这个部门的这个平均工资呢,是不是要高,那是不是就这样来处理啊。好,那这时候我们要查的什么呢?诶你select是不是就这几个字段,CTRLC一下啊粘过来,粘过来以后呢,要小心一点,就是我们员工表跟你这个临时生的这张表呢,都有这样一个字段,我们要查的呢,都是来自于这个员工表里的,所以呢,都加上这个一点。一点是吧,诶这样的一个方式行,那么此时呢,我们选中啊,再执行一下这个结果呢,就出来了,38条记录,咱们跟上边这个你可以做一个匹配,匹配是吧,也是38条记录,哎,没问题,好,那这道题呢,我们就讲完了,讲了两种方式,一个呢叫相关子查询,另外这个呢,叫from当中去写这个子查询,这个结构的话呢,其实也挺简单的,但是需要大家呢对这个题目呢有个整体的把控。
15:16
就是当你写的多的时候呢,你会有意识的呢,会去在这个from当中去写这个杂询,那像这样的一个思路的话,就是很多时候呢,都是由于我们想做查询呢,但是这个查询的这个表呢,它不是存在的,需要我们经过一个查询去得到,那么这个时候呢,你就可以把这个查询的结果呢,放到from当中,作为一个表给它固定下来。OK啊,这就我们说的一个比较好的一个思路,行,那么这个呢,我们就通过它呢来说清楚的就是呃,相关查询,那咱们可以再去举例子来,大家看这个,这个里边呢,是在order by当中去使用自查群,那也挺有意思的。来看一下,说到查询员工的这个ID和salary,嗯,OK,那就来查查询他的employ employee ID,还有他的这个salary。
16:03
没问题是吧?From employees,完事了说排序啊,排序加倍。行,哎,按什么排呢?来这块崩溃了,说按照department name来排。哎呀,Department name是不是根本就不在我们的员工表里边啊?那怎么办呢?那就意味着我们需要呢,诶结合着这个员工表,我们去找到每一个员工在部门表里边这个department name,然后让他们呢,是不是按照一个顺序来排是吧?哎,那这块呢,Orderbi怎么办呢?哎,又是一个查询啊,又是个词查询,大家呢就得开开眼,我们按照什么呀,咱们就得是select一下,叫做depart。A name是吧?诶,From叫departments,然后这是个表,然后呢,我们外边这表呢,我们起个名叫做E,啊,这个呢起个名叫D,那怎么办呢?咱们是不是就得通过你这个员工表的department ID,找到这个部门表的department ID,然后对应的这个name呢,我们就得找到呀,然后呢,Order by一下就找你这个name。
17:03
哎,就是这个道理。就这个道理,就相当于原来的时候呢,比如说我们要是没有他原来的话呢,如果我们这块写一个叫department ID啊,这个什么意思呢?就是我们找到每一个员工,然后这一条记录呢,我们找到他的ID,然后比如说我们就诶第一条记录呢,你就放到这儿,这个ID呢,是是多少心里有数,比如说这这个90是吧,然后呢,又来第二条记录的话呢,我们也要往这放了,但是往这放的话呢,你要考虑一下第二条记录呢,你看一下盘ID如果是80,那你这时候呢,就要往上放,哎,80放上边,然后再来了,哎,这个西十啊,其实再往上放,相当于我们每一条记录呢,都要取出他们具体的department ID的值是吧,那现在这个题目的话呢。你又不是取这个department ID了,而是呢,诶,你找到第一条记录了,然后把这条记录呢,是不是就得送进去,根据你的这个ID找到这个表的ID,然后找到它这个name啊,比如说是这个it部门的,好,你就放这了,然后再来一条记录的话呢,再送进去发音回来是一个啊,比如说是这个CRK部门的啊,这个C开头的,你要是升序排列的话呢,这个clerk呢,这不就是得往上写吗?
18:07
没问题是吧,哎,所以说这块呢,我们就得顺着你这个department ID呢,去找这个department name啊,Order by一下啊,这样就可以了。那那你要是升序排呢,你就后边呢,就A省略也行,你要降去呢,就显示的把那个de呢写上来,我们选中呢,执行一下,这就出来了。哎,这就出来了,一共107道记录,只不过呢,这时候你可能一眼你看不出来了,因为咱们也没有列那个department name那个字段是吧,那你就看不出来了而已啊。好,这个呢,就是咱们说的在order by当中去写这个查询。大家现在来看的话呢,是不是觉得说我们这个紫茶菌这个位置啊,非常的灵活呀,哎,那我们这块呢,哎,先给大家写这样一个小结论啊,写个小结论这块的话呢,我们这么着一下,结合着咱们前边写的这个代码,或找一下这个聚合函数。放到这个最后。因为这块呢,是不是咱们讲的这个整体上来讲的算是比较完整的是吧,那我们相当于在这个基础上呢,看看在哪些位置可以去写这个子查询呢,来我们拿过来。
19:11
一个结论。我们先说一下这个结构,咱们把它放在这儿。哎,这样我加个星。哎,这是这个是吧,那么结论是什么呢?咱们在select当中可以写子查询。在词中可以写,只不过咱们还没写过,对吧?那课后练习题呢,是有的,嗯,在这能写,From中呢,咱们也写过了,那么这个where中呢?呃,Where中也写过了。这个位置注意不能写having中呢,咱们写过了。Order by中呢也见到了,Limit中呢不能写,这就是数值嘛,所以说呢,我们这个结论呢,就是在查询当中。这个查询在这个select的这个结构中,哎,我们说除了这个叫BY。和咱们的这个limit之外。
20:03
其他位置都可以啊,声明子查询。是不是就非常的灵活了?有些场景呢,只不过我们还没有见到而已,比如说在这个select当中,我们还没有见过是吧?诶课后联题呢,就有行这个我们就把这个结论呢,大家稍微关注一下,然后接下来的话呢,我们再来看一下这个这个其他的这个题目呢,就来把这个呢,我们选中CTRLC1下来做一下。那咱们接下来的话呢,其实就是多做这个题目,大家呢,对整个我们这个子查询这块呢,去熟悉熟悉啊,因为相对来说呢,它的难度呢会大一些,好看这个。说若员工表当中的这个employd跟job history中的employd呢?这个相同的数目呢,不小于二。那么我们就输出这些相同的ID的员工的123,哎,这里边又引入了一个新的表叫job history,这个表呢,大家可能不熟,来我们去查询一下,就是在我们这个表里边呢,叫job history,是不是就他呀,那select清一下,From叫job。
21:04
啊,来我们这块呢,做个查询。那就出来了啊,这个数据呢,还不少了十条,那这个呢是什么呀?就是你看这个101是这个员工表中的一个员工,这个员工的这个start开始和结束的时间,他是这个招白地,然后呢是在这个部门的,然后呢,又从这个呃,十月27的下一天,十月28呢,到这个时间呢,他又跑到这个部门呢,是做这个工作的,那这呢,其实就相当于我们这些员工history嘛,历史就是他的这个在公司内部的一个调岗的一个情况。啊,调岗的一个情况,然后在这里边呢,都有所记录,然后相当于呢,我们这个表在找什么呀,就是看一下这个员工也不小于二的,我们找到就是大于等于200,言外之意呢,就是这个员工呢,这个调岗过两次及以上的。是不是我们就把它插出来是吧?哎,那么现在实际当中啊,这个公司里边的每一个员工啊,他都会有一个员工的一个ID啊,尤其你去大厂的时候呢,也是这样啊,大厂呢,比如有的时候这公司他都达到这个好几万人了。
22:01
那好几万人,甚至十几万人,几十万人这个都有是吧,那么每个员工都有一个工号,哎,你一说你这个工号呢,是比如说5000以内的,哎人家大概知道,哎呀,这是前辈,那因为你已经是3万多了,人家是5000以内的,或者2000以内的,那绝对都是公司里边这个元老级的这个人物了,是这意思吧,就即使呢,他的这个现在不是管理者,那至少呢,他也是一个,哎老员工,那你也得去尊重人家。是这意思吧,哎,那么哎,那么我记得我前年的时候去这个百度。在这个中关村去百度啊,百度那块呢,就是呃,站在一块地儿还是很大的,好多栋楼都是这个百度的,呃,据说呢,就是当时那个接待的那个经理跟我讲,说他们的这个除了呃员工睡觉呢,不能在这儿,其他的全部都可以在这儿,比如说你的娱乐呀,包括那个日常的剪头发呀,健身呢,他们整个几个楼呢,楼顶都是连在一起的,有跑道啊,都可以在整个这个百度的园区里边去活动。啊然后呢,呃,就是吃饭的时候就看到这个员工呢,那时候在几年前呢,就可以去刷脸了,直接呢刷脸支付,嗯,这个每个员工呢,都有一个员工的员工号是吧?然后呢,我只看到吃饭点饭那个在食堂吃饭的时候呢,有个员工的员工号呢,是有个杠四是吧。
23:10
我说这是什么意思啊,呃,他说这个,呃,员工的话呢,正常来公司是有一个员工号的,然后呢,如果这个员工呢,离职以后呢,又回来了,那这时候呢,就没有给他再分配一个新的工号,而是把他原来的工号呢给启用了,就后边标一个杠一。哇,他一说到这儿的话呢,有点惊讶,那杠四呢,现在这个哥们呢,是不是来回好几次啊啊挺有意思的啊,那这个呢,呃,离职的又回来了啊,在一些大公司当中其实是比较常见的啊,有的呢,比如说你到这个P6啊P7的时候呢,就很难升上去了,那有的人呢,就选择离职了啊,到这个这个竞品公司当中是吧,或者到一些创业公司当中去这个。工作,然后呢,这个呃,竞品公司呢学的挺好了,然后回头呢,又被这个呃自己原来这个老大呢又给叫回来了,叫回来的时候呢,可能这个级别就往上升了,P加了。啊,或者呢,这个P8了是吧,会是这样一个情况,或者的话呢,有很多呢,就是出去创业以后呢。
24:00
这个创业的这个项目呢,非常靠谱,然后就被这个老东家呢,就给看上了,那自然而然的话呢,你要是被收购呢,优先考虑就是老东家嘛,然后呢,老东家就把你收购,呃收购了,收购以后呢,那可能就不止是PC了,有可能一下子就蹦到更高的一个级别了。那相当于呢,刚才说这杠四呢,杠四呢,呃,肯定这哥们儿呢,我觉得不是说自己离职以后又会来,离职以后又回来,那这样的话肯定。是吧,这个公司也不至于导师接受他啊,那也有可能出去就是创业过,然后又回来了啊,有出去创业了又回来了是吧,然后呢,就是好几次啊。行,这个我们拉回来,诶我们现在的话呢,就是相当于要从这个,诶这个赵history当中,我们去看一看,说哪些员工呢,他来这个公这个在这个内部调岗超过两次了。那是这个意思对吧,那就意味着我们需要呢,从这个员工表里边呢,去找这个员工跟这里边儿这个,比如说employee呢,是不是做这个匹配,然后看一下这个匹配完以后呢,这个个数。啊个数的话呢,是有多少个是这意思吧,哎,这个大家可能现在一说想写好像没有这个把握,那我们呢,就还是啊这个不知道自己能不能写出来,那我们就让每一个条件呢,都尽量的发光发热,那我们可能写着写着是不是就出来了。
25:07
来看一下说这块,如果说说这个不小样,我们就输出这些员工的,那这块呢,其实就是要查的是这个信息,查询什么呢?查询employee ID。然后查询他们的last name,还有他们的这个叫赵白,然后from一下这个employees,没问题是吧?好,然后呢,写了一个where,条件怎么着啊。我们是得找到这个员工,那我们员工表里边儿的员工的很多107个,然后看看哪一个员工他放到这里边儿呢,去找,在这里边找到超过两个记录了。对吧,超过两个记录了,那就意味着我们是不是得二得小于等于这个记录数,这个记录数呢,其实就相当于看这写着写着其实也就差不多了,我们想查询一下这个所谓的叫count是吧?Count怎么着呢?From一下咱们这个叫job history这个表里边儿,然后where呢?为什么呀,我们外边这个表呢,起个名字我叫E,这个呢,我们比如说起一个叫勾吧。
26:02
怎么着呢,是我们这个员工呢,叫employed。然后去我们这个job history里边呢,我们也去找这个employd,相当于我外边呢送进来一条数据,然后里边你过滤完以后,就找到这里边儿的一个employd了。哎,当然前提也不一定能找到啊,如果没找到的话呢,那整个这块呢,就相当于是个count就是零呗,Count星就是零是吧,那如果你找到了,找到的话呢,那我们就得看有几条,你比如说我们送进来是这个101,那里边这样一过滤,是不是就恰好找到俩,找俩这块你一下你一看的行,这不是就是二嘛。对吧,你就是二那二,那这个二小于等于二,那满足啊,那101所以就能出来呀,那102呢,是不是就出不来呀,那同样的176呢,你要这块呢,是个幺六送进来的,那这个一过滤完以后,176康乃星这不有俩吗。哎,那又满足这个条件是吧,哎,那其实这块呢,咱们不就写完了嘛,哎,我们选择一直行,像101176都得在。哎,你看是不是都在呀。那这样的话呢,我们就找到了,说员工表当中啊,诶有这三个人,他们在这个公司当中,他诶做过超,就是相当于调过岗嘛。
27:05
你只要是这个,呃,不小于二呢,就相当于他调过岗是吧,记录一次再记录一次啊,就这样的情况。好,这个呢,是咱们说的这样一道问题,它也是一个叫相关子查询,只要呢,大家你发现这个内查询当中,它出现了这个外查询这个表了,它就是一个相关子查询。好,说完了。这个呢,完事以后呢,接着咱们再看下一个问题。那接着看下一个问题,就是子察询这块呢,相对来说就比较复杂一些,哎,这个呢,我们引入一对关键字,叫做exists和not exists。诶,这呢,也算是相关的查询啊,只不过呢,我们在有一些操作当中啊,可以使用这两个关键字的。上面这个叫六啊六咱没有写6.16.2啥的,那我这块呢,我就写一个。哎,6.1吧,那这呢是其中的一部分,然后这个呢,我们把它写成一个叫A6.2。以这个exists和not exist为代表的也是叫,呃,算是这个叫相关的情况了,来我们看看怎么去理解啊,这个not exist呢,咱们先不管,先看这个exist这个单词的意思大家清楚吧。
28:12
Exist就是存在的意思是吧?关联子查询通常也会和exist这个操作符呢一起使用,用来检查在子查询当中是否存在满足条件的行,如果呢,不满足,我们就返回false继续查找,如果呢,这个满足了,那我们就返回处就停止查找。就停止查找,就一旦找到了,我们就停止查找了,那now这次呢,我们一会儿再说来先做题目。把这个CTRLC粘过来。直接呢,我们就上例子就可以了,看一下说查询公司管理者的12344个信息。啊,这道题的话呢,我们可以用这个exist来做,但是不用它的话呢,大家是不是应该也有很多的方法来做呀,咱们先这个头脑风暴一下,我们先不用it词,看看大家有没有什么办法来做。
29:03
啊,有没有什么办法来做,首先的话呢,我们是不是可以使用这个叫自连接,咱们前面也做过。那我这块我就快速来写了,查询一下叫employee ID。哎,Lastname,然后job ID这个depart。A department ID from一下。这个employees,然后这个呢,当员工,然后照一下employees。啊,这个MJ当成了一个管理者,然后呢,按一下员工的叫manage ID啊他呢,应该等于我们这个管理者的这个employee ID。行,这样呢,我们先做一个关联,然后我们要查的呢,就是这个管理者的。哎,这几个字段。哎,这样是吧,好,那这个呢,我说就写完了。
30:03
就写完了,好,我们查询一下,一共呢是有诶。嗯,看一下啊,我们查询管理啊,这里边儿你看会查询是不是出来这个叫这个叫什么相同的这个数据了。相同这个数据了,因为呢,我们这个要查的是这个管理者的这个信息,那我们相应的是不是还得考虑这个驱虫的问题了,是吧。嗯,来我们看一下啊,这个我们想查询的就是我们前面做过那个题目是啥呢?是找到这个员工,这个员工的话呢,哎,以及他对应的这个管理者,那时候我们要查的话呢,是106条记录,那现在咱们要查的话呢,你看这个都是这样了,那怎么办呢?我这加一个this。听。嗯,因为呢,你看这里边凡是这个一样的,后边这个呢,是不是也现在都是一样的,我们加一个distinct,哎,做一个执行。用的是18行,哎,这个呢,就相当于是有18个这个管理者。18管理者好,这是我们说的这个第一种方式,然后呢,我们再说一下这个方式二。方式二的话呢,这个可以用子查询来做,就是不是我们这个exist啊,那怎么做呢,我们先查出来这个,哎,叫什么管理者的。
31:09
是不是D啊,那不是管理者的,这个叫manage ID,因为manage ID呢,其实就是诶对应的就是管理者了,所以我们可以先去叫select一下,这个叫。Manager这个ID。From,那你lo意思是吧,好,那这样查完之后的话呢,我们一执行,那这块就突出来107个,那里边呢,是不是有重复的,我们就还是distinct一下。那去中完以后呢,我们再去执行,那就是这样的一些19个好,那接下来的话呢,我们相当于就看一下说哪些员工的这个employd是不是就是这些啊,那我们就select,就是我们上面这几个字段呗。Can。粘过来这个,把这个符号呢改成是这个英文格式下的逗号。From一下employees where什么呢?Where一下这个叫employee ID在这呢,我们是有多条记录了,那我就用这个in来表示,来把我们这个结果CTRLX我们粘过来。
32:09
来放到这来执行,刚才呢,我们上边是不是有18条记录啊,还这保密执行是不是也是这18条记录。啊,没有问题,这呢,就我们叫子查询的方式好,然后接着我们来看一下这个方式三。我们呢,可以去使用这个叫exists。来来去实现来怎么去做好,怎么去做这个呢?其实跟我们这个子查询啊,它是有一些相似的啊,有一些相似的,那我们先把这个头部呢,先拿过来,我们呢去外边这个员工表中去找一个,找每一个员工的employ ID,然后呢把它送进去。哎,其实。这个到位置就不用写了啊,直接我们就是it。那就他来我们这样写。我写完以后呢,我来解释啊,哎怎么办呢,我们这里边我去,哎叫select一个星,哎from什么呀,这呢还是这个叫employees,咱们这个呢起个名我叫一一,这个呢起个名叫一二,好写这个where是吧。
33:09
什么呢?哎,我们说这个E1的employeed呢,跟E2的叫major ID呢是相等的。好,来看。注意听,注意听,我们外边呢先来一条记录,一共呢,不是有107条记录嘛,我们先把第一条记录呢,先送进来,送进来的时候呢,我们看一看什么呀,这个里边这呢也是一张表,里边呢,其实也得是一条记一条记录,一条一条记录去过是吧?呃,里边这个先这个从比如说第一条记录去过吧。哎,第一条记录呢,其实就是他自己跟自己了,你看就呃,就相当于是你里边这个表的这个manage ID,你看跟我们送进来的这条表表的这个employd呢,看是不是相等的,那第一条记录通常都不相等,你自己跟自己比是吧,你不能自已是自己的管理者呀,那不相等,那看第二条记录,哎,然后再看第三条记录,诶你找找找找找就是只要呢有一条记这条记录不满足,那就是false,那就接着往下找。
34:02
然后再往下一条记录还不满足,接着再往下找,直到呢,我们找到了一条记录,发现呢,里边的一条记录的manage ID跟咱们送进来的这条记录的这个employed呢是相等的。那么就相当于是你比如这个张三进来了,我们就在找说谁的管理者是张三呀,哎,这块说我的管理者是张三,诶相当于这块呢,不就有一条匹配上了吗?假设呢,这有这也是有107条,假设我们在第五条的时候呢,匹配上了,那么此时的话呢,相当于它返回的就是一个处。那返回既然是处了,就相当于我们找到了,诶有的员工的管理者是咱们送进这条记录,就没有必要再往下去执行了,我们就停止,那那么刚才你送进来这条记录呢,我们就算一条记录了,哎,我们就会把它输出。那么接着呢,我们在外部的第二条记录再往里边去送,以此类推,所以说我们这个ex exist呢,这个意思就是我们刚才解释的这样子,那如果你跟这个,呃,一开始的某一条记录去比较,发现返回是false呢,就继续找,哎,当找到是处的时候呢,就不再继续找了。
35:03
看,就是这样的一个道理。好,那么大家也会发现呢,我这个位置写星其实呢,哎,不重要是吧,诶我们不是说非得要查某一个字段了,只要是他找到记录了,我们就要了,哎,没找到记录就不要了,所以这块呢,你写什么其实不重要。刚才呢,是不是有18条记录来我们这块呢,一直行,还是这18条记录是吧,那这个写星呢,这个这刚才说了不重要了,其实你随便写都行。这个就相当于是我们只要查出来记录了,我们只不过用这个X来表示的是吧,哎,这个不重要,只要你有记录就可以了啊,这个写谁都行。啊,还是写成行吧。哎,这样好,这个呢,就是我们说的叫exist,哎,它的一个使用。啊,稍微注意一下。那这呢,我们讲了是不是这好几种这个方式是吧,哎,三种方式,好接下来的话,我们再看一下这个题目,这个题目呢里边呢,想体会的就是这个叫not exists。跟我们上面的exist呢,其实可以理解成就是正好相反。
36:01
哎,正好相反,这个题目的需求呢,也是比较合情合理的,大家看一下说查询departments这个表当中不存在于employees表中的这个不买地和这个department name。大家你想这个需求是不是类似于咱们前面做过的,我们如果左边是员工表,右边是部门表的话呢,中间呢是这106条记录,然后呢,右边呢是有16条记录,还有印象吧。啊,这边呢,是有一个咱们讲那个左I连接,右外连接的时候,这个需求呢,你想是不是就是让我们查这16条记录了。你看部门表当中不存在于这个员工表里边的这个部门ID和他的一个name,不就是这16条记录吗?那这16条记录呢,咱们前面也讲过,呃,怎么去做了,是不是就是先用这个,呃,如果你要是这个写到右边的话,那就右外连接了,然后再让就是写一下吧,咱们其实前面讲过了啊,方式一。我就说的时间还不如我写出来呢,那我们想做一个查询是吧。查询一下叫。
37:01
Department ID。Department name,好,From这块呢,大家呢,可能习惯上就是把这个员工写左边了,那我就也写左边,这个叫e join一下。Departments,这个叫D,然后on一下。哎,盘麦跟我们的D点盘麦是相等的,然后这个呢,咱们是相应的叫UI连接了对吧。这样我们要查的话呢,是不一共有122条记录啊。Part。嗯,这个啊,这个不明确了,咱们要查的是来自于这个部门表的地点。啊,因为员工表里边儿是不是也有这个底盘ID是吧。这样的话呢,我们做一个选中执行,哎,这呢一共有122条记录,然后咱们是不是不要他们共同有的这个部分,所以where一点department ID啊是is notd,诶这样呢,我们查出来结果呢,不就是一共有16条记录吗?就是相当于这些部门里边是没有人的啊,这是咱们之前做过的这个方式,好,下边呢,我们来看一看,还能不能使用咱们现在讲的这个方式呢来做。
38:06
嗯,怎么来做呢,咱们呢就select,那整个思路的话呢,我们要查的是department ID,还有这个叫。Department name,然后from一下叫departments这个表,然后where呢,首先我写个叫exists是吧?哎,就是存在的意思。那我们接下来的话呢,去呃,另外这个员工表里边呢,去找这个记录,我就select星了,From一下叫employees,这个表我叫E,然后这个呢叫D。然后接下来的话呢,我们还是这个where啊,两个表的连接条件d.department mindd跟我们E点,嗯,e.departmentd呢是相等的,大家你看。什么意思,我们相当于是让外边有一个部门,我把这个部门呢给送进去,相当于看看在员工表当中能不能找到记录,能找到记录的话呢,是不是这块呢,就返回是一个处了,那如果这个我们要是去执行的话呢,相当于咱们查到的是什么呀,是不是说呢,有这11个部门呢,是有员工的呀。
39:08
因为呢,我们这块呢,是不是找到记录了,这叫有员工的对吧,那么总共我们这张表中有多少条记录,大家不知道还有没有印象,我就看清一下,From一下,叫departments。你看啊,咱们整个这个部门表当中啊,是不是有这个啊27条记录,那刚才呢,我们这块呢,查出来是不是有这个叫11条记录,那其实就是这11个部门当中是有员工的,那我们其实要找的是不是恰好是另外的那16个这个这个部门是吧?那其实这块呢,我们就写一个这个note就可以了。那我们这时候选中执行,那这些部门呢,跟刚才上面那个一样啊,16个是没有人的。那他的意思是什么呢?就是我们往里边去找的时候呢,呃,如果呢,你一直往这个就得找全了,如果呢,始终都没有找到过这个记录,那我们这时候呢就要,那你要是找到某一条记录,发现这个部门里边找到员工了,那这条记录我们是不要的,就一旦找到了,我们就停下来就不要了,只有呢,你把这个里边都找完以后呢,发现没找到,没找到说明就没有嘛,那我们就要了。
40:07
在这呢,是这些里边没有人,哎,注意一下。好,那么这块呢,我们写的这个exist也好,还有not exist也好,我们发现呢,在这个内查询当中,是不是同样使用了我们外部的这个表,所以说呢,它仍然是一个叫相关啊相关查询。哎,相互查询,那么相关子查询的话呢,我们这里是以查询为例来说明的,那其实在这个,呃,整个呢,我们放眼到增删改里边呢,里边这个查询,里边这个可能是个查询,但是外边呢,有可能它不是一个查询呢。那这块呢,因为咱们还没有讲这个增删改,所以这块呢,我就简单的先说一下,哎,大家有这样一个印象就可以了,等我们讲完增删改的时候呢,大家就会做了。哎,这个呢,就相当于是we部呢,是一个更新操作,然后side让这个,呃,字段呢,等于什么呢?等于我里边查出来的,而查的时候呢,我们用到了你外边的这个表了,所以这还是个相关的是吧?那比如说我们这有这样个需求,哎,这呢是我我之前已经写好了啊,什么需求呢,咱们在这个员工表当中啊,我想加一个字段,这个字段呢,叫做department的name,本来咱们是没有的,但既然你加上这个字段之后呢,就是如果我们这个表中数据都已经完整了一一百零七个数据,你现在要加一个字段呢,默认情况下呢,这个字段的值呢,它这块填的就全是no。
41:22
那我们加个字段呢,你不能神透啊,是不是接下来我们就需要呢,给每一条记录呢,这个位置呢,值都给它改写成本身啊,你通过部门表里边去找一下那个对应部门的那个name,然后给它填到这儿了,所以这呢就是一个更新操作,更新一下这个员工表,让我们这个,诶这个员工表里边这个department name等于多少呢?诶我们把外边的你这个员工的这个数据呢,放到里边,看一下你这个员工的部门ID,然后找我们部门表里边跟你这个ID一样的那个数据,我们就找到了这个叫department name了,然后呢,把它呢,诶设置给我们,诶对应的你这个员工的这个位置。哎,非常的清楚,哎大家现在呢,如果还不太会写,也看不太懂的话呢,我们等后边讲完这个update set的时候呢,大家就清楚了,那这样操作完以后呢,我们整个这个员工表里边department name那个字段呢,它就有数据了。
42:11
好,这是这个,然后接着我们看这个。相关的一个删除操作,嗯,这个是它的整个表的一个结构啊,咱们还是看这个例子说呢,删除表employee当中,它与in EP history呢,这个表皆有的这个数据。啊,都有的这个数据啊,从这个表中删除,所以呢,我们是delete from我们这个员工表,然后删除哪个员工啊,哎,这个员工呢,得是在这里边,这个数据就是department,就有可能有多个嘛,所以我们用的是这个in。哎,怎么着啊,相当于我们外边这个表里边儿送进来的这个员工,然后在我们里边这个表当中呢,找到记录了。对吧,找到记录了,哎,这块我这有。这块呢,我这儿没有去起个别名,那比如我这个呢,叫一一,相当于前面的有个一一点啊,这个呢也是可以的,就是相当于你里边这块用的话呢,没有写呢,就是自然而然这个字段就来自于他的啊嗯,那这里边呢,一旦你找到记录以后呢,哎,我就定位好你这个ID了,然后我把这D呢,只要你是这个数的,我就把它干掉了,这不就相当于是哎都有的数据里边,你一旦找到了,我就删掉了,那没找到呢,没找到就不用删了吗?
43:17
这个是一个delete的一个操作啊,相当于呢,在这个更新也好,删除也好,这里边儿呢,也都是有这个关于我们子查询的场景的,而且还是相关的子查询是吧。行,那么关于这个相关的查询呢,咱们就讲到这儿,那对应的客户呢,还有很多这个相对应的一些问题,咱们到时候再做,然后最后的话呢,因为这个比较小,我就放在一起了,咱们再呼应一下,咱们最初讲这个自查询,我们说到了说谁的工资比雅贝的高,当时咱们写了是不是三种方式,那这三种方式里边,显然第一种呢不太靠谱了,因为他写了两次select,我们不推荐啊,两次呢去跟数据库服务器呢,去交互呢,这个效率肯定是比较差的,那么我们看一下这个第二种和这个第三种。一个呢叫四连接,一个呢叫子查询,这哥俩有没有好坏之分呢?
44:05
那我们这里边抛的这个问题呢,哎,这是第一个问题是怎么做是吧,这不是两种方式嘛,第二个有没有好的之分呢?有哪个好呢。自连接的这个方式好。哎,这个方式好,那相当于呢,还是这个意思,咱们上篇给大家呢,主要想强调的点呢,就是说大家得先去会做啊,先会做,你先把这个题目你先做出来,你先不要考虑效率高低的问题,然后我们下篇的话呢,咱们重点去分析说呢,诶,你不能光追求说做出来了,你是不是还得做的要完美啊,效率要高,我们再谈谁好谁坏的问题,哎,到下边的时候呢,我们还可以去结合着,比如像explain啊,那我们就是去解释一下我们这个呃语句啊,看看它当中涉及到包括索引那些使用,包括它这个执行的一些细节,那我们都能通过这样的一些指标呢,去做一些查看。啊,先把结论抛出来,就是咱们在这个呃,完成一个题目当中,如果有这个多表连接的这种操作,也有子查询的这种操作呢,通常呢,我们会选择这种多表连接的操作。
45:05
而且呢,在有一些情况下呢,咱们这个,呃,我们说这个MYSQL这个数据库,它不是有一个叫优化器嘛,它会把我们整个这个子查询呢,给它肢解完以后呢,如果发现呢,它是可以替换成是对应的一个多表查询的一种方式的话呢,这个直接它就会帮我们改成对应的这种多表查询的方式了。啊,非常的智能是吧,哎,现在这个整个这个逻辑架构里边呢,是有这样的功能的,那那从我们这个角度来讲的话呢,如果大家有能力去写出这种多表查询的,像这里的自连接的方式,你就尽量不要写这个子查询了,那因为呢,呃,这个大部分的数据库管理系统都对这个多表查询也好,那自链接也好,做了这个优化啊,比这个子查询的这个效率呢,要更高一些,具体的话呢,我们到下篇再说。那么关于此查询的我们这个章节的内容啊,咱们就先说到这儿。
我来说两句