00:01
接下来啊,咱们看一下聚合函数这一章的课后练习题,好,那我们找到这个练习,找到这个章节练习,找到我们这个聚合函数。OK。那我们看一看这一章的这个题目呢,有哪几个啊,这呢,我一共是列了有八个题目,来,咱们CTRLC一下粘到咱们这个。这个一个新的这个,呃,这个文本当中,我们这块呢,来做一下这几个练习题。好CTRLV粘过来,然后这块呢,我们把这个题目呢也给他啊,先把这个文件呢保存一下。选中这CTRLC过来CTRLV。这个聚合函数它的课后练习。先把这个文件呢保存一下,CTRLCCTRLSCTRLV一下放到这没问题。行,那这块呢,我们就一个题目呢,一个题目呢去看,首先第一个说where尔子句是否使用,是否可以使用组函数进行过滤呢,显然呢,是不是不可以啊啊这个比较简单,它不是一个,哎,我们编写的这个SQL语句的一道问题啊,非常严格的说是不可以的。
01:05
啊,那反过来呢,说having子句当中是否可以使用这个组函数,呃,这个非组函数,或者说叫这个非聚合函数呢,是可以的,但是咱们不建议呢,是写在这个having名当中,是不是要求,嗯,这个非聚额函数呢,是不是还写到where里面效率更高是吧?好过了啊,下一个说查询员工,呃,公司员工工资的最大最小平均总和啊,这个比较简单,这个呢,不涉及到分组的问题,整个公司中所有员工呢,就看成是一组了。这个max的一个工资的是吧,Salary。然后呢,Mean salary,这个avg的salary,还有这个some的salary,好,From employees,这呢不涉及到咱们group了,因为所有员工呢,就看成是这一组,求一下这几个数据那就可以了,这个呢,大家你要觉得不方便的话呢,是不是还可以起一个别名对吧?比如我们这个呢,叫max的一个S。啊,就通常的话呢,一般像这种带组函数的话呢,习惯上我们都会给它再去起个别名的。
02:04
这叫mindin,这个呢叫avg的,就这呢,大家也能看到,咱们在这个serve当中,在命名的时候呢,如果它是由多个单词构成的,习惯上呢,是用这种下划线的方式做一个区分的,但是你说我要不用这块,我就这样写行不行也可以也可以,所以说呢,这儿呢,是不是一个叫规范呀,就是只是建议我们去遵守好的,这就说到这儿好,下一个说呢,查询各照白ID中,呃,各照白ID的员工工资的最大最小平均总和,按照这个照白ID呢,进行一个分组,OK,那select,我们就job ID。然后呢,是max这个还是这个工资的事儿。Salary salary。然后呢,这个呃,平均avg的salary。然后这个some,这个salary好from呢employees这呢有个分组是按照我们这个job ID啊来进行分的,好这里边我们再强调一下,就是写赖当中呢,呃,除去这个聚合函数之外呢,剩下一个它,那这个呢,是不是一定要写在这里边,反过来的话呢,这个是可以不写的,对吧?这要不写的话呢,我们运用完结果以后呢,这个还是19,这个19行数据,只不过呢,这时候我们不太清楚哪一个赵白地呢,是不是这样的一条数据啊,那所以说我们可以给他补上,那结果呢,你看一下,其实还是这个19条数据。
03:22
对吧,只是多了这样的一个字段,方便呢,我们去查看哪一个具体的工种啊,是这样的一个信息。OK,行,这就说完了,那上面这块呢,我们起了别名,这块没起我就不写了啊好,这个大家知道,这个事儿一般呢,咱们都会起个别名,好下边。选择具有各个job ID的员工的人数啊,这个是员工的人数,各个job ID员工的人数来我们select相当于呢,我们是不是按照这个照白D呢,进行一个分组,求它一个count呀,Count是吧?Count这块呢,我们提到了是不是一个星employees,然后group。Buy一下,这个叫job ID,按照招牌D呢进行分组,看看各招牌D当中这个员工的人数呢是多少?
04:06
啊,这样的情况。各招牌地当中,按员工这个表里边儿,我们去进行一个查找。啊,分一下是吧,每个员工呢,其实他都有这个对应的招牌地的,所以这块呢,你看对应的人数呢,就都出来了,这个位置上我们写的是count星,那COUNT1呢。那count e这块呢,呃,相当于呢,我们这一条数据呢,拿A去替换的,那或者呢,我这写一个叫employee ID啊相当于呢,就是具体一个工种的话呢,我们看这个employd呢,有几个,呃,Count这块呢,我们计算的时候大家要小心一点,它是不计算这个空值的,对吧?OK啊行,这个我们就比如说用这个星来表示了。好,接着往下看,这个呢,查询员工最高工资和最低工资的一个差距,Distance,好,这个我们去select,这个最高工资呢是max,那我们叫那个salary,然后跟最低工资的一个差值,那我就直接减了mean的这个salary,起个别名,这叫distance distance就是这个差距嘛。
05:01
这个大家记不记得,咱们讲这个。讲这个呃,日期型这个函数的时候呢,咱们不是有一个叫做是不是叫date diff是吧,那就是两个日期之间的一个这个这个中间的天数,这个diff的话呢,就是这个difference啊,它的这样间距的这样一个单词,OK啊行,那么求这个间距,然后from一下啊employees。哎,OK,然后这块呢,嗯,就是整个公司中员工的,那就不用去group了,哎选中以后呢,去执行,你看这个差距呢,还是很大的,差2万多块钱,好的这个就过了,然后接着我们看这个第六道问题。说查询各个管理者手下员工的最低工资,其中最低工资这么着没有,这个不能不计算在内,那么一看的话呢,你看这里边题目就他长,那长的话呢,通常就意味着呢,确实是会更复杂一些,因为它要求的条件呢会更多是吧。那这块呢,大家你别慌,你就呢,就一个点一个点的去看啊,这个查询各个管理者手下员工的最低工资,是不是涉及到这个管理者了。
06:05
那管理者呢,在咱们这个表呢,肯定是就员工表了,是不是有一个列呢,叫做manage ID啊,那相同的manage ID的话呢,那肯定就是一个管理者了,那我们是不是就可以按照manage ID呢进行分组,那是一样的,这个ID的肯定就是一个管理者了,那你看它下边员工的最低工资,那是不是就这么着,那select最低工资呢,叫做mean salary,然后from这个employees,然后格如何buy呢?是不是叫manage ID啊?那按照ID呢进行一个分组,然后看看每一个组里边的这个最低工资吧。是不是就是这个,然后呢,你你想看一看,说到底哪个管理者手下员工的最低工资是他呀,你是不是可以在这个位置再把我们这个manage ID呢加一下,那这时候我们选中再执行。那这就是这个管理者手下员工的最低工资是这么多是吧,这个管理者手下员工最低工资是这么多,这块的话呢,因为公司那个老大。他的那个manage ID的位置是个nor,相当于呢,就是他自成这个一条数据对吧?哎,自成一条数据,他的这个呃,手下的员工的最低工资,那这这其实就没有了啊,无所谓这个了。
07:09
包括呢,我们下边说没有管理者的员工不计算在内,本身呢,咱们是不是就把它给过滤掉了,那这块过滤的话呢,我们说它不包括这个聚合函数,所以我们就用这个where呢来去填写了,叫做manager ID呢is not not就是相当于呢,我们在分组之前呢,先把这样的数据呢,先给它过滤掉,就不让他再去参与这个分组了。对吧,那就把它给拿掉了,拿掉了好,然后呢,说其中最低工资不能低于6000,你看这里边有的这个最低工资呢,是不是比较低的呀,我们不想要了,那这时候呢,我们相当于是不是有一个这个having having什么呢,就是这个最低的工资。哎,相当于它呢,不能低于6000,那就是大于等于这个6000。好,这块呢,我们封死一下,哎把它呢选中执行,哎可以了,这个呢是比较典型的一个,咱们呢使用上了这个有where,有grow by,有having是吧,这样的一道题目。
08:01
好,接着我们来看这个第七道问题。那第七道问题说查询所有,诶只要看到这个所有了,大家这个大脑当中得绷根线啊,绷根绳啊,这个这个时候呢,所有是不是得考虑是一个外链接的问题,所有部门的名称,Location ID,员工的数量和平均的工资,那涉及到工资,涉及到员工了,那就是员工表,那这个部门名称呢,是不是就是部门表啊,所以首先呢,它是一个。这个多表的查询的问题,然后呢,涉及到所有了,这时候你注意它得是一个外连接的问题。好,查询什么呢?这个比较简单,查什么我们就写什么department name location ID,一边写呢,一边这个回忆一下,或者你想一下这个字段呢,都来自于哪些表,OK,然后看的话呢,这个叫员工数量,暂时呢,我们就先写成一个这个星吧。啊,咱先写成个星好,然后接着呢,叫平均的一个工资,对吧,平均工资啊叫avg的一个salary好from的话呢,这块呢叫所有的部门,那部门这块呢,就意味着咱们也确实知道呢,员工跟部门匹配的话呢,这是有这个正常啊都有的话呢,这是有106个数据,那其中的话呢,如果这是写员工,这是写部门的话呢,工人表里边是不是有一些是没有人的是吧,他让查所有部门的,就意味着这块多,这块多的话,你要是这个连他的话呢,这就是右外连接,习惯上大家可以呢,都用左外的啊,所以我们就可以叫depars,先写这个表,那就是作为叫呃作为呢叫left alter我就省略了啊照应一下。
09:39
照一下我们的los表,那我这个起个别名叫E,这个呢叫D好可以了,然后呢,接着啊d.departmentd呢,跟这个E点啊depend麦D呢,哎这俩是相等的是吧。啊,相等的行,那这个的话完事了吗?哎,这块说还有一个排序呢,啊这个排序呢,咱们等一下说,啊等下说先看这块儿,哎,我们让这个部门表跟这个员工表呢,就关联起来了啊这是一个left来我们这块呢,先跑一把啊一直行。
10:09
啊,一致型啊出来了啊出来了,这个没报错是吧,这个是因为呢,咱们这个MYSQL呢,是不是就比较宽容啊,你这块呢,是不是还没有分组了呀,这呢是这个聚合函数,那前面这两个字段CTRLC是不是一定要放在group by当中。先别着急,家里有分号呢啊行,此时呢,我们再去选中执行啊出来了。出来了对吧,好,出来以后的话呢,大家你看啊,这个出来以后呢,也不一定就是对的。啊,有什么问题呢,大家能看到吗?那首当其冲呢,大家会这个视线呢,关注到这块儿,说怎么这个部门这个部门是吧,那他的这个地方呢,在这儿。啊,地方在这儿,因为咱们本身这个location ID也好,Department ID好呢,它其实是都是来自于这个departments这个表的是吧,所以你加上这个地点的话呢,可以来说要更精准一些啊好,那么这是这个部门,这个部门呢,这块说看星啊,这写个一,为什么这个平均工资这块写成是个闹了呢。
11:14
大家能理解吗?其实啊,哎,我们说呀,这个闹呢,就意味着这个部门其实他是没有人的。他是没有人的,大家你想这个咱们,呃,就是对员工表和部门表还是比较熟的,中间呢,他们共同的是有1000条记录,这呢是员工表的话是多一个人,然后这个部门表这块呢,是不是有16个部门是空的呀,16个部门是空的,那这块呢,我们就可以数一下,你看这个avg salary这块是闹的,你看是不是16个。要这样数的话,感觉有点有点累是吧,那怎么办呢?我们是不是可以写个过滤啊,这个要写过滤的话呢,你看这个题稍微有点难,我带着大家看一下更丰富的东西,正常来讲我们要写顾虑就是avg的salary是不是is not就行,那这块呢,你要写这呃,Avg salary是no,那不太合适吧。
12:01
因为呢,我们V这块呢,是不是说不能加这个,这个叫什么啊,聚合函数是吧,那我们这是我们这是不是就得写到这叫avg的啊这个salary。它呢,是不是我们判断说is now这样。来,我们看一看,这里边儿有一共有多少条这个记录。大家看是不是恰好是16条记录啊,而这16条记录呢,其实咱们就清楚了,就是咱们这个部门没有人的,一共呢,就是石油部门,所以说呢,给咱们查出来,说你这儿呢是闹呢,是合情合理的,没有人嘛,他就是个闹。那这块要是,但这块呢,有同学说那应该写成零吧,那不对,零的话呢,就意味着说你是有人了,只不过工资是零了是吧。嗯,行,那这块写成照了,但是大家你看这块就有问题了。咱们这块呢,说让他代表的是什么呀,是不是说呢,是你这个部门的叫啥呀,员工的数量呀,那这个写成一,那不就意味着有一个人吗?就不对了,对吧,就不对了,那这块大家怎么去理解呀。
13:07
哎,为什么这块有一个一呢,这个能理解吗。为什么有一个一呢?这我写的看的星,看星呢,星代表的就是你这个表中一条记录是吧,这这个表是什么呀。啊,这个题呢,看就是它有这块的一个难度,那我这样啊,大家先抛开这道问题,咱们选着一个点是吧,就是目前呢,几个表肯定查询出来结果他这块是有问题的啊这个你看这样,我们先这么着一下,嗯,我做什么事呢,我查询一下,就咱们这样吧,比如说叫employee ID是吧。然后呢,这个嗯,加个salary也行,接着呢,我们把这两个字段呢加上。Department name,再加上一个location ID。这样,然后呢,这个a from employees,然后加个E,哎,咱们用一下这个叫right吧,哎,Join是吧,我把这个员工表写左边了,Right join一下,我们这个departments表,这个叫D,然后on一下啊e.department ID呢跟我们d.departmentd呢是相等的。
14:06
这个能看懂是吧,好,那此时的话呢,我们去选中一下。好,大家也会看到呢,我们这儿呢,是不是产生出来就是这样的一个情况。那么在这个呃,一共是120条记录当中呢,咱们是不是发现呢,你看这些呢,都是没有人的,对吧?哎,都是没有人的,那么在这么一张表当中啊,咱们现在你可以理解成其实就跟这个是一样,只不过这是写的部门去左外这个员工了啊,这是员工右外这个部门其实是一个道理。啊是一个道理的,那我们现在呢,就只不过呢,我们这时候就没有查这俩字段而已,是吧?啊没有查这俩字段,你这块呢,去执行一下是不是还是这个意思,还是122条记录。还是120条记录对吧?好,那我们加上这俩字段呢,好说明这个点在哪,那什么意思啊,你看我们这块呢,接下来去的时候呢,就把这个你是同一个叫这个这个depend name啊,又是同一个location ID呢,咱们就把它们合一起,就算成是一组了,那只要有一个不一样的,我们就不算是一组,那么大家你就会发现呢,我们对于这些数据来讲。
15:07
那这些数据来讲呢,它你像这个呢,嗯,是不是它就咱就假设啊,下边这个也没有跟这个完全一样的了,咱就自成一个是不是一组了,那这个呃,下边这个呢,是不是有可能它也是自成一组了,那这个时候呢,呃,你毕竟占这个表中的一条记录啊,所以你要是用星来表示的话呢,实际上呢,就说明的是这一条记录了。啊,这一条记录了,所以你要用抗德星,它的结果呢,就会导致咱们这个里边呢,它显示的是一个一了。其实不对的是吧,那应该怎么办呢?那我们要专门看一下我这个员工啊,这个时候呢,我们就可以用一个具体的字段了,比如说我们是考虑一个员工ID,它的一个count,那因为呢,你这个表里边儿,哎呀,我刚才把那个给。我我我再我再我再整出来一下,那这个里边呢,你看我们要是看这个员工ID的话呢,它恰好这块它是不是一个no啊,那你要让他自成一个体系的话呢,这个字段就是no,那我们闹的话呢,本来就不会去计算,所以说呢,这道问题我们可以考虑呢。
16:04
在这个位置写的叫employee ID,你看此时我们再去执行它这块呢,你看显示的就是零啊,就是零了,那进而这个工资的话呢,它就没有了。OK吧,哎,就是这样的去理解,那这块呢,稍微有一定的这个难度啊。好,这呢我们就过了,然后看一下下边这个问题。哎,下边的问题说呢,这个叫查询每一个工种,每一个部门的部门名和工种名及其最低工资啊,每个部门的啊,然后这块呢,来我们看一下,相当于也是一个分组的情况,这呢叫做department name是吧?哎,这叫job的一个ID啊,最低工资啊,Mean的一个salary,好from一下。那下边这块呢,你看这个字段,这个字段都来自于员工表,这个是部门表,是不是又得是一个外连接啊,又得是一个多表的一个查询了,那咱们可以先写上,比如说这个叫。哎,部门表吧,啊D,呃,然后呢,我们去join一下,哎,然后呢,叫employees这个我们写个E,然后on一下。
17:04
连续条件啊d.T拍卖地跟这个一点。第二,哎,这个第八麦地。对吧,哎,这样的话呢,我们就做了一个这样的关联,然后的话呢,哎,紧跟着只要呢,你写了这个select里边包括这个聚合函数的,那这俩字段呢,你就别想了啊,肯定是要往这放的。啊,然后上面这块呢,建议呢,你也把它来自于哪个表呢,也做一个标识。是不是这么着呀?这个是他,这个是他是吧,好的,嗯,然后呢,然后我们接着再看,此时的话呢,我们是查这个,这个做了一个连接了,然后分组呢,其实这块基本我们要去从语法上来讲的话呢,它是可以去运行的了,那然后呢,我们再看一看是不是满足咱们这个题面的要求。他说呢,让查询每一个工种的,每一个部门的,然后工种名,哎工种名和最低工资,既然这块提到每一个部门的,其实呢,我换一个字眼呢,是不是大家也可以理解成叫所有的部门的一个情况呀。
18:03
对吧,哎,所有部门一个情况压呢,我们这个部门呢,是不是你要列的全一点,哎,那咱这块又是一个,哎是不是left撞一下。能理解这个过程吧,Left撞一下,我们这呢,一共有19条记录,那如果我们把这个呢选中执行这个记录数呢,就会更多一些,那那你看19刚才是多少?19是吧?19跟35的差值是不是就恰好是这个16啊?啊,一加20,哎,正好35是吧,那这个16是什么呢?咱们是不是有16个这个部门,它是没有具体人的呀,那具体没有人,这个部门没有人,那他的这个,呃,没有人的话呢,自然而然就没有赵白地嘛,那他的这个最最低工资呢,其实就无从谈起了,哎,是不是就这样个效果呀。哎,这呢,就是我们这道题目的一个情况。那这里边儿呢,大家会看到咱们呢,再去写这些操作的时候呢,难点在哪呢?还是会涉及到一个左外和右外连接的问题。啊,这块呢,大家在处理的时候呢,一定要小心一点,好这呢,就咱们整个这一章呢,算是这个八个问题啊,我们就说到这儿。
我来说两句