00:00
那关于子查询知识层面的内容呢,我们就说到这儿了,然后接下来的话呢,我们通过这个课后练习呢,练习题呢,大家再来看一看这个丰富的一些题目是怎么做的,来我们直接打开这个子查询。检查群这块呢,我给大家提供的题目呢,应该是比较多的啊,这儿呢,我一共放了20个题,都是针对于咱们现在题供的这几个表的,这里边题当中啊,其实一道题目我们有的时候是可以有多种解法的,那这里边我们也可以看看不同的解法的这个情况,然后下来的话呢,大家也要把这个紫查询的这个Q题目呢,一定要多写一写,要去练一练啊,这呢应该算是达到我们一个查询语句的一个难度上的这个最大值了。好,那这块我们来看一看,这一共20道题啊,CTRLC一下。行,回来以后呢,我们先去新建这样一个文件啊,把我们这个题目呢粘到这块。哎,对应的这是我们这个子查询的课后练习。CTRLC。来站过来啊,此查询的。课后练习好,这个我们把它呢,就是这样删一下来,我们这块呢,先选中CTRLCCTRLS,我们先去保存一下啊,CTRLV啊粘到我们这个位置上啊,没有问题,好,那这块呢,我们就一个一个题目呢来进行查看就可以了,前面的话呢,我们提到过,就是大家写这个子查询的时候呢,可以有两个角度对吧,一个呢是从里往外的角度,一个是从外往里的角度呢去写。
01:23
那我看是写到哪了。嗯,写到这儿了是吧,然后呢,我们这里边儿呢,题目因为比较多,有的这个难度呢,也相对来说大一些啊,比咱们讲这个知识层面,这个难度呢要大一些,那我们呢,再去让大家去体会一下我们写的这样的一个这个技巧啊,就是我们到底是从里往外写还是从外往里写,那我们做一些题目之后的话呢,咱们再给大家做一个总结建议大家呢,应该怎么去写。好,那么我们来看第一道问题,说查询和这个人相同部门的员工姓名和工资,那因为像这种题目呢,比较简单,大家其实的话呢,就可以直接从外往里写,那就直接呢,你就往下去推,推到哪块不清楚的,不确定的,你就用一个查询的来表示就可以了,对吧?那这里边儿呢,显然不确定的就是这个人他所在的部门嘛,那跟他一个部门的,那我们其实因为比较简单,就直接从外往里推了,Select一下叫last name。
02:16
这个salary from一下employees,然后employees是吧,然后where什么呢?这个呃,相同部门的就是department ID,哎,等于那这个人的话呢,因为他就就这一个人嘛。就这一个人好像也不一定是吧,就是这个人的话呢,他在公司里边如果要有多个的话呢,有可能这个部门呢,他就有多个,所以这个号呢,用等号,其实我们还是有一定的风险的,是吧,那我们先写成等号啊,这个select department ID。Down from employees。这样,然后呢,Where?这个a lastname等于这个呢,就是他的lastname了,那我们把这个呢,给它粘过来,CTRLC放到这里边就可以了,这样的话呢,我们就查出来这个人他所在这个部门ID了,那这块呢,我们看一下啊,这就一个相当于公司里边就一个人是叫这个名了,对吧?然后呢,我们再看这个一个人叫这个名,所以他这部门就是唯一的,这个呢,我们用等号呢就可以了,诶这块呢,就查出来80号部门的员工的这个信息了,是吧?那这块呢,大家要小心一点,就是有可能那个公司如果有多个叫这个名的,那么这个部门ID呢,有可能就是多个了。
03:26
有可能就是多个了,那这时候呢,我们用等号呢,就不是特别准确了,那么保险起见的话呢,你可以考虑把这个改成是个in。啊,那如果我们这呢,是一个单行子查询呢,用in呢,其实也是没问题的啊,也是没问题的啊,就相当于我们原来讲运算符的时候呢,In里边写上五十六十七十,那我印里边就写了一个可不可以呢?啊也是可以的,好,这是我们说的第一道题,第二道题说查询工资比公司平均工资高的员工的这个员工号姓名和工资啊,那我们需要计算是公司的平均工资,这个呢,整个一看呢,因为难度也不大,所以我们还是选择从外往里写。
04:02
啊,其实这块我已经暗示大家了,就是如果说这个题目呢,它难度不大的话呢,咱们就考虑从外往里写了,好来,我们写一下这个select employee ID,然后lastname。Salary是吧,Pro employ employees,然后为什么呢,说公司比公司的平均工资高,那我们这呢,应该查询一下这个salary,诶大于公司的这个平均工资就可以了,来我们select一下。啊,AG的一个salary。诶,From一下employees是吧,那这呢,我们就查出来整个公司的一个平均工资了,然后呢,诶查询一下这个,呃,哪些员工比公司的这个平均工资高,那就是这样一个情况,那OK,我们选中了去执行一下就出来了。那这这就是我们这道题目,咱们说过了,就是大家呢,拿到这个circle以后呢,也要有能力呢,把它翻译成咱们对应的这个需求,那就是查询比公司平均工资高的员工的信息。
05:02
哎,没问题,好,来,接着我们看这个第三题。说选择工资大于所有招白D呢,是这个的员工的工资的员工号和这个这个这个信息是吧,那这时候呢,就提到工资大于,呃,这里边的员工,那我们要求出来是不是这个招ID的对应的员工的这个工资对吧?然后呢,比这个工资呢大就可以了,这时候呢,会涉及到有可能他会有多条记录。来多条记录啊,那这个多条记录的话呢,我们怎么去表示这个符号呢,来这个我们写着看啊来去分析这个题目的话呢,按说稍微长一点,大家呢,你可以选择从里往外,或者从外往里都行,那比如说我这个呢,还是从。外往里写啊查询,哎,怎么着呢,哎,你把这个呢,先圈一下,这就是个定语选择,就或者叫查询员工的last nameme,招白地和salary啊,主要就是这三个字段啊,就是select一下这个lastname。Job ID和他的这个salary。这样是吧,诶,From。
06:00
啊,Employees,诶是不是这样子的。Select这三个字段,From这个employees,然后呢,诶where什么呀,说公司啊,得大于这个,呃,所有招牌D是这个的员工的工资,那要求呢,就是现在这个salary呢。哎,三它得大于一个东西这块呢,我们相当于暂且呢把它看成是一个单行子查询了,所以我这用的是一个大于符号啊,单行子查询的操作符,那我们呢,就可以先去select一下,哎,这个赵白地是这个的员工的工资啊,我们查一下这个salary。然后from。哎,Employees,哎这么着是吧,Employees,然后呢,哎叫where。这个job ID啊,等于哎,我们把这个工种呢放过来。这样子好,那这样的话呢,我们就查出来这个工种的员工的这个salary了,来我们选中呢,先执行一下,好大家发现呢,是不是这个数据呢,不止一条,是有很多条,那也就意味着如果我们这话呢,叫大于的话呢,肯定就会报错了,对吧?哎,那他这里边提到了,说要大于所有的这些,那就不能是比其中的某一个数据大了。
07:08
啊,那就意味着是不是得得相当于比我们这个一万四呢还要大,所以我这儿呢,就大于这块,我就写个二就可以了。大于所有的,实际上呢,就比我们这个最大的一个大就行,对吧,好,那这时候呢,意味着我们查出来的结果里边呢,就都会比刚才看到那个一万四呢,是不是要多呀。哎,没问题是吧,哎,比这个数要多好,这呢就是我们说的这个第三道题。哎,这就我们说的这个第三道题,好,接下来我们来看这个第四题。说查询和姓名当中包含字母U的员工在相同部门的员工的员工号和姓名。哎,查询诶的员工号和姓名,那还是呢,我们从外往里写。那select要员工的员工号employ employee ID是吧?这个姓名lastname。From an employ employees。
08:03
Employees是吧?然后where是什么呢?我们要查出来跟这个员工在相同的部门的,那就是where这个,诶,Depart。哎,问ID,哎in,那这呢,有可能它是不是有多个了,哎,我们这样的去处理。Select,这个嗯,包含you的员工所在的部门啊,Select department from employees说where,这个叫lastname。哎,咱们这块呢,就用like了,我就不用那个正则的方式了,那包含字母U的,那就两个百分号中间加个U,这呢就是查出来了包含字母U的员工,他所在的部门的ID。啊哎,部门ID呢,你看哦,还挺多的,那这里边呢,是不是有很多这个重复的数据啊,那我们这呢,是不是还可以去加上一个叫distinct,这样来去下重,哎,选中呢再执行。哎,好了,一共呢,是这样的五个部门。12345对,然后呢,诶,我们department的in,那这些部门的员工的信息。
09:05
那这就在相同部门的员工号和姓名是吧,好来我们选中了执行,那就这样的一些员工那就可以了。好,接着来看这个第五题。说这个查询在部门的location ID为1700部门工作的员工的员工号,那我们呢,就得先求出来这个位置呢,它这个员工的部门ID是多少,这个呢,还是从外往里,从里往外都行,那咱们这块呢,上面讲的都是从外往里写,咱们这块呢,比如从里往外写吧。哎,从里往外写啊,哎,那么从里往外写怎么写呢?其实这个大家呢,你不用特别纠结,你就看一下针对我们这边列的这个信息呢,哪些呃是未知的,那我们就可以先查一下,比如说呢,查询部门在这的,呃,工作的这个员工的员工号,那要找到员工号,我们得找到他的部门ID是吧,那相当于我们得先通过这个找到部门ID,那我们就可以呢,这样。Select一下,叫做depart。Mean这个ID from一下这个employees,然后where。
10:05
啊,Where啊,这个叫a location ID等于1700。这呢,我们就找到这个location ID是1700这个位置上的department ID了,一查。呃,Location ID啊啊,这个我们写错这个表了,应该是这个部门表里边的对吧。此时呢,我们选中了去执行,这样的话呢,我们就查出来哦,有这么多的这部门都是在这个1700这个地儿的,那还挺多的啊,还挺多的,二十一一行数据呢,行,那么在这个地儿的话呢,这个部门数我们查到以后呢,接下来这个题目就相当于变成啊,查询在这些部门是不是工作的这个员工号啊。OK啊,所以我们就诶select一下啊employee ID是吧,From一下employees。这个表啊,Where什么呢?啊,Where depart?问ID in,那是不是就我们下边这个?
11:00
哎,把我们这个呢,CTRLX,哎,我们往这一站。哎,往后一拽是吧,就可以了,那这儿呢,就找到这部门,然后说这个,诶在这个部门工作的这个员工的信息,那比如我们说有一些部门呢,是不是就没有人呢,那这时候自然呢,去找的时候呢,找的时候呢,他也就找不到人啊这又不受影响的,好这呢,我们就找到了这样的一些员工的员工号。啊,OK,行,这呢是我们说的这个第五道题,然后接着看这个第六题。查询管理者是king的员工姓名和工资。管理者是king的。嗯,诶,这个题目是不是有歧义啊。啊,这个,呃,管理者是king。就是我们要找king这个人的员工姓名和工资,这是一种理解,还有一个呢,就是呃,这个谁的管理者是叫king?啊,就是相当于一个是找这个叫king的这个人啊,一个呢,是找这个管理者是K的那个员工的那个情况啊,这个应该倾向于是我们的第二种理解是吧。啊,如果说呢,就叫这个名呢,那相当于他就用不着子查询了,就用不着子查询了啊呃,就是看谁的管理者是king啊,说白了就这个意思。
12:05
那就是我们要先找到这个king,这个人呢,是不是他的这个什么呀,管理者是king。找到的这个。然后呢,看看哪些员工的major ID是不是就恰好是这个ID啊。哎,这个思路好,那我们就先查出来king这个人的叫他的employee I did。Employed是吧?哎,From employ employees,哎,这个表,然后where呢,哎,这个last name,哎,等于。King是吧?找到这个人的叫employee ID。有两个好有两个,然后呢,我们就看一下说谁的这个,嗯,Manager ID呢,恰好是100或者是156。来我们查一下啊,Select一下叫lastname。哎,还有这个salary from一下employees说where。
13:01
那什么呢,诶,Manager。ID。那这时候呢,你是不是得用in了,因为我们这儿呢,查出来两个记录。来,我们把这个呢,CTRLX啊放到这儿。哎,就这样个思路是吧,就是看看谁的这个管理者ID呢是100,谁的管理者ID呢是156,那不就是管理者是king的这个人的下属吗?哎,就这样个情况,哎,我们此时呢,选中执行好这块,我们查出来这么多数据,那你也可以在这块呢,把这个manage ID呢,是不是也可以补一下是吧,那看看这个都谁是100的,谁是那个人的。哎,这我一查哦,全都是100的,第二呢,就是另外那个人的话呢,他其实就是公司的一个普通员工了,他没有这个就是没有别的员工呢,是他的这个下属是吧。啊,就这个意思,行,这个问题呢,大家啊,我就写成这一个了啊,大家下来了,你也可以思考思考,这个呢,我们是不是可以用这个exists,那就咱们这块讲的这个exists,我们去完成。啊,其实呢,是应该可以写的啊,大家思考一下。
14:02
好,那下边呢,因为还有这个it的这个写法,所以呢,我就不写这个了啊OK,我们先来看这个第七个题。说呢,查询工资最低的员工信息,那这个呢,其实也比较简单,那你先要找到是不是最低的工资是多少是吧?诶工资最低的员工信息,最低工资是多少,然后看谁的工资呢,是这个最低的是这意思吧,那我们要从里往外写的话呢,先查出来这个mean salary。诶,From这个employees这呢就查出来了,最低的工资是多少啊,2100,然后接下来我们就要看一下谁的工资是两千一是不是就可以了。Select一下lastname。Salary from employees说,Where这个salary。哎,等于等于这个两千一那就可以了。把我们这个呢给扔上去。哎,整过了啊行,这呢不就查出来说谁的工资呢是2100,那谁就是这个工资最低的员工信息是吧,那这个也比较简单一些,好,下面这个题的话呢,就有一定的这个难度了。
15:05
说查询平均工资最低的部门信息。查询平均工资最低的部门信息,这个呢,是不是我在讲这个子查询这块呢,咱们做过这道问题啊,你看往下拽。咱们讲这个多行子查询的时候。往上找。嗯,在哪呢。多行子查询。在这是吧,查询平均工资最低的部门信息,呃,部门ID是吧,诶我这叫查询部门ID了,其实比我们这个呢,稍微的要简单一点,我们这个呢,查出来这部门ID之后呢,我们希望呢,再从部门表里边把整个这一个部门的所有信息呢都展示出来,相当于在我们现有的这基础上还得再套一层才可以。啊,再套一层才可以,这呢我们用了三层,其实就得用四层好,这道题呢,大家如果说有点没印象了,那这块咱们重新来写一下啊,再给大家去剖析一下。那么这个第九题呢,比我们这第八题呢,还要更难一些哈,好来看一下说查询平均工资最低的部门信息啊,这个呢,咱们可以考虑从里往外写。
16:09
啊,就是大家呢,现在这块应该有点感觉了,什么时候我们从外往里写呢,就是整个这个结构呢,比较简单,大家呢,就写一层,这块呢,不确定的,我们写一个子查询,这就叫从外往里写,但是如果说我们这个子查询呢,比较复杂了,比如说呢,咱们有三层。啊,比如说有三层,那么这时候呢,大家从外往里写的,这个难度呢,就会很大啊,来源于两点,第一个呢,就你写写着不确定了,然后呢,去写一个写一个发现又不确定了,然后又得写个查询,这个时候你每当不确定的时候呢,其实心里边儿是挺忐忑的。啊,就是从外往里写呢,这块呢是有这个难度,另外一个点在于就是说,诶你要是从外往里写的话呢,诶就是就写完了,写完以后呢,其实这个代码量呢,它就相对来说大一点,然后你选中之后一直行挂了,那时候挂了的时候呢,其实你都不知道应该大概是哪块出的问题,虽然说呢会有这个错误信息,但是呢,心里边还是很忐忑的啊,因为这块出的问题呢,你不知道是跟外边有关系,还是跟里边这个,呃,这个设计上会有问题,即使没出错的话呢,其实心里边也挺担心的。
17:09
就是没报错哈,出来结果了,我们说出来结果也不一定就就完全对是吧,符合你这个题意还得呢,需要去再细致的看一下。这呢是从外往里写的一个特点。那么从里往外写呢?其实呢,这块就保险很多,因为你写一层之后呢,呃,你查一下这个结果,那很确定呢,你查的是什么,然后这个结果出来以后呢,我们再去写这个外边这一层,包括呢,你是多行的单行的符号用什么都很确定的,哎,写完之后的话呢,这个也很有把握,他查的是什么,然后你再呢,是不是诶往外去写啊一层的往上。哎,这个呢,两个情况有点像什么呢?就是大家呢,如果你是从一个底层的一个呃公司的员工开始干起的话呢,哎,你先当上这个组长,然后再当上这个项目经理,再当上这个在高层的这个,一直到公司的这个一把手是吧?然后呢,你是很清楚每一层这些,呃这个员工同事是吧,他的这个主要问题是什么,相当于相当于你整个呢,就是对整个公司呢是非常了解的,但是如果说你要一上来这块呢,就是一上来,比如说呃,像很多这个咱们国家这个民营企业这个这个老板是吧?呃,就是原来从底层干起的,然后干到这个公司老大了,公司也是他的,然后呢,年纪大了需要退休的,然后让自己孩子呢来接任,往往这个孩子呢,接任的时候呢,这个企业往往就给干黄了。
18:26
啊,这种情况呢,其实特别多啊,好像据说呢,国家现在呃,也把这个,尤其是南方企业要多一些啊,把这些呢,很多民营企业的这个家里边儿这个孩子们呢,聚到一起也是也是培训他们是吧,因为怕他们把企业干黄了,如果情况比较多,现在也会影响整个国家的这个经济的基本面嘛,是吧。那么他们如果要是去接班的话呢,你像他没有经历过从里往外的这样一层的过程,上来就是干到最大的一个事儿,那很有可能他不理解底层的一些基本的一些操作是什么样子的啊,所以一些角色呢,可能就是嗯,不一定是特别好的是吧?OK啊行,那如果说大家对这个呃色控呢,编写的时候没有把握呢,我建议大家呢,你就从里往外去写。
19:07
啊,从里往外去写,好,我们分析一下,查询平均工资最低的部门信息啊,你先别考虑部门信息呢,我们先考虑平均工资最低的这个事儿,其实就是找到各个部门的平均工资好来查询一下。各个部门的平均工资啊。所以呢,肯定要分组。Employees,然后隔如果拜一下我们的各个部门,这呢就是按照部门来分组,然后找到各个部门的一个平均工资。没问题是吧,然后这个平均工资里边呢,我们是不是要找这个最低的呀,在这里边呢,其实就是3475,那就它了,呃,就它的话呢,我们怎么把它搞定呢?咱们其实前面讲这个子查询的时候提到过,如果你要是在这里边加个密的话呢,说实现了一个嵌套,这个呢,在咱们MYSQ当中是不支持的。Oracle是支持是吧,Oracle可以这样写啊,咱这儿不行,那这时候不行,我们怎么处理的呢?还记得吧,咱们说呢,既然你不让我们这个聚合函数里边套这个聚合函数,那我们就想办法把这个聚合函数呢看成不是个函数了,而是一个普通字段,那我们就可以把查询出来这个结果呢,是不是整个呢,看成是一张新的表了,那我们就放到这个诶from当中是吧?哎,把它看成是一张表。
20:20
诶,这样子存在。哎,这个把它粘过来,那这样存在的话呢,此时我们这个avg呢,它表示的不让它是一个函数了,而就这个字段了,那我们这块呢,一定要给它起个别名,把它呢固定下来。那把它固定下来,同时的话呢,你这是一张表了,不是一个结果集了,那它也应该给它固定下来啊dept,然后avg的啊一个SL是吧,哎,这呢T呢表示它是一个表了,好,那么接下来我们看一下要查什么呢?咱们可以查询一下,就是比如说这个字段。哎,查这个字段from这个表,好,此时呢,我们选中执行,哎,这呢就查出来还是这张表了,那么这张表的此时这个字段呢,它就是一个普通的字段了,我们去求它的一个min。
21:04
这样的一个思路来,我们这时候呢,选中执行,这样的话呢,3475哎就出来了。没问题是吧,好,那他出来以后呢,我们接下来是不是看一看哪一个部门的平均工资是这个34758,那这块呢,其实又得需要做一个分组是吧,哪一个部门呢,Department。ID from一下employ employees哪一个部门的平均工资,那这时候呢,很显然是需要做一个分组的department ID,然后having呢,这个平均的salary,它应该得等于这个3475,那等于呢,就是我们把下边这个呢拿上去。哎,这样拿上去,然后再往这边移是吧,好,那么呃,这个哪个部门的平均工资是3475啊,哎,我们一块一查哦,52部门是。那这个题目呢,让求这个部门的信息,咱们可以考虑呢,就是在这个外边呢,咱再去套一层,我就select就行了,From叫departments是吧,然后呢,Where department。
22:06
哎,ID哎,等于就我们这个52部门。就这样吧。然后呢,我们把整个这个呢,CTRLX,然后放在这儿。哎,这样呢,再去选中往右移。好,这个呢,我们就做完了50号部门的部门信息,哎,就列出来了,那就这个。就这个行,这个呢,我们看到了,咱们写了几层呢,一层两层三层啊,是不是四层啊,哎,这个还是比较复杂的啊,像这种呢,你要是从外往里写的话呢,你想你哪能一下子就定位到我们这块要找的是ID啊,这块又是avg的啊,这块有呃,这个M的新造了一张表,这个其实是比较困难的是吧?哎,那建议大家呢,你要是比较复杂的题目呢,就从里往外写。哎,从A6从里往外写好这块呢,我们说明一下,这个是方式一啊。方式一完了以后呢,咱们再讲到这个子查询的时候,其实我们又提了一种方式,那咱把这种方式呢,那再强调一下,实际上呢,就是在我们这个基础上呢,咱们这写了四层,然后呢,哎,第二种方式呢,其实就少了一层。
23:11
少了哪一层呢?是不是我们在这个位置呢,把这两个给合成了一个,对吧,还记得怎么做的吗?那我就直接呢,在咱们这个基础上去修改了,咱们当时呢,是这样说的,嗯,我这么着一下把这个呢就干掉了。这这也不要了。哎,这样的大家看,当然这块得改,这个呢,你看我们是查询出来是不是各个部门的一个平均工资是吧。啊,这个各个部门平均工资啊,这个咱不用起别名了,各个部门的平均工资,然后呢,这呢也是你看也是按照部门分组是呃平各个部门的平均工资了,然后我们想看一下这个平均工资里边,我要这里边查出来是多条记录了,我们要从这里边是不是找那个最小的是吧?找这个最小的咱们讲这个哎,多行子查询的时候呢,我诶说过这个事儿,就是我小于等于这个O。
24:05
大家看我小于等于二,那就是我小于等于这里边的所有的,那小于等于所有的,其实你就小于等于是不是最小的就行。小等于最小就行,而我们这儿呢,就是部门的这个平均工资,你这也是平均工资,他不可能小于他呀,那只可能等于,那其实就相当于是我就是等于这个最小的了。那其实这个3475呢,我们就能够求出来,那这块能求出来之后呢,把它呢,哎得到不卖力了,再这样包一下不就可以了吗?那这时候我们选中执行啊,还是能出来的。那这个呢,大家在这块可能理解起来稍微差点意思,需要体会一下,我们用这样的一个操作呢,替换了原来的这个位置,相当于两个这个操作。啊,大家需要去体会一下,好,那么这个完了以后呢,我再给大家讲一种方式三。再讲一种方式三。这个方式三怎么来做呢?怎么来做呢,这块呢,诶大家呢,这个可能就没有这样的一个意识了啊,这块我直接来说一下,咱们用一下limit。
25:05
哎,说a limit还可以吗?当然你看一下我们此时呢,这样的一个操作。咱把这个先往后拽一拽。但是你看我这个操作的话呢,是不是查出来咱们叫各个部门的一个平均工资对吧。然后这个平均工资的话呢,咱们是不是可以给他排序啊。排序的话呢,我们这个,哎,方便起见,咱这就还起个别名。Avg的SL,好,然后呢,排序,咱们就下边加一个order by呗,Order by呢,哎,我们说可以使用这个字段的别名去排序的,咱们按照这个升序来排,来选中执行,好大家看此时的话呢,我们这个3475是不是就放在最上面了,那在这种场景下呢,咱们这儿查出来数据呢,是有12行,如果我只要第一行数据,那是不是自然而然就是我们所谓的最小的了,那第一行数据的话呢,咱们是不是说就可以这样来写呀?好,选中了再去执行,这不就只有他吗?
26:01
当然这个操作呢,咱们说你要就是从头开始偏移量是零的话呢,可以直接写成LIMIT1是不是也行,好了,3475出来了,这个出来了,相当于我们是不是就搞定了刚才的这个问题了,那我们外边这个帽呢,是不是再往这套一下就可以了呀。哎,那我们就这样看,我到这CTRLC一下。这样拿过来,咱们此时呢,这不是需要一对这个括号吗。然然后呢,我把这个呢,CTRLX咱们。这个这个放到这儿吧。放到这儿。那这就行。这个符号也跟着得走。哎,这个大家看,那你看这时候我们就找到这个3475了,然后平均工资是3475的,哎接着往下走,这是不是也可以啊,走一下好挂了,我们看看这个哪个位置这块有问题,嗯,先说这儿吧。那这个位置呢,咱们查出来的是这个,哎,3475,然后啊,这是不是我们少一个括号的问题哈,那这个包起来,然后这块还还少一层括号。
27:05
是不是跟这个得匹配上是吧,好这个时候我们选中在执行,那就出来了,那52部门。哎,没问题。行,那这个呢,还可以使用这个limit。啊,把这个思路我们要打开,当然了有同学可能会说说老师啊,这个有没有可能是这样一种情况呢?就是我们在查询完以后啊,这不也排序了吗?排序完以后呢,有没有可能最上面这两个值是相等的,比如说第一个跟第二呢,都是3475,那么我们这时候你要是厘米的话呢,是不是有可能会丢呢。哎,大家你看啊,如果你上面这两个完全是一样的话呢,我们现在取的呢,是这个平均工资,然后看谁的平均工资是这个是不是不影响啊。你这块取的叫3475,下边你要说谁是3475,那有可能就是找到两个,那么还是这两个呢,能够留下来的,所以不受影响。对吧,你细细的品味一下不受影响,你想它都相等了,那你俩一样的数,那我们要是自己写,反而还在这块想加个distinct,我还想把重复的给去掉呢,是吧,所以呢,不用担心啊,另外一点的话呢,如果放到其他的场景下,大家你要细看一下,像咱们这里边取这个叫平均,那尤其呢,像这个公司中人数比较多,像平均呀等等的,你要说求总和吧,有可能俩总和的是一样的,像平均这种的,通常很少出现这个完全平均值是一样的情况,对吧。
28:20
哎,这个要注意一下啊。好,这呢是我们说的这个第三种方式啊,感觉上应该可以了,是吧,来咱们再头脑风暴一下,我来写个方式四。几个方式四。A,方式四还能怎么做呢?还能怎么做呢?哎,我说呀,这时候呢,我可以这样去想。咱们现在呢,是不是查询叫什么呀,叫平均工资最低的部门信息,咱们在上一章当中我讲到这个相关子查询的时候呢。那咱们用到过一个在from当中去生命子查询,这种方式呢,实际上需要大家能够跳脱出来,就相当于我们这个造了一张本身不存在的一张表是吧?诶,然后把这个表的数据呢,我们放在from里边,相当于作为一张呃,暂存表了,那么这个时候呢,叫平均工资最低的部门信息。
29:09
我说呀,我就可以造一张,哎其实跟咱们刚才说这个方式有点像哈,哎,我呢把这个平均工资,各个部门的这个平均工资,哎,我呢就把它也看成是一张,哎临时表,然后呢,看跟我们现在的这个表呢,能不能做一个多表的一个,哎连接查询,哎就是这样的一个思。你看我select一下depart。Department ID。然后呢,还保留一下它这个avg的一个salary。这呢就是各个部门的一个平均工资对吧,诶from一下这个employees,然后group。拜一下这个department ID,哎,这呢,我们就相当于查出来各个部门的一个平均工资了。没问题是吧,好,然后这块呢,我说呢,这个表我们还想再给它动一下,怎么着动呢,我就直接排好序了,这个位置呢,我们来一个别名,然后把它呢,CTRLC粘过来,AI的方式去排序好,那这时候呢,我们再去做一个执行,现在呢,是不是就排好序的这样一个方式了。
30:12
对吧,这样方式,那其实这个里边呢,我们想要的呢,其实对于我们来讲,是不是还真就是第一条记录啊,那我在这个基础上呢,你看我在limit1.01,相当于这时候这张表我们走一下就只有一条数据了。那就只有这一条数据了,那就只有这一条数据了,然后我让他跟咱们另外一个表呢,去连一下,诶你看啊我select,哎,我就先清一下吧,然后from谁呢?诶咱们不是要找这个部门表啊,这个departments,然后逗号一下,第二张表就是我们这张表。那非常的巧妙,哎,这个呢,因为你作为一张表出现了,咱们就要给它取起个名字了,我叫DEPAVG的这个SL。哎,这呢是做一张新的表,好,那既然是两张表了,这个咱们也起个名字,这个叫D吧,这个表跟这个表呢,是不是一定得有这个连接条件。
31:04
Y一下D点底盘麦地跟我们这个表的这个有点长。他的depart啊,这个咱们这不也有这个PAR吗?是吧。Depend,诶,这个俩,它俩是不是应该相等。没问题是吧,它那应该相等好,那然后的话呢,你看我们这个部门表里边呢,它这个星其实就代表一个一个字段了,其实也有一个底盘麦地,你这个里边也有,它这边有这块我们要执行的就有风险了,是吧,因为说你这个字段就是不明确的啊,两个表中都有了,我们就明确一下,咱要查的是这个部门表里边这个所有的字段。我说呀,这块呢,其实就完事了。大家你看能理解吗?我们这个表呢,就只有这一条数据,我现在就找这个部门表跟你这个相等的,那其实我们相当于就是过滤了一下这个部门表,只要了那个50号部门嘛,哎,这不是查出他点星嘛,你看自然而然的,我们这块选中了一只星,哎,就出来了。没问题是吧,那这时候呢,我们是不是就只用了两层这个呃,循环就搞定了呀。
32:03
啊,大家你想,原来我们用的是几层啊?12344层,那现在呢,我们是不是就用了两层就可以了呀。啊,这里边儿这个好坏高下立判。那么呃,这一章的话呢,咱们更多的呢,希望大家能就是咱们这个上篇更多的希望大家体会的就是呃,你可以头脑风暴多去写一些这个做法,我上边的话呢,虽然有的都写了一种,但是并不意味着只有这一种写法,当然你可以把思打开,我们可以多去写几种方式啊,然后呢,我们到时候下篇的时候,咱们再去对比一下,说到底哪种方式好,当然对比的话呢,咱也不用硬看是吧,硬看那也太累了,我们有相关的一些这个分析的工具。看一下我们这下篇啊,就始终吊吊大家这个胃口是吧,坚持让你学下去,在我们这个第八章当中有叫性能分析工具的使用,那这一章呢,我们就相当于能够去判断一下,说到这个circleq呢,靠不靠谱,那查询慢是吧?查询慢我们在怎么去搞定这块呢?是我们在实际工作当中排查这个circleq慢的一些,这个流程你看写的非常的清楚,下边呢,还有具体的这个介绍,然后形成参数等等是吧,然后呢,接下来就涉及到我们该如何去定位,比如说我们去统计SQ的这个查询成本,用什么参数,然后慢查询日志怎么分析,然后下边呢,还有慢霞日志的一个分析工具。
33:23
上面是怎么找这个慢查询日志啊,然后呢,这个再接下来的话呢,哎,就是慢查询日志的下面是怎么去找这个慢查询啊,找这个慢查询啊,然后呢,诶这个接着呢是怎么去分析这个日志啊,用的这样的一个my down slow,然后再往下的话呢,有这个收profile啊,查看具体的这个S库执行的成本,还有呢,我们这片啊执行成本里边呢,它会有具体显示的这个时间。啊,你看到底哪块是慢了是吧,然后explain呢,就是整个来分析我们这个SQL的语句啊,主要呢就是查询语句嘛,那这里边呢,就非常的细致了,有这么多的这些参数呢,可以去考虑。那行,那我们就把它先关掉是吧,哎,就不让你看了啊,然后我们上面这块呢,大家,哎,更多的呢,就是你放开了去想,放开了去写,哎,然后呢,你要是从这个语法上呢,自己分析出来,这个慢,这个快,那当然更好了,那更多的我们还是通过工具来去做,OK。
34:14
行,这呢就是咱们说的这个第八道题,然后咱们接着看这个第九题。说他查询平均工资最低的部门信息和该部门的平均工资,诶这样一看该部门的,呃,最低的部门信息,我们上一道题。是不是就是最低的这个部门信息啊。对吧?然后他又多了一问,说和该部门的平均工资。那就意味着就是我们现在呢,查询的还是这几个字段,希望呢,你在后面呢,再补一个字段,就是你这个52部门的平均工资。如果本身呢,让查50号不行,工资呢,对于大家来讲不是难事,但关键呢,是希望补到我们这个位置上是吧。补到这个位置上啊,那这个怎么搞定呢。哎,怎么搞定的,哎,我们上边这块啊,咱们是不是讲了四种方式,咱们比如说就先拿,先拿这个第一种方式,我们CTRLCL一下,咱们先拿过来。
35:08
这是第一种方式,那第一种方式放到这儿以后呢,我们看一下他希望呢和该部门的平均工资,这个呢,比如我们叫部门表,咱们起个别名叫D吧,那其实相当于我们现在已经查出来D里边的这四个字段了,还希望在这个后边是不是再加一个东西啊。对吧,那加的这个东西呢,现在呢,我们是不是一句话说不清楚,你没办法把这个最低这个平均工资写到这儿了,那就意味着呢,我们在这个位置啊,是不是说又得放一个查询类呀。查询什么什么什么,然后诶正好放在这儿,然后一执行出来了,就是50号部门的平均工资,是这意思吧,那么这时候呢,大家就看到了哦,原来在查询的这个字段位置呢,也可以来写这个字查询的。对吧,也可以来写这个词查询,咱们最后讲这个子查询的时候呢,是不是提到了这个这个事情就是除了这个叫go跟limit之外,其他位置都可以写,那我们S拉这块呢,是不是也可以写啊,诶这个呢,就是我们这样的一个例子,好,那我们要查询的就是,诶刚才咱们知道是50部门的,那这就是50部门的这个叫什么平均工资是吧?嗯,Avg的一个salary from一下。
36:17
那employers。Where?这个嗯,Depart ID等于50是吧,好,那么写完之后的话呢,来我们选中做一个执行。那这个呢,当然太长了,我们是不是考虑起个别名啊,那我们就叫做avg的一个SL吧。哎,跟这个名看重复了是吧,那这样行不行呢?哎,我们选中执行那是可以的啊,因为里边呢,用完之后呢,它中间又套了好几层,这个名呢,其实就已经用不着了,传递不到外边了,对吧?那么这时候呢,哎,大家可能说哎挺好,完事了,呃,这个下一题注意先别弄啊,你看这个位置的话呢,你是不是写成50写死了,你凭啥说这块写50呢。你是不明明确知道你这个前面查的是50部门的,你这才写的50是吧,你要这样的话呢,那就别整了,那就直接你就写查50部门的,呃,部门信息不就完了吗?你这块写不就是因为不确定是不是50嘛,所以这个位置写50写死肯定是错误的。
37:15
那50步写写多少?写多少?哎,小豆啊,你看这个位置不就暴露出来是50了吗。这是50是吧,哎,那就相当于,诶我这个呢,位置能不能用呢,我说呀,我就可以写d.depend ID。那我就大胆的就写上了,我大胆的写上以后,我就大胆的去运行了,然后呢,就果真还对了。大家看看能不能行,有同学说,哎,你这写的表明这个叫D,这怎么在前面就用了呢?你别忘了,咱们是不是讲过circle的一个执行的一个过程,当时呢,说过是不是先从from开始,再去找where,哎,这个再去找group by,再去找having,然后回来是不是到select这了?那你想想,我们是先从from找的,这时候已经有表的别名了,你select当中能用吧?
38:03
啊,你比如说这块能不能用了,你这块不都用了吗。对吧。所以说呢,我们这个位置是可以用的啊,那么这个位置我们找到的是谁呢?你下边都一顿过滤,过滤完以后剩下的不就是50部门,那这个值其实就是50嘛,所以呢,没有问题。哎,没有问题啊,那这个呢,是我们针对于方式一来做的,那其实相当于我们下边这个234是不是CTRLC一下,你只需要呢给它。完整的我要粘过来啊,粘过来以后呢,你在咱们上边这块,你把这个需求啊,我CTRL一下咱们往这块放。就可以了是吧,哎,这个粘过来,既然我们这呢写个别名啊,这叫地点呗。那这个位置也是D点。那这个底是吧。哎,逗号一下这样呗。哎,这个逗号一下它是吧,好,那这是我们选中。哎,这块呢,我们执行一下,哎这个你看也可以,哎,上边。
39:02
也可以。在上边儿。也可以没问题是吧?好,那这个题呢,我们就说到这儿,那这样的话呢,大家你回过去再去看,如果呢,上来就给你抛一个这个问题,大家你能不能想到呢,直接就写成这个方式四这样的一种方式呢?啊以及呢,以及呢,写到方式四这种方式以后呢,你返回去能不能把这个对应的需求给它翻译出来呢?那这个呢,是需要功底的。好,接下来我们看一下这个,呃,第十题,这个第十题的话呢,叫查询平均工资最高的job信息。诶,这个题的话呢,我说呀,其实跟我们这个第九题呢。有点类似,为什么这么讲呢?你看第九题呢,是查询啊,第九题跟第八题是类似啊,因为第八题呢,第九题是在第八题基础上去做的,看这个。查询平均工资最低的部门信息,查询平均工资最低的job信息,哎,其实你看这块都是类似的,一个最高一个最低而已,然后这个呢,是从部门表里边这个,你是不是从这个,呃,Jobs这个表去找就可以了。
40:01
哎,就是我们这个叫jobs列表去找是不是就行,所以呢,第八题跟第十题呢是类似的。哎,这样,因为咱们这一节的这个课后题呢比较多,咱们把它呢分成两部分啊,这个第十题呢,咱们分成这个下半部分来讲。
我来说两句