00:00
好,来我们看一下这个第十题啊,刚才我们说了跟这个第八题的话呢,它这个思路呢是一样的,所以说这个第十题的话呢,它也有四种写法啊,如果大家对刚才这个讲解的第八题呢,不是很清楚的话呢,那我们这块呢,也是这个写一下这四种写法,这个呢,我速度呢就可以稍微快一些了,那首先的话呢,我们需要查询出来平均工,各个照白地的这个平均工资,对吧?好,那我们select一下叫avg的。Salary from employees,然后这个group buy一下。诶,就go by,我们这个叫照ID,这呢就是各个照白ID的一个平均的这个工资啊,这块呢就查出来了,然后在这里边我们是不是是不是要去找这个最高的呀,同样的道理,我们在这个avg的外边呢,加一个max呢,是不靠谱的,所以呢,我们把它呢想变成一个普通的字段,呃,思路呢,就是我们把它用一个from这块来包一下,让它呢作为一张表去出现的,是不是就可以了,是吧?哎,这是我们这样个思路,那这样的话呢,我们就给这个字段呢重命一个名,那这个表的话呢,也命个名叫table呢,叫job的avg的一个SL,好,这个就没问题了,然后呢,我们就可以去select一下我们这样的一个字段。
01:11
哎,然后呢,From这张表里边,好,这时候我们做个查询啊,就出来了。然后出来以后呢,我们去找这里边儿是不是平均工资最高的呀,所以我们这呢,就取的这个叫max。哎,这个呢就是最高的好,此时呢,我们选中去执行,OK,现在出来呢,就是两万四行,两万四呢已经出来了,然后我们接着来看一看,说哪一个部门,呃,这个job的是吧,哪一个job ID的平,呃这个平均工资是这个24000,就这个意思,好哪一个job的相当于是不是还得呃哪一个job的平均工资,那是不是还得去分组啊?哎,那我们要找的是这个叫job ID,那from这个employees。哪一个job的,那不就要找的是job ID嘛,From employees,然后呢,The group buy一下我们的job ID,然后having什么呢,咱们要找的是这个平均的这个salary,它得正好等于这个两万四的嘛,哎,就是这个思路,那这个两万四的话呢,咱们这不是已经是查出来了,把它往上边这一扔,然后呢,可读性好一点,往上提一下,好,这样呢,我们就查出来了,说这个你看哪一个赵白地的平均工资是这个两万四了,找一下看这个赵白地啊,走一下出来了就是这个这个赵白地,然后下面呢,让让我们找这个赵白地他这个部门的,呃,他这个照的信息,那其实就从我们这个。
02:31
看是不是jobs这个表里边我们去找就行了,是吧。这个from。From jobs,哎,Jobs,这个乔布斯是不是叫jobs?啊,V一下叫job ID等于那就我们这个结果。哎,这么着,然后这块往里扔的时候,就是把我们这个分号呢给去掉,哎,CTRLX啊往这一粘。然后整体上往这块去移动一下,好,这时候呢,我们就查出来了它的这个信息,那就是它。啊,President啊,这个是就是老板是吧,好这个呢,就是我们查的这个第一种方式,那对应的我们就是第八题的这个第一种方式,好,那么我们在这个基础上呢,咱们不是改的这个叫方式二嘛,好,我们这块是同样的道理,我把它粘过来,这个叫方式二。
03:13
然后呢,这呢,我们说处理这块儿说呢,这个是各个job ID的一个平均里边的最大值,那我们平均里边呢,看看怎么把这个最大值给它取出来呢。哎,怎么把它取出来呢,我们说呢,可以把这个呢,把它就干掉了是吧,然后这个位置呢,也就不要了,这个呢,边边也可以不起了,这个往前这块移一下。哎,这么着往后移一下啊。行,这个呢,我们多一个这个名称,把它这个去掉啊,这个稍微往前移一点。这个好可以了啊,大家看,那这时候呢,我们查出来是各个照白地的一个平均的一个工资,我们要找这里边最大的是吧,那这呢也是这个平均,那相当于我们恰好要找的就是角大于等于这个是不是O就可以了。
04:00
那大A等于二,那实际上我们就大于等于这个最大值,大A等于最大值,因为你又本身属于这里边圆,你也不可能说比这个还大了,那你就只能是等于这个最大值,哎,这呢,其实就出来我们这个,呃2万,这个两万四对应的这个工资了是吧,两万四出来以后呢,这个招白定呢,就找到了,还是他是吧,然后我们在这块包一下。啊,没问题,还是这样一个情况,这呢是咱们说这个方式二,哎,这个方式二呃,方式三的话呢,咱们实际上是在呃这个limit这块呢,是做了一个操作是吧。这个思路呢,是什么样的呢?我们在这个基础上,我们这块去拆解一下,给我写一个方式三,好,大家看这块啊,这个位置的话呢,咱们其实用的就是一个简单的等号了,嗯,怎么找的呢?我们在这块呢,是各个job ID的一个平均,平均里边呢,我们来了一个order by啊排个序,然后这呢叫avg的一个SL,我们就按照这个字段呢,咱们是要找最大值的,是不是就DEA降序排列啊,降序排列完以后,然后我只取第一个,那就是limit一下,零逗号一,这就有个标准写法,那此时的话呢,我们这个两万四呢就拿到了,然后呢,看这个两万四的这个信息,那这就我们这个方式。
05:10
三是不是这样的一个写法呀。OK是吧,哎,这种方式三的写法行,那方式四的话呢,我们是不是又造了一张表,相当于是啊方式。四方14的话呢,我们相当于是按照这个job ID呢是呃,按照这个job ID呢进行分组,然后呢,查出来各个组的这个平均工资的,然后把这个相当于我们是给大家造这张表,来来我们拿过来就跟咱们那个第八题呢其实类似,所以我这块写起来呢就快一些。拿过来。这个呢,这个还要不要啊,这个得要行看一下。这呢是我们查询一下,这个我们前面还得补一个字段,咱们便于你多表的一个连接嘛,是吧,照白D,然后呢,这个平均工资,嗯,这个表分一下组,然后呢,这个order by一下,Limit一下啊没问题,那此时的话呢,我们查出来其实就是这个信息。
06:05
啊,这个信息好,然后呢,我们就可以去from一下,这个叫jobs,我叫勾了啊逗号一下,那后边这个表呢,就是我们这个自己查出来的结果构成的这个表。这样子好,然后呢,既然是两张表了,这个表你得起个名字T,嗯,Job,那avg的SL啊这么着,然后呢,自然而然的需要这个连接条件,说where一下勾点job ID等于我们这个表的。它的一个招白地是吧,好这呢我们就连接起来了,那连接起来以后呢,那你想想我们这个查出来以后,这个表呢,很遗憾我就只有一条记录,那你现在我们是这个表里边跟他连,那其实连出来以后是不是就只有这个招牌地了,那接着的话呢,我们去找这个。哎,咱们这个select这个勾点星是吧,那就可以了,那其实查到就只有这一条记录了,来我们选中咱们跑一下,那这不也可以吗。
07:03
行,这呢,就是咱们说的这个第十题啊,第十题。嗯,好就过了啊。然后接着咱们看这个第11题,说查询平均工资高于公司平均工资的部门有哪些啊,这个应该还好一些是吧,上面呢,算是达到一个小顶峰,然后这块呢,这个难度呢,比上面要低一些,那我们可以咱们刚才呢,经过这样一番讲解呢,大家应该心里边有数啊,就是在我们写这个复杂的时候呢,大家你会发现我是不是都是从里往外写的,而且写一点是不是运行一点是吧?哎,确保没问题了,我们再往外去写,这样你最后呢,运行的话呢,基本上都不会出错,所以呢,大家啊,你要是稳妥起见呢。包括呢,我们写了这好好多道了,大家脑子可能有点嗡嗡的了,是吧,那这时候呢,稳妥起见的话呢,是不是就从里往外写呀。首先呢,我们查询一下,就是公司的平均工资,这个呢比较简单。Salary。那from一下employees。
08:01
没问题,这呢,就是公司的这个叫平均工资了,诶就这么多。然后呢,说查询平均工资高于公司平均工作部门,那就相当于是得按照部门来进行一个分组了。按照部门来分组,然后查查这个部门都有哪些,那就是department ID from一些employ employees,然后葛如何buy一下。这个ID。Group by,这个大家现在找到这种感觉,就是文思如泉涌,然后感觉手跟不上你的这个思考的这个过程,有这样一种感觉吗?就是你看电这个电影当中呢,经常这个一个小伙一己之力呢,就解解救了地球是吧,你看那个拯救地球里边,诶,流浪地球里边是好像是不是就有这段一个编码的一个过程哈咔咔的一个一顿写啊,就跟一个黑客一样是吧,那其实呢,真正在开发的时候呢,其实我们基本上不会啊,实现就是体现那种就是这个文思如泉涌的那样一种状态,那那其实都是在乱敲是吧,真正开发动作呢,我们一般都是思考,一边思考一边写,所以这个编码的速度其实没有那么快的啊。
09:04
但是如果说你就是很熟的话,那可能写起来,呃,就是除非你写比较熟的代码嘛,你可能才会出现这样文思如泉涌,或者这个呃,你感觉这个想的呢,比你写的这要快啊,那否则的话呢,你要是陌生的这个肯定是你想的要慢一些啊。啊广去敲了,那敲了都是一堆乱码成是吧,好,然后go一下他。啊,后来这我们要干什么来着啊,说出去了是吧,我们说要查询各个照,呃,这个department ID,它的一个平均的工资是吧,那就是having,诶这个group了,好having一下这个平均的这个工资。整体来看一下,这呢,我们查的是各个部门的,这个叫平均工资是吧,这个平均工资呢,是不是比公司的平均工资呢要高啊,哎,那我们就大于一下。这么着,然后把这个呢,CTRLXCTRLV粘过来,往这一走。好,选中啊执行看看都有哪些部门啊,这时候大家就会发现呢哟,这个没有部门的哥们呢,他们也集合在一起算成一个部门了,那咱这块呢,让求部门呢,写个no是不是不太合适啊,你可以在这个位置呢,咱们加上一个where,咱们前面也说到了非聚合函数的过滤条件要声明在where当中,因为效率比较高是吧,就相当于在一上来的时候呢。
10:17
来我先写上啊,一上来之后呢,我们服装完以后呢,就把这个数据过滤掉了,你就不会参与后边这个分组了。那你要写到heaven这块的话呢,这个相当于此时分组的话呢,还有这个no的存在呢,是吧,那我们提前呢就把它过滤掉,这呢有八条数据,那执行完以后就七条了。啊,这是我们这个第11题。接着啊。查询出公司中所有manager的详细信息。所有manager的详细信息,这个呢,我们前面是不是做过这个类似的呀。做过这个题吧?啊,我怎么感觉有点熟啊,但是你看我们讲这个子查询的时候,嗯,子查询的时候,我们是不是在讲这个exists的时候啊,所查询公司管理者的诶信息。在这呢,就是管理者的信息,哎,其实就是这道题是吧,就这道题好嗯,咱们当时呢,是不是讲了几种方式啊,三种方式吧,那我这块是不是就可以抄一下了,CTRLC一下,CTRLV粘过来是吧,好我就不写了啊来咱们稍微的过一下。
11:15
那有同学呢,前面听的时候呢,可能还有点迷惑啊,咱们快速过一下,所以manager的详细信息,那咱们前面以前做过一个这个叫什么说谁谁谁啊,他这个叫a worked for啊谁谁谁那诶谁谁YYY了哈,那前面呢,就是员工,后边呢是他的管理者,那这是这样,但是现在呢,我们相当于是不要他了,就那只是查这个所谓的管理的信息,那其实呢,也算是一个自连接的一个思路啊,那我们这个呢,是当员工这个当这个管理者这样呢,一连接,那一连接完以后呢,如果我们没有这个distinct去操作的话呢,这个查询的结果你看就比较多。除了公司里个老大的话呢,把每一个员工他对应的这个管理者都列出来了,那显然这里边呢,你看只要是100的都是这个人,这这都是重复的数据是吧,所以我们这里边补了一个叫distinct的嘛,就是驱重了一下,所以呢,这个结果啊,就是这样的,一波人18个人没问题,好这是一个思路,再一个思路的话呢,就是我们查询管理者的,那你先把管理者的这个manage ID先找到呗,这不就这样嘛,然后一下,然后看看哪些员工的employd呢,是这个manage ID,这不就查到了,哎就这样,这用的是in啊,这个in的话呢,我们说在呃,实际咱们开发当中注意听啊,实际开发中这个in的时候,如果你要是能用in,大家呢,你顺便呢,就想一下,哎,其实呢,就通常可以改写成exist。
12:32
再说一遍啊,写印的位置呢,通常我们都可以考虑改写成叫exists。那我上边呢,也有一些用的是in啊,你看一下怎么去改啊,我觉得我讲到第几题的时候啊。是第四题,哎,你看第四题的时候呢,你看我这写的是in,你看考虑一下,诶第五题这也是in是吧,你看我们,哎这个第六题,你看能不能哎把它改写成是用这个exists来写的,那么not in呢?找过来在哪呢?在这是吧,哎,那我们有的时候呢,会出现not in,它下边我记得有这个题,Not in的话呢,就可以改写成叫not exists。
13:09
哎,就是对应的一个啊行,那么我们这个思路的话呢,就是我们从外边找一条数据,就是一共107条嘛,先取一条数据放进去,然后呢,看看送进来的这个数据的员工ID是不是在里边,这个表呢,有员工的manager ID跟他是一样的,如果有一样的,那说明我们送进来这个呢,就是管理者嘛,哎,我们就留下这条记录,然后把他的信息呢打印一下,哎,这不就是管理者的信息吗?啊,就这个思路。哎,就这个思路啊,好的,这呢是我们说的这个,呃,12题啊,这个呢,就是咱们讲过了,我就不往下写了啊。好,那么接下来我们来看一下这个13题。这个13题的话呢,啊,有点逗啊,说查询各个部门中最高工资中最低的那个部门的最低工资是多少?啊,跟年轻似的是吧,再来一遍啊,各个部门中最高工资中最低的那个部门的最低工资是多少?还是有点懵。
14:00
还是有点懵啊,那这个呢,只要蒙的话呢,你可以举个例子啊,比如说我这是一个部门,这个部门,这是一个部门。三个部门。各个部门中最高工资,那我们列一下,比如说这个最高工资是8000,这个是9000。这个是1万。哎,1万好,然后每个部门呢,它对应的也有这个最低的工资,比如说这个呢是3000。这个是4000。这个是5000。这是每个部门的最高工资和最低工资,那我问大家,你说我们这个需求想查出来的是谁?想一想。哎,我们就这样捋一下啊,说各个部门当中,三个部门中最高工资,最高工资就这仨当中最低的那个是不是就他呀,哎,最低的那个部门的最低工资,哎,是不是要查的是5000呀。那这个题目呢,让查的其实就是这个5000这个数据就他那怎么搞定啊。呃,那我们就按照还是那个思路呢,就是一点点的从里往外这样去整呗,首先呢,是不是查出来叫各个部门的最高工资吧,老老实实的来写是吧。
15:08
查询各个部门的最高工资。From an employeeee。这个自己这个,不管你是张嘴说也好,还是心里边默念也好,是各个部门的最高工资,是不是一定要分组了。各这个啊,各个部门吧。Department ID,那这样的话呢,我们就找到了各个部门的这个最高工资了。是吧,也出来了,出来以后呢,找这些部门当中的这个最低的工资。最高工资中的最低的那一个,那是不是又考虑说在这外面要套一层面,咱说了不能套,哎这呢是不是跟我们第八题和第十题的那个思路又一样了呀。哎,又一样了是吧,那咱们这块呢,不妨就再再写一下,大家再去熟悉熟悉方式一。从这里边呢,找他的最低的那个工资,那还是from。
16:02
把这个呢报一下。哎,往这移一下,然后呢,这个位置我们起一个别名啊max。叫ICL,然后这个表呢,起个别名是table,是部门的。部门的这个max的这个salary是吧,这样。好,那么我们接下来就可以去那select一下我们这个字段。那从我们这张表里边这呢,跟这个查询结果其实是一样的啊,我们要找这个字段的,这个叫最低的念一下。啊,这不就可以了吗?最低的走一下啊,四千四好,四千四呢找到了,接下来的话呢,我们就看一看说什么呀,这个哪个部门的最高工资是四千四吧。哪个部门的,那我们要找的是这个department。ID啊。IDID啊,From一下employees。
17:00
哪一个部门的最高工资,哪一个部门是不是我想强调的又是分组啊啊第part。哎,MID是吧,按照它进行分组,嗯,然后呢,哎,Having什么呀,最高的这个工资,哎,最高这个工资怎么着啊,是不是恰好等于我们那个四千四啊,哎这么着。把这个呢,CTRLX啊往这一粘好,往后边一移。诶,然后这时候呢,我们选中这呢,我们就查出来了,说哪一个部门的最高工资是这个四千四了,那找到了是十号部门,然后我们这个问题呢,是不是就归结为查询十号部门的。最低工资了,哎,这个就简单了,12部门的最低工资。Select一下me。ST。一下。Employees是吧?哎,问一下department。哎,这个等于是不是就这个12部门啊。把我们这个啊,最后这块呢,我们写的时候呢,把它往这里粘的,这种感觉还是稍微有一点成就感的是吧,但是呢,你多少也要有点这个自责感,什么意思啊,写的越多呢,不意味着说你这个成就越大,写的越多的话呢,其实意味着这个效率呢,有可能会越差。
18:17
哎哟,大家看。我们这时候查询12部门的这个最低工资呢,还是4400。我们刚刚明明查最高工资是4400,最低的也是4400,感觉有点怀疑是吧?哎,说这个是我写错了吗?哎,我们可以查一下from一下这个employees说为什么这个部门的最高和最低都是四千四呢?有哪种可能性呢?是不是有两种可能性啊,一种呢,就是这个部门中所有员工都是4400,再一种呢,就是这个部门就只有一个人。所以呢,最高最低都是他自己。啊是这个意思,行,这呢是咱们说的这个方式一的一个写法,那么很显然这里边呢,我们是有优化的空间的,对吧?啊我们好,我们把这个呢,CTRLC一下,咱们再粘过来,我这个叫方式二。
19:02
嗯,放这儿的话呢,还是在这块处理,说having这个max它,嗯这块呢,我们是不是就要给他处理一下了,跟咱们刚才那个思路,前面第八题第十题的思路是完全一样的。好把它粘过来。这个我就不要了,这个其实也多一个括号啊,不要了,好大家看。这个啊,这个不要了啊,我们现在呢,是找到这里边的最高工资,我要取这里边的是不是最低的那个啊,取最低的其实你就相当于是你要小于等于这个二了。我小于等于,这里边儿所有的小于等于所有的,然后呢,那其实你就是小于最小于等于最小的就行。然后你有本身属于它里边,你就等于最小的呗。哎,等于最小的,然后这块不就妥了吗?来选中跑一下。啊,最低工资啊,四千四是吧,咱们不是要查这个最低的吗?没问题。这个呢就相于我们相较于方式一呢,就少了一层,跟咱们第八题第十题是一个思路,然后呢,在这个基础之上呢,咱们再去改一个这个方式三,其实你也知道我这个思路是怎么改了,咱们是不是可以考虑用这个呃分页这块这个思路了,把这个位置呢,其实咱们就写成个等号了,是吧,然后这个位置呢,咱们来了一个呃先这块起个别名叫做max的SCL,然后呢,来一个叫all bed。
20:17
那我们这个字段。咱们要找的是最小的,那你这块呢,得是升序排吧。然后呢,来个LIMIT0逗号一这呢不就找到了这个还是这个四千四了是吧,然后这块呢,再去取啊没问题。那还是这个四千四好,这个呢是我们这个方式三,然后方式四的话呢,清楚吧,跟我们八第八题第十题是一样的。方式四。行方案四的话呢,我们这时候呢,相当于也是造个表的这样一个思路,那相当于我们就是呃,这个from一下,然后呢,首先这个还得需要什么呀,这还得需要这个员工表是吧,我就直接写了啊E逗号一下,然后这个位置我们需要整一张表,这个表是谁呢。
21:03
哎,这个表呢,就是我们查询一下这个各个部门的是不是最高工资的事儿是吧。各个部门的逗号一下最高工资啊,这个我们都留着啊,这个其实都都过来,CTRLC一下拿过来。好看一下查询出来各个部门的一个最高工资,那我们呢,又排序又limit这块呢,其实就还是得到这一个那12部门的这个信息,然后呢,哎,把这个表呢,我们做一个固定,哎,做一个这个固定的一个表呢,给它保存一下。Depd max派CR,好,然后呢,既然有两个表,那就一定需要这个连接的条件,说where,员工表的这个depart。哎,问ID。那跟我们这个表的。啊,底盘的。ID那是相等的,那我们这儿呢,因为就只有十号部门,所以说我们过滤完以后呢,相当于员工表呢,只找到十号部门了,那知道十号部门呢,我们就下边呢,是不是就找这个部门的这个最低的一个工资就可以了。
22:10
啊,这个查完以后呢,不是只有十号部门嘛,然后查询他这个mean salary这个salary,诶这个呢,当时没有,诶没有冲突的是吧,那这个sal呢,其实就是我们这个员工表里边的。那就它里面的哈,找一下哎四千四是吧,哎还是这个啊。好了,那这样的话呢,我们就把这个事呢,就说清楚了啊,把这事就说清楚了,大家呢,再去体会一下他的一个思路啊好,接着我们来看一下这个第呃14题。这个写四种方式呢,还是比较耗神的是吧?好看一下第14题说查询平均工资最高的部门的manager的详细信息。平均工资最高的部门的manager的详细信息。啊,有的同学呢,脑子已经有点懵了是吧?先干什么呀?平均工资最高的部门。是不是先搞定?
23:00
平均工资最高的部门啊,平均工资最高的部门。啊,我脑袋都有点儿懵了是吧?哎,平均工资avg的。平均工资啊,然后from employees grow by,呃,部门,那这个呢,就按照department ID来分组呗,分完组以后呢,这就是各个部门的一个平均工资。可以是吧,然后这些平均工资里边呢,我们去找什么呀。是不是涨得最高的呀。啊,又是那个套路啊,From一下,然后把它包一下呗。这样是吧。好看一下,嗯,起一个这个字段呢,先起一个别名。然后这个表呢,起个别名。好再看啊,嗯,然后呢,我们去select一下啊,Select叫avg的icr,好这呢就是各个部门的这个平均工资嘛。啊,都出来了,嗯,平均工资最高的那个,然后在那儿去找了一个最高的。
24:03
打到最高了,最高呢跑一下。啊,是这么多是吧,平均工资最高的那个部门,哎,你是不是得把这个部门的先告诉我呀。部门告诉我怎么办呀,是不是就找到这个叫department地啊?买地是吧,哎,From一下我们这个employees,哎,你看哪一个部门的平均工资是这个数,哪一个部门的,所以呢,是不是又得分组。哪一个部门的?什么呀,叫平均工资啊?哎,平均工资是这个数,是不是就是这样报一下呗。把这个CTRLX啊放到这。往右移。这样子是吧,好这样的话呢,我们就找到了这个工资是哪一个部门了。90部门好,然后这个题目呢,就变成了查询92部门的manager的信息,92部门的manager,哎,你是不是需要呢,叫哎,Selected叫manager ID是吧,From。
25:02
Employ employees,然后wear一下。一。Apartment ID啊,哎,这个就只有一个了,92部门等于,哎,把这个90号部门呢拿过来。这个,哎,这么着。这样是吧,好把这个先去掉,这样的话呢,我们就查出来92部门的这叫manage ID了。啊,你看这块还有这个呃,重复的啊,那我们下一步呢,其实就看这个谁的employd是不是这个100,那那就不要了是吧,就这块我们至少呢,先可以先加上一个叫distinct了。然后下边呢,我们说谁是no啊,其实这块自动把no就给过滤掉了啊,这呢就找出来了我们这个manage ID,那接下来你要看他的信息呢,不就是看说谁,呃,其实就是找这100号这个人的他的这个信息呗,不就是查这个字段吗,CTRLC来。哎,Select就它,然后from一下lo表,然后where什么呢。Lo ID是不是就等于100啊?
26:02
不就是我们查出来的这个信息吗。那关于这个no怎么处理呢?因为本身员工表中就没有员工的employed呢是no,所以呢,在查的时候呢,自动的就把它给去过滤掉了啊。选中。选中执行。挂了啊,这块来说不止一个啊,因为咱们看到有个no嘛,所以这个呢,我们改成in对吧。哎,注意这个in的话呢,可以,我还可以改成谁呢,我们先跑一下。出来了是不是就这个人是吧,哎,就他啊,然后这个呢,你要不用in的话呢,其实还可以,大家你看这样行不行,我就等于any。等于any,就是等于这里边任任意一个值啊,其实相当于就是也是in是吧。啊,也是OK的啊啊,前面的那个in呢,也都可以改成等于any。好还是他?哎,这个呢,就是我们这个题目啊,这个我写个方式一吧,这个写完方式一的话呢,其实大家也都知道这个思路啊,是不是你可以考虑在这块呢,给他处理处理啊。是吧,哎,这个呢,就是很自然而然的,我们就你看这块写的还是很崩崩溃的啊,一个两个三个四个,我是不是写了五层的这个select呀。
27:09
啊,这个还是挺复杂的是吧。好,至少的话呢,我们能给它去一层,就是在这个位置。在这个位置,然后我们就把这个给它。看看啊,拿掉往前移。那这个就不要了。这个括号别碰了啊行,那这块我们要找的是这个,呃,平均里边这个最大的这个是吧,平均里边最大的这个最大的话呢,我们就可以让它是不是叫。哎,大于等于这个O呀。哎,大于等于二,那就是大于等于这个最大的啊,那它本身就是里边一个呢,其实它就是等于这个最大的呗。那这样的思路好,我们把这个呢选中走一下啊也是他是吧,啊也是他。好,这个呢就可以了哈,呃,然后的话呢,咱们再去思考一下,诶说这个呢,还有没有别的这个思路呢。
28:04
啊,还有没有别的这个思路啊,哎,其实还是有的啊,咱们上面不是写过四种方式,其实这块呢,也类似的啊,类似的话呢,呃,这个第三种方式呢,还是这块考虑进去,加一个order by啊,加个limit啊,第三种我就先省略了,咱就直接奔着这个,比如说第四种方式来写吧,我这写个方式三哈。怎么着啊,我们这是各个部门的一个平均。哎,各个部门一个平均,那我这块呢,还是把它呢,造成一张表,我查询出来各个部门的这个平均好。啊,Select相当于咱们上面那个第八题或者第十题的第四种方式啊,直接来写各个部门的。它的这个平均的。Salary是吧,那这个呢,我们给大家起个名啊,From一下。Employees,好,然后这个呢,都保留啊哎。保留,然后呢,加上一个嗯,Order by啊,我们是不是要找这里边这个最高的是吧,那我们直接呢,Order by呢,就按照这个字段呢,来进行一个排序,然后找D,然后来个LIMIT0逗号一,这时我们就找到这个最高的了。
29:14
92部门是吧。好,下一步是什么呀,我们是不是找到这个部门的,这个叫。呃,麦亚。哎,找到这个部门的这个manage ID啊,那这块呢,我们可以用一个多表的查询也是可以的啊,哎,我select要查询出来的是这个manager。ID啊,From一下employees,然后这个叫E逗号,然后另外一个呢,就是我们这个表。哎,往这移一下好,这个呢,我们取个别名t1.dept。然后它的AV JK。Avg的IC,好,这呢是两个表出来了,然后呢,我这写一个where啊,这个E的。E的什么呀,嗯。Department ID跟我们这个表的。
30:03
哎,这个department。哎,是相等的,因为这里边儿我们查出来是不是就只有90部门了是吧。哎,就只要九号部门,90号部门了,然后呢,我们相当于就是找这个,哎这个部门的。啊,找这个部门的他的一个嗯叫嗯有点有点缺氧啊,我吸口氧找这个部门的相当于过滤完以后呢,就是只找到员工表里边90了,找到以后的话呢,我们看这个90里边这个部门的manage都有谁。啊,是不是跟我们刚才一样,这个位置我们再加一个distinct是吧。哎,是不是这么着一下。没问题是吧,哎,可以的啊好,这个完了以后呢,在外边儿呢,跟咱们这个思路就一样了。哎,我已经找到他啦,然后呢,接着就加一个这样的帽啊就行。哎,这个我们就直接用in吧,就别整这花里胡哨的了。哎,这么着,然后把我们刚才的这个啊CTRLX啊我们粘过来。
31:02
哎,这么着,哎,往这边移一下是吧,哎,这样的话呢,我们就找到了这个manage ID啊,其实就这些,然后印一下啊,这不就查出来了啊,执行没问题是吧,还是它这个呢,我们就写了123是不是三层啊来可以啊。行,这个呢,是咱们这个第14题啊,下边呢,还有这123456啊六道题啊,我先先保存一下。来接着咱们来看这个第15道题啊,整个我们子查询这块呢,问题比较这个课后练习题呢比较多,就大家呢多去练一练啊好,然后呢说看这个15题查询部门的部门号,其中呢不包括照白ID呢是这个的部门号。那自然而然的话呢,我们就要先查出来赵白丽呢,是这个,哎,这个这个这个咱就不叫部门了,这个工种的这个部门号都有哪些是吧?然后呢,把这些扣掉,哎,查询部门部门号,哎,扣除掉是不是就可以了,哎,行来我们看一下,首先呢,我们查询一下叫depart。
32:00
ID,然后from一下。Employees,然后呢,叫where job ID啊是等于ST。这个clerk啊好,那么找到这个赵白底对应的这个叫department ID了,看一下,哎哟,还挺多的,诶哎,这都一样是吧,那我们这块呢,就distinct一下呗。嗯,这样是吧,好,那这样的话呢,你就定位好说对应的这个department ID呢是多少,是50,说查询部门的部门号,不包括这个,其实就不包50呗,那部门的部门号,那其实他就是说,呃,你去从这个哎部门表里边去查,那就是depart。Department ID是吧?From一下叫departments这个表白从列表里边去查,说where什么的,Where。这个department。说白了就是我们这个department ID相当于就是不等于50是吧,那你可以这样写,不等于50,那另外一点的话呢,就是咱们其实也不是太确定,说这个job ID呢,是这个的,呃,部门有几个啊,相当于我们建议大家呢,就是呃,你要用in的话,就等于,那最好呢,我们是不是用not in啊,因为咱们不确定它就是一个,在这个题目当中,它恰好就一个,所以你这个题目呢,你用不等于倒是也行,对吧,他说也行,那文妥起见呢,就是not in。
33:20
啊就出来了,那一共呢,这个部门咱们应该大概清楚啊,这个公司当中的部门一共是有27个,然后把这个呃50号这个部门呢,给它扣掉,是不是就他呀行这呢是一种方式,你看我们这呢,出现一个叫not in,这个not in呢,出现之后呢,我说呀,通常大家都可以考虑呢。方式一,把它呢改写成叫not exists。试一下,看看能不能写。12。嗯,看怎么写啊,这个呢,相当于叫not exist,大家可能对exist呢比较熟悉,就是相当于我们,呃,从外边找一条记录,然后把它塞进去,在里边呢,能够找到跟它一样的记录呢,我们就要,那你not呢,就是不要了,那这个你可以先理解成是包括的,那not不就不包括吗?
34:03
就这个思路行,那其实还是相当于我们是嗯这个事儿啊,CTRLC一下啊到这,然后where呢叫exist。Exist行,就它,哎。Select。Select星是吧,诶from一下,这个我们叫an employees,然后where看where我们怎么写这个呢?是咱们说的这个叫部门表是吧,这个呢叫诶这个叫员工表。我们看这个关联关系怎么去处梳理,相当于呢,我们这个,呃,部门表里边找到这个部门的department是不是跟员工这个department呢,去匹配相等的,对吧,就一一匹配相等的,然后呢,我们要求呢,是这个,呃,人家员工的这个照搬D。它是等于这个叫ST Clark的,相当于这么着一查的话呢,我们相当于是就能查出来这个员工呢,是这个赵白地的这个招,呃,这个底盘来D是多少,然后我们现在呢,实际上不是说想要这个的,咱们恰好是不要这个的,所以说我这儿呢,是不是就来一个note呀。
35:04
哎,这样子就可以了,来我们走一下。啊,这块提示我们说near where啊一点照白地。这个是吧,好,Where这写错了,是不是写一个and呀,应该好可以了,选中了我们再执行,那这呢,不是还是26条记录吗?那这呢,就我们这个第15题啊,把not in改成not exists这样。好,接下来我们再看下边这个。说选择所有没有管理者的员工的last name。没有管理者的员工的没有管理者,那其实呢,这个就是相当于公司的这个老大了,是吧,那这个我们怎么做呀。呃,正常来讲的话呢,我们说找到一个这个人,找到有管理者的话呢,就相当于是呃进去之后,呃有管理者的话,进去之后呢,就是他自己呃的这个manage ID是不是跟某一个人的这个employee相等了,说明他就有管理者,那现在没有管理者,那我们就直接来个not就行。其实这个写法呢,也可以有多种,也可以有多种的啊,我这块呢,直接就我就不写那么多了,直接咱们写一个这个not exist的这个方式。
36:05
嗯,员工的last name,哎,From一下这个employees,然后where啊,其实这块呢,还是一个not exist,但是大家可能对not这个呢,可能感觉不是特别的灵敏,那咱们先写成这个exist的方式啊。我先查什么呀,我先查出来这个,呃,有管理者的员工的信息。De LA。哎,这个我们来个星,然后没有管理者,你就加个not就可以了,From here,这个还是这个employees,这个我们叫一二,这个咱叫个一,哎,这样好,然后where,关键看这个where怎么写。怎么写?那有管理者的,相当于我们这块呢,查的是员工啊,那员工呢,放进去之后呢,相当于你这个员工的manager ID。外边的这个员工的manager ID在里边呢,发现有的有人的employ ID呢,跟你是一样的。那就说明我们,呃,就是相当于这个一二呢为代表的,其实它相当于是这个管理者了,这个呢,这个我们换一个吧,比如这叫emp,这个我们换成叫MG,大家可能更好理解一点。
37:08
你看就相当于呢,你外边这个员工呢,我们找就是找到了,说诶我这个员工的manage ID在里边找到记录了,说明你这个呢,就是这个员工呢,就是有管理者的是吧,就是有管理者的,那我们现在呢,是不是不要管理者的,就是没有管理者的员工的信息,那不就是not吗。来,我们选中了再执行。啊,又错了。看一下我们这个原因说E2点哦,我这啊这还写了个一二了啊,CTRLC一下把这个来替换一下。哎,选中找一下。诶,那我们这个公司当中,实际上就只有这个king呢,他是没有这个,哎,没有管理者的是吧,因为他是公司的老大了嘛,哎,这个就这样来处理行就过了,接着来看这个第17个题,说查询员工号,姓名,雇佣时间,工资,哎这个呢,比较简单直接呢,就告诉我们要查什么了,来写一下。Collect employee ID last name her data,然后salary。
38:04
哎,From一下这个先把它写上,都来自于我们的employees,这个表没问题,其中员工的管理者是他。员工的管理者是他,那我们这时候呢,是不是就先找到where,嗯,咱们要找是这个管理者是他的这个员工的信息,那就是where,我们找到这个人的,嗯,他的employd,然后where呢,是不是叫manage ID,哎,恰好是不是等于这个的就可以了,这么着是吧。你看这个思路,来我们一起select一下。那employed。ID from一下。啊,Implies。哎,说where一下,嗯,Where一下,这个叫嗯,Last nameme,哎,等于这叫他这个名字。哎,CTRLC。好转过来。看这个能行吧,相当于我们找到这个人的employd,说看这个人呢,他叫什么是吧?哎,不是叫这个名字的,他的employd是是多少102,那就看诶哪些员工的管理者ID是102。
39:06
那那这时候呢,相当于就找到是。这个管理者他的这个属的这个下属是有谁是吧,那焦立明呢,还是那意思,他有可能是不是有多个人啊,那有多个人的话呢,那我们这块呢,这个你考虑改写成是一个in啊,就是保险一点啊OK来我们选中执行。啊,就只有这一个人是吧,那就他一个行,那这个呢,能够写成是in的方式呢,大家通常就要考虑说它其实就可以改写成是用it来写,所以我这呢再写一个啊,这叫方式一。然后再接着。防沙。嗯,考察好。方式二来看一下怎么来处理呢?小心一点是吧,那我们现在要找的是这个员工。嗯,这是员工这个in的话呢,要改写就是exist,那not in呢,就是not exist。那这样好来选中。看怎么来处理这个呢,我们给大家起个名字叫一,然后下边呢,就是select一个星,然后from一下这个,还是这个员工表里边好where,关键是看这个where怎么写啊。
40:10
嗯,这个呢,我们叫一二。嗯,他呢,其实充当的还相当于是员工了,这个呢还是这个部门,那相当于就是这个,呃,员工他去找谁呀。他是不是去找这个叫manager ID啊。这个呢,你得捋清楚啊,找many ID跟我们这个一二啊,一二呢,它本身就是管理者找他的这个employee ID。那就像你是员工,你员工的这个管理者,诶恰好就是我是吧,就是我这个人,然后同时。哎,咱们and呀,这个一二的它的lastname。诶,就是叫这个名,通过这样的方式呢,我们就找到了是不是一二这个人名呢,他的employd了,然后看外边呢,说呃,哪些员工的这个many ID恰好是这个employd,哎,这不就找到这个对应的这个员工了吗。是吧,呃,这个一这个位置呢,其实大家都可以加上,但是呢,呃,不加呢,其实也不会报错,因为我们这儿呢,是在条件当中是出现另外一张表,不是在这个这个连接多表连接当中出现的,所以这块呢不会出现说有歧异的问题是吧。
41:08
那还是这个人啊,当是从这个咱们当时讲过,说从优化的角度来讲,建议呢,大家是不是把这个每一个字段都写上,但是这块呢,倒还好哈,其实不用写了,为啥呢?因为这不是多表的一个查询是吧,哎,你就直接这样就OK了啊。好,这呢是咱们这个第17题啊,第18题。说查询各个部门当中工资比本部门平均工资高的员工的员工号、姓名和工资。哎,本部门诶这个题的话呢,咱们是不是作为一个典型的题目,在这个呃,相关子查询当中,咱们来讲了呀。找一下。这个把它变小一点。相关子查询,嗯,回顾啊,就这是吧,查询员工中工资大于本部门平均工资的123,大于本部门平均工资的员工号姓名和工资,诶就它吧,这个咱们当时讲了两种方式,一种呢是使用这个叫相关子查询,另外一个呢,是我们用的这个在from当中去写这个,哎,子查询的一个方式啊,这个题呢,咱们讲过了啊,我就粘过来,我就不写了。
42:11
好,这是这个第18题,好,来,我们接着看下边这个第19题。说查询每个部门下的部门人数大于五的部门的名称。诶,这个需求我们倒没做过,每个部门下啊,这个注意让查这个部门名称的啊,那就意味着是我们叫department name了是吧?查询department name,然后呢,这个部门下边呢,得有五个人来,我们看怎么去做啊,Select一下叫部门名称。哎,Department叫name from一下叫。Depart。Mens是不是这张表啊,啊,这个我们起个名叫D,然后where。哎,为是什么呢?哎,我们这个每一个部门有一个ID,把这ID呢,送到这个员工里边呢,哎,然后匹配完以后呢,看看哪个是大于五的,那其实就是五这块,我们就要小于一下这样。
43:08
这样是吧,我们select一下count。哎,From一下叫employees,这个我们叫一个E,然后where什么呢?我们让地点depart。哎,ID跟我们1.departmentid它俩呢是相等的。好,大家呢,你看一下我们这里边儿这个思路是什么样子的啊,就是我们外边这块呢,送进来一个底盘的ID,然后在里边呢,我们过滤一下以后呢,是不是就剩下呢,是跟你这个ID一样的这个员工了,然后这个员工的话呢,我们看有多少条记录,如果这个记录呢,是大于五的,我们是不是就要啊,那这呢,就是我们这道题的一个解决方案。啊,其实这还是一个叫相关的查询啊,因为把外边这个表呢,是不是送进去了。啊,就这样啊,其实还比较简单一些,好下一个说查询每个国家下的部门的个数大于二的国家编号啊国家这块呢,涉及到这个表,咱们没怎么接触过,那看一下是在哪个表里边select星from一下叫locations是吧。
44:08
查一下我们这个locations的这个表,这儿呢,有对应的叫。哎,Country ID country ID是不是就是这个国家呀,没问题是吧,然后这个国家下的部门的个数。那他们有这个location ID location ID呢,关联的就是那个对应下边是不是有好多部门啊,那其实跟这个部门下边查人,查这个员工人数是类似的,行,那我们就可以这样子,咱们select一下叫country。Control ID,然后from一下叫locations这个表,然后呢,Where一下。要求查询是什么呢?这个是得大于二的,哎。哎,Select这个我们叫count一个星,哎,From一下我们的departments表。Department列表是吧,然后where一下,这块呢,我们这起个别名叫L啊,这个呢起个别名叫D,那相当于是l.location ID和我们。
45:07
哎,这个d.locationd呢,这俩是相等的。那就是说他俩我们外边呢,送进来一个国家,送进来一个这个叫CTRLD了啊,送进来一个这个国家的话呢,它在里边啊,呃,这个国家它对应的是不是有一个具体的叫location ID是吧?这个location ID呢?呃,在这里边呢,去找看看,呃它这块呢,有几条记录,只要这个记录呢,大于二了,哎,我们就要这个CTRLD是不是这个意思啊来我们此时呢,选中做一个执行。啊,这块你看只有这个us它是满足的。啊,这就可以了啊就可以了,行,那么至此的话呢,我们相当于把这20道题目呢,咱们就都讲完了,然后呢,咱们最初的时候呢,也提到过这样的一个技巧,这呢我把它呢再拿到最后,咱们稍微的做一个简单的一个小总结,哎,希望呢对大家呢,呃,日后呢,再去写这个紫查询的话呢,应该是有这个帮助的。这个子查询的话呢,我们是写了有两种这个大家思考的方式,一个呢是从里往外写,一个呢是从外往里写,那么下边呢,就是如何去选择的问题。
46:11
那如何选择的问题,那这块呢,我们来说一下这个经验,那么从呃这个这个怎么去选择呢?就是呃,如果这个子查询啊相对较简单。哎,相对较简单,然后建议呢,是不是就可以从外往里写啊。哎,说一旦这个紫查询比较复杂。啊,结构较复杂。那则建议呢,哎,从里往外写。那这是我们诶往外写是吧,这样的思路,这是第一个点,那么还有什么点呢?有同学诶这不就就这个吗?其实还有一个特别的点,但是你看我们这一块呢,是不是都是叫相关子查询啊,就外边的表里边呢,用到了外边的表,像这种场景下呢,通常咱们是不是都是从外往里写呀。
47:04
哎,从外往里写,因为你要先写里边的话呢,里边这个还不知道外边这表叫什么名呢,是吧,所以这块呢,是我们第二点啊,就是哎,如果是这个相关子查询的话。啊,通常呢,都是从里往外写,哎,从外往里写。是这样子的,但是这个相关子查询呢,通常看它这个结构也都比较简单,就是这样的里外这样的两层,哎,在外边的话呢,就连不了了,在外边连的话呢,只能跟你这个连,那不可能再跟里边这个连了,所以呢,也就这两层相对呢,相对来说,大家也可以看到是这个比较简单的这个结构啊,也也就是说呢,这个第二层呢,也可以考虑融到这个第一个里边,就相对比较简单的话呢,你就都用这个从外往里啊,只要是比较复杂的话呢,就从。里往外写啊,这样子处理就可以了啊,这呢就是整个咱们关于子查询的课后练习题,那么到此为止的话呢,咱们关于查询呢,就告一段落了。啊,咱们说了查询是重中之重,对吧,那么大家呢,这块呢,练的不是特别到位的呢,下来再练一练,然后把我们查询的这些课后题目呢,也建议大家呢,一个一个的都写一写,然后呢,你也可以考虑使用多种方式呢去编写,此时呢,我们没有过多的去考虑到效率的问题,咱们就是先放开了大家去写,然后呢,我们后边呢,下篇再考虑说这个SQL优化的时候呢,再讲哪个好哪个不好的问题,OK,行紫查询呢,我们就说到这儿。
我来说两句