00:00
我们接着往下学习这一节啊,我们讲叫分组函数。什么叫分组函数?用来干什么?大家还记不记得?我们在讲第三节的时候,看一下第三节讲叫单行函数,什么叫单行函数啊?我们说你一行记录,通过这个函数返回一个结果,这就叫单行函数。我们也分了好几类,大家还回忆一下啊,有字符型的,数值型,日期转换和通用,其实我们说转换型的比较重要。那这个叫单行函数,那么跟单行函数相对应的就有一个叫多行函数。怎么叫多行啊?那是不是意味着你是针对多行数据进行处理的,相当于多行记录通过这样一个函数返回一个结果,那就就是多行函数。对吧,好了,有了这个概念以后,我们回来再看我们的叫分组函数,那么我们说分组函数就是我们要说的多行函数。
01:04
来多函数进行一个分组,比如说我们举个例子啊,这是我们的employees这个表,在这个表格里边,其中有两列,有department ID有salary。那么我们关注一下这个salary,整个员工很多,我想把这个employees这个表里边公司的最大值给输出出来。看看谁的工资是最大的。这是不是意味着你得把这个表里边的所有员工的工资都给输到这样一个函数里边,然后通过这个函数对比以后出来一个结果,只要最大的呀。这是我们用的叫求的最大值,同样的我还可以求最小值,或者求一个公司的平均值,那是不是都应该是多行记录进去,出来一个结果呀?哎,那么这里边儿我们提到的这个最大最小和平均就是典型的分组函数。
02:02
其中的三个。那么我们再回来再说一下我们这一章啊,主要都要学哪些内容,一个呢,就是我们刚才提到的最大最小平均等等,还有其他的这个叫做主函数。我们需要了解一下主函数,并且能够描述主函数的用途,知道怎么使用,这个难度不大。哎,难度稍微大一点的是后边两个知识点,一个叫使用group by子句对数据进行分组,再一个就是在使用格外以后,如果还涉及到分这个这个过滤了,而且这个过滤条件在,而且过滤条件当中使用的组函数,我们还要讲另外一个关键词叫having。使用having子句进行过滤分组。这是我们这一章要学习的内容,重点呢是后边两个,当然后边两个里边是要嵌套组函数的,所以我们先来学习组函数。
03:01
这一节里边我们要讲的组函数呢,有这样几个,也是最常用的一个叫avg啊,Count max min,这是求方差的一个标准,呃,应该叫标准差,这呢叫sum,求和。这几个单词啊,大家应该不太陌生,我们在讲Java当中多多少少的都接触过,我们先把这个加灰色的这个稍微给大家唠两句啊,实际上你大家上初高中的时候是接触过这样一个概念的。他说是用于求标准差,标准差是个什么概念哈,或者说这个方差是个什么概念,下边有个解释说用于做聚类分析使用的。尤其是学这个统计的,比大学的这个专业就是数据统计,那是是你经常要跟他打交道的啊,我们在有样本的前提下,那经常是需要用它来分析这个数据的一些情况的,我这里给大家举个例子,你了解一下,这个叫样本的标准差。
04:08
之后呢,我们也不怎么再去提他了,我们举一个实际情况,你看现在呢,我们说有两个人,一个呢,比如说我就叫张三吧,这是一个运动员。现在这几天冬奥会刚开幕是吧,我们也用这个运动员的这个概念来给大家提一提李四,这呢有两个人,张三和李四,我们假如这两个人啊,都是练跳远的。当然,呃,当然我也不太清楚这个跳远的现在世界纪录是多少啊,我们比如说张三张三啊,张三呢,我们假设现在世界纪录是两米,假设世界纪录是两米,张三这样一个运动员。现在国家队要选派他们俩,看看谁去参加奥运会更合适一点,当然是谁的成绩更优秀,就应该选择谁去,对吧?现在世界纪录我们说是两米。
05:16
职业记录是两米,那张三呢,通过他近一年的一个数据的统计,我们判断出啊,他在一些大赛当中平均的一个成绩啊,是2.1米,相当于是不是说肯定是能够稳破世界纪录的。哎,可是呢,李四结果一判断,他的时间平均的这个成绩啊,也是2.1米。那么这个时候就比较纠结了,这两个人平均成绩都是2.1米,按说呢,如果他们去参加这个奥运会的话,正常来讲都能够破世界纪录,都能够拿到冠军,应该问题不大,但是呢,他俩谁去更合适呢?这个时候你不能剪刀石头布了,那我们再就需要一个叫样本。
06:06
偏差的一个概念。这个是另一个数据,相当于我们刚才这个2.1米使用的是不是ABG啊,平均的一个情况,那么这个样本标准差怎么用呢?我再看一下这个数据,我发现张三在他比如说进行100个他跳远这个数据当中进行统计,最后的平均结果是2.1米,但是它的这个样本标准差呀,是十。是十单位是一啊,它这个样子特征它是十,这个李四呢,发现它呢是二。我就随便几个换个三吧,它是三,它是十。那么选谁更合适啊,我们说啊,选李四更合适,让李四去参加这个比赛更合适。这个怎么讲,这个样本标准差它描述的是个什么概念,我一说大家就知道为什么要选李四了,它呢描述的是我用每一个你平均的,就是你每一个100条100个数据嘛,我用每一个数据去给你这个2.1去做差,做差以后求平方,这样我能避免做差,有的是正的,有的是负的,对吧?做平差以后,我把这些所有的值加起来,发现张三等于十。
07:22
这个呢等于三,那么这个数越小,是不是就意味着它距离这个平均的情况是越近呢,对吧。你看我们这里描述的是这样一个概念,假设这呢,就是这个平均的就2.1,肯定这个人的跳远的成绩是有高于2.1的,有低于2.1的,平均才是2.1,我描述的是这这些数,每一个成绩跟这个平均的2.1做差以后求平方,相当于是不是这个距离的一个平方呀,把这个所有的距离的平方都给它加起来,如果这个数越小,意味着是不是它会越贴近于。是不是越贴近于这个平均值啊,那就说明这个人的成绩是不是就越稳定啊。
08:04
那么张三是十,那就意味着它距离这个平均值距离比较松散,那就是成绩发挥的不稳定,最后一球也是2.1,而李四呢,成绩很稳定,那如果要出于破纪录的角度来看的话,那李四去是不是就更合适一点?因为他去有很大的可能性,就是稳妥记录,那你张三一去的话,有很大的风险,有可能他的记录更好好了,哎,这个跳了2.5也有可能,是不是就跳了一个,是不是1.2啊。这个风险比较大,所以我们可以选李四去。而而这个里边的它就是通过这样一个概念描述的。那么在真正大家如果要是有学理科的话,学统计的,那么这个概念我们当时做聚类分析,做相应回归分析,也都需要用到这个概念,这个值越小,说明你比如说你得到这个效果就越好。行,这是我们讲的,哎,这个概念哈,那么他过了以后,我们之后也不咋提他了,我们用不着,除非你有专业的跟专业相机关的了啊,你需要用这个了,那么除了这几个以外,剩下这五个就是我们这节课要带领大家学习的五个组函数。
09:17
我转弯处,我们来简单体会一下。哎,我们建一个command啊,这已经打了command window,我写一个这个select的avg salary,这能看懂吧,我求工资的平均值,Avg salary mark salary in salary。还有一个叫。嗯,看看完了。啊萨是吧,总和那个看到我们一会再说from,不好意思,我们先体会一下。我写这两行代码想描述个什么事?我要求出employees这个表里边儿的所有员工的工资的平均,所有工资中的最大、最小以及总和。
10:13
结果在这这呢,我们就很清晰的看出来,Price表当中,工资最高的是24000,最低的是2100,一个月需要花多少钱啊,发工资就得需要花69万多。那么每个员工的平均工资是6000多。这样一个数对吧,6000多好了,这是我们简单来体会了一下这样几个组函数,下面呢,我们再分别来提一下,分别提怎么提啊,我们先看中间这两个。中面这两个叫ma子和m ma子和蜜,这里我们需要提一下ma子和me里边,我们这里写的是不是就是你employees的表里边的列啊?那么这个表有哪些列啊?EA employees一看有这样一列,我们刚才使用的叫salary。
11:06
我求了一下最大和最小的三,那我们在考虑,那其他的这个变量我能不能求啊,比如说哎,求最大的employidd,最小的employd是吧?呃,Name,最大最小的,嗯,How的最大最小分别表示什么意思?来,我们试一下select markx,我写一个email吧,然后再来一个mark,这样这样写吧,写那样太乱了啊,Last nameme last last nameme,然后nameme last nameme。再写一个mark her,这个能看懂吧,我想求一下名字中的最大,名字中的最小,这什么意思啊?我们看下结果你就知道了,他这这我就清楚看,看来公司当中谁的这个head这日期最大,谁的日期是最小的。
12:15
这是运算结果,从结果当中我们能看到啊,名字最大的,那就是是不是首字母这个字母最大呀,Z的,然后这里边儿你再看第二位谁的又又大,那么这个人就是最大的,那么最小的叫阿贝尔。日期这一块,那么过去的这个日期,我们把它看成是个数的话,它就是不是就小啊,然后最大呢,当然是最近的,最接近我们的这个日期,它就是最大的。以及结合上我们刚才用的salary,我们说大家注意了啊,我要说一句话说了,Ma和M作为两个组函数来讲,它里边存放的这个这个这个对比的这个,放的这个列哈。既可以是误差类型的。
13:00
也可以是date类型的,还可以是number类型的。它这数据是没有限制的,也就是说任何数据类型都可以使用max米和幂。好了,这句话我们清楚以后我们再回来看另外两个函数叫avg和S。Avg和萨姆,我们在这呢,是不是里边放的是number类型的呀?求一下这些数的平均这些数的总和,那么我们试图也跟刚才一样去使用这个,你看行不行?给它改成EG。再想一想,是不是感觉应该也不行啊,你看数据类型不一致,应该为number类型,但是却获得了date型,后边的不行,那前面的能行吗?把它删掉。
14:04
是不是也不行啊。也不行,这我们要说明一个什么事啊,大家注意,我要总结一下,Avg和sum作为两个组函数,它里面存放的数据类型是比较严格的,只能够存放number类型的。只能够存放number类型,你像这个lastname作为water类型的,Target作为date型的,都没法使用它们俩。这是我们这个从这个结果上来看出来,然后我们体会一下,你想一想这个名字这一块,你求个平均,这这成什么了,也没有任何意义吧,求个总和,名字求总和,那就怎么就就就就有总和这个概念,还对求来公司员工的平均,那你这个要是一个number类型的型,那日期的话,里边可能还有一些特殊字符,怎么求平均,怎么求和也没有意义,对吧,所以说他们两个使用是有严格要求的,我们在这里有写,它俩只能够针对数值类型,而这个呢,是可以针对任何数据类型的。
15:11
这个是需要大家注意的一点,好吧,然后下边还有一个叫count,这是我们第五个主函数,叫返回表中的记录总数,它也是适用于任何数据类型的。它也适用于任何数据类型,好,那我们来看一下。它既然适用于任何数据类型,我们单独的来说一下这个,看看select看看。我这是写salary,写salary,我写这个吧,Employee ID,这是不是也是一个number类型的呀,然后count一下last name count一下能看懂是什么意思吧。
16:06
返回一下,我看看你这个表里边employee ID是不是有多少个呀。Last nameme有多少个,Date有多少个,这是不是就相当于是不是求出来?这个公司里边这个员工的个数人。都是107,跟你这是什么没有关系,对吧,那你看我使用一下这个呢,Select count,这个需要大家来理解啊,COUNT1 count2count星,或者你随便再来一个count from条意思发现看这个结果一有没有错,第二个有没有输出结果,第三个输出结果是不是都一样。好,回去。
17:00
啊,这最后这个。就是这个有特殊含义了是吧,特殊含义就就就不搞这个了。这个都行,都是107。它竟然都是107,这个呢,需要大家来理解一下,我说明一下这个原因。为什么都是107,我们说这个叫分组函数,是不是相当于我把一条条记录都往这里边放,然后往这个组函数里边放,然后根据你这个组函数表达的具体意思,然后来计算一条数据,对吧?这个函数呢,它就表示算这个这个一共有多少条数目,呃,多少条这个记录最后返回一个数对吧,相当于是诶,我这个employ里边这个表一条数据一条数据往里进进一条数据,它里边显示的是一。那么就算一个,再进一条数据,又算个一,又进一条,一共是107条,这个呢,进一条数据显示的是二,显示的是几,无所谓,只要你这有值就行,算上了,再来一个,又算上,再来一个又算上,还是107,同样它也是这样。
18:10
对吧,跟你这是一和是二没有关系,不能说你这是一,就是100072的话,就应该是这个这个214乘以二,对吧,认证是不对的。如果要是你那样理解的话,那你play ID,那每个人都是什么,这个是零一,那个是零二,那结果也不是107,或者last name,这也不是107是吧,他反馈的就仅仅跟你这是具体是哪个值是没有关系的。就是你进去一条数据就拿这个值,相当于每个人就跟你去去电影院啊,人不一样,但是你每个人是不是都拿张票,只要你有票的话,我就让你进来,就算是一个一个值,一个人当你这个看一下电影院这一场电影多少人看啊,是不是数着票管,只要有票就算一个对吧?行这是我们说的这个看法。然后呢,我们结合这三个说一下哪三个呀,那我这里S拉了一下avg avg salary some salary,以及叫salary。
19:21
这样三个概念对吧,我这儿呢不这样写。我让那个萨salary去补一下,看看salary大家看这个结果是不是完全一样,这个小数点就多点而已啊,这个呢,自动保留了六位196264。呃,196261。这两个值完全一样。这就说明我们这个avg它是怎么算出来的,实际上不就是所有的工资的一个总和除以一下,你看看有多少个人吗?
20:03
明白吧,所有的工资的总和,我除以下有多少个salary的数据?107个一除不就是相当于平均工资了?那就从这个例子当中,我们就看到了这三个组函数之间是有关系的,这个AG salary,它就等于sum除以这个。这是我们要说的第二个知识点,关于他俩他们仨的啊,第二个知识点,嗯,那么我们说一下第三个知识点。关于他们三个的第三个知识点,或者也不一定关于他们仨了,就是所有组函数相关的第三个知识点。我们看这。你看啊看,这里边是你放的这个具体的这个列,不是叫表达式,它返回的是你这个表达式不为空的记录的总数,以它为代表,其他的实际上也都类似的,什么叫不为空的,我们计算一下这个概念。
21:03
Select count,我们知道commission。Pcp有一些值是不是空的呀,我们已经清楚了,这个表里边是有107条记录的,但是有一些人啊,他的commission PT叫奖金率是为空的,我看一下这个结果输出的是什么。是不是35啊。它输出的是35,而不是107,那就意味着它仅仅计算了那些不为空的这些值有多少个,一共是35个。是这意思吧?它计算是非空的啊,非空的是有这么多。那他计算的是非空的,其实同样的,它如果计算非空的,你这样一除是不是除的这个也是相当于是非空的呀。好了,那我们现在想看这个事拉,我写到这吧。
22:19
我让他除以一下看一看的话。大家看这个式子,这是avg,它这个呢,是还是让这个总和去除以一下这个count,我们看这两个结果一样不一样。是肯定一样。肯定一样吧,我们刚才是不是说了它就等于它除以它呀。相当于是不是AG,它也忽略了同值吧。没错,那么我们说这个事啊,你这里算的叫平均的奖金率,平均的奖金率,结果平均奖金率一看还不少,等于0.222,但实际上你细着发现我们刚才也看到这儿了。
23:13
这你要是计算,如果你想计算这个公司当中员工的叫平均的奖金率的话,你是不是不能仅仅的是除以这个有奖金的这些人,剩下的这70多个人还没有奖金的,你是不是也应该作为分母给他算进来啊?但是你这样算的话,是不是肯定没有算进来吧?对吧,哎,就像是什么呀,就像是这个咱们国家一这个这个一谈。这个国民生产总值是吧,说国民生产总值现在已经是全球第二了,呃,去年还是前年就超过日本了是吧?其实只要超过日本,日本就永远不可能再跟上,诶,国内生产总值GDP全球第二,但是一算人均的话非常少,为什么算人均少,就是你这块分母大,但是这块分母,呃,不,这块总值大,但是这块分母也很大。
24:05
如果说你要仅仅算这些什么,有工作的这些人可能一除的话,这个分数小点,算出人均的就高了。但是中国呢,因为呃,在国际上是吧,为了这个少担一点责任,我就想办法让分母大一点,算出人均的少,你说我是发展中国家,那你这个在加入WTO以后,关于上税啊等等的,肯定税率要低,要照顾。那是因为它分母大,它就除的是所有的人,而这呢?我们这个例子当中,如果一个公司他想显示一下我们公司的福利,好,它就除的这个数小,你不能光除这个是吧,你是不是应该得除一下107吧,所以CTRLC,我们看一下公司当中真正的所有员工的一个奖金率平均是多少,那你这最后。就不应该是除差除以你的人数吧,107这样才行。
25:02
好,OK,大家看是不是真正一下,真正的公司里边员工的平均的奖金率只有0.02%,而这个20.22%是你仅除的是35。啊,大家你明白这个概念啊,通过这个例子我想说明的是,使用组函数,当里边放这个表达式的时候,它仅仅计算的是非空的。仅仅计算是非空的。所以说他们两个计算的结果是有区别的,那为什么刚才我那会儿计算这个呃,Salary,这如果我这个换成一个叫呃salary。这呢,也是。哎,我我我这样说吧,嗯。这是salary。大家看你这个结果一样不一样。
26:00
这是不是都一样啊?这为什么一样啊?前面这个肯定一样,因为avg它就等于它除以,它跟这个之所以一样,是因为你判断一下这个count有工资的员工的个数有工资,每个人都有员都都有工资,所以说这个个数算出来是不是也正好是1000几,所以他俩一五相等,对吧?但是对于这个commission PPT,你需要注意,以它为代表的,只要你放的是这个有空的情况,它是不计算在内的,导致这个数会变小。好,这是我们说的这个意思,然后呢,我们想,那怎么我们保证在这个计算的时候。因为不变小,我们当然可以除以热量器,有没有别的方式?大家想想,我们是不是之前讲的一个通用单行函数里边有个叫通用函数啊,怎么办啊,你这有为空的,我就让你改一改呗,当你为空的时候,我给你是不是赋个值就行了呀。负值,负谁都行。
27:00
只要别分不别付空就行了,别负闹是吧,这负now跟没写一样,改一个,比如我这里赋成星。不成星,出成星以后,我们再看一下这两个值,你看一样不一样。看后边两个值,前面这肯定不一样,对吧,因为这时候这这改已经改了,你看后边这两个一样不一样。学识表达式。少一个括号不。那他是在哪指示的啊?Some。这样把它改成一。
28:02
这样好是吧,这种不用先改成一。这个你看结果后边这两个是不是完全一样了,相当于我们通过一个单行函数叫NV2给它呢,哎,处理了一下,当你这个结果为空的时候,让它复值为一,那现在这个个数算出来的就是107。跟它就一样了,好了,这是我们对应的这样一个内容,它是正常是忽略组函数的,但是呢,你要是想不让它忽略,你就使用一下NV,这我们在前面也讲过这个函数了,已经。好了,这是我们说的这个概念,最后呢,关于主函数这块,还有一个就是叫count distinct的,就是我可以返回这个表达式非空的且不重复的一个记录总数,我们看一下这个例子就行了,说返回一下这个employees表当中的department ID的个数,Department的ID,那你就是希拉克它。
29:03
Count department ID,只要ID不为空,它是不是就算一下记录啊,所以说你最后这个from employee完了以后,结果呢,是106,因为有个哥们他是没有部门啊,这106,但不意味着是不是公司有106个ID吧,公司肯定不能有那么多部门,因为你每一条记录进去,他都给你算了一个值,哎,都给你算一条记录,所以最后106,那你为了把它这个重复的去掉,我加上一个第。第PI,这不就把重复的给它去了吗?结果就11个。这是一个。这就是使用了distinct的,大家理解一下。啊,这是我们讲的这一章的第一个知识点叫组函数,有了组函数以后,我们下边就可以讲多进行分组数据了,哎,分组数据来。
30:04
我现在想求这个事,大家你把这个思路转过来,我们刚才已经讲了五个组函数了啊,你再捋一捋,下边呢,我们说一下如何借助于我们刚才讲的这些组函数实现分组数据,比如说我们现在有这样一个需求。什么需求啊,我要求出employ表当中各个部门的平均工资,各个部门的平均工资,你要看这个图的话,我们这一条条数据,我根据department ID都列出来,把这个部门一样的是不是应该连在一起,求一个平均。一样的连一起求平均应该是这样,然后分别出来各个部门的以及它的平均工资,对吧?那么这个就当然你这里边涉及到平均工资,那就是使用到组函数了,那么如何来借助于组函数实现这个数据的一个分组呢?就是我们要讲的如伙伴来,我们直接写了拉,你想最后输出的哪些列,其中有一个叫吉碳,还想输出每一个部门的是不是平均的salary from employees这样写。
31:28
还不行,这样写还不行,我们需要使用组函数叫入BY,按照什么进行分组啊,你是不是说这个一个部门的给它粘在一起,所以我是不是按照部门来进行一个分组啊。按照部门分组,然后你是哪个部门的20号部门,那20号部门里边就是单独的一个20,然后求一下20号部门的平均工资,32部门的平均工资,按照它来进行一个分取数。好,我们运行一下看看。
32:02
那这里我们列出来的就是各个部门的平均名字。这是因为有个有个哥们,他是不是没有部门是吧,所以这呢,它的平均工资也列出来了,这呢,因为这个小角很多,你也可以使用一个大号函数,给它来一个round,给它来一个这个四舍五入对吧。哎,这是我们要讲的,这个叫组函数,就是这个意思,我可以对它进行一个分组使用,我们这里求出来的就是各个部门的平均工资。如果说我这里不想求各个部门的平均工资,只仅仅想求一下有12,看看这个我们这里部门啊,我仅仅想求一下也十了,四十六十八十号是三个部门的平均工资。仅想仅仅想求三个部门的平均工资,那你不就是加一个过滤条件呗,我们之前讲过滤的话,第二节说到了是不是得用where啊,而且讲where是不是一定得给from得挨着呀,所以我们在from之后这加上一个where where什么department ID吧。
33:10
40、60、80。在这三个部门里边的员工的平均工资。看四十六十八十跟我们这边是不是取的都不一样吗。这是我们讲的这个就是如果你要使用一些过滤条件的话,这个要保证这过滤条件跟那个from得是挨着的。也是挨着的,好了,这是我们说的这个概念,然后我们再说一个,再进行一个细分。我们先看这个哈,怎么再细分。我刚才呢,是求出来各个部门的平均工资,我现在还想细分一下,我们知道各个部门里边有可能是不是有不同的工种啊,你看大家看这个图。
34:03
有点稍微有点模糊啊,52部门里边你看有这样两块,它除了有这个叫ST,这个lo这样一个叫计时员一个工种之外,还有一个叫S曼这样一个工种,我想再细分一下,看看不同部门的不同工种的平均工资。比如说这样出来以后应该有两条,一个呢是叫S曼这个工种的平均工资,一个是52部门lo这样一个工种的平均工字,再细分一下,是不是就再进行一个分组啊,如何实现这个。我们先把它去了,那就是这样select的,这是一个部门ID,我看再再需要一个叫job ID吧,区分他俩,然后隔派它,这分组的时候,你现在是不是需要不同部门的不同工种的平均工资啊,所以分组除了要使用其他的ID之外,是不是还得用一个叫job ID吧?
35:06
然后我们运行一下看看。这显然的这个数据比他多了,刚才这就只有12个部门,这呢,除了有有20个,这里就是说你不同的部门里边会有,呃,就是同一个部门里边会有不同的工种,对吧,比如说你看这个52部门有这个还有他。然后呢,还有它。这俩SHFT这俩不一样,就是不同部门的。或者叫各个部门的不同工种之间的一个平均工资是多少?我们就是这样来计算的。这样来计算20条记录,当然这个你前后这俩都都行,你把它调到前面这个调到后边这俩调一下都行,跟这个不需要你。跟上面那个一定要对应,你看我们这是先写的它后写的它是吧,这呢先写它后写它这都没问题,这都可以,这都行,然后我们就说清楚这个事,如果你想进行多层一个分组的话,那你就group by的时候写明多个分组。
36:12
就这样就行啊好了,这个说完以后啊,我们再说一个事。现在呢,我们先把它给去掉。这个呢,我们是不是按照各个求各个部门的平均工资啊,各个部门的平均工资我们在这儿列出来了,然后有个差,我可不可以把这个给它去掉啊。能不能去啊?能不能去,你就看他影不响我这个题目的表达,就是意思是不是明确,语法上是不是能够通过我这儿的话,就是相当于是不是仅输出一下平均工资啊,还是按照这个部门来进行分组吧。那相当于是还是求一下各个部门的平均工资,只是说我没有把这个平均工资给呃,这个各个部门给你输出来而已,照样是没问题的,只是看不出来是哪个部门的,对吧,就是你这样写是行的啊。
37:09
这样写行,那么有同学可能就会想,哎,那这样我我刚才是把这个给它删了,运行型,那我现在这个保留,我能不能把它给删掉,先把它给删掉。这个时候就废了。我们运行一下,你看一看。错了是吧,相当于我们这边是不是根本都没有使用组数。我没有使用组函数,这个叫,呃,不是没有使用组函数,没有使用那个勾派进行分组,为什么错了,你看他说不是单组的分组函数,你这样想我们当时是不是如果不列它的话。不对,它它是不是求出整个公司当中的平均工资是不是就一个值啊,这个就输出一个值,你在这突然就整了一个他这个department ID,我们知道公司里边就即使你去重以后也得有十几个部门吧,这十几个部门相当于有十几行,这只有一行。
38:12
那怎么去匹配?所以说就错了,那你必须要显示的告诉编译器说我就是按照这个分组的,所以你这个avg啊,也得根根据我这个department ID列出相应的一行,而不能只有一行。我求的是每一个组里边的平均工资。哎,就是这个意思,那么再回到我们刚才说的这样一个问题,这个题目当中。这个题目当中是不是不同部门和不同工种的一个平均工资啊,那同样的道理,大家想一想,我能不能在这里边给你删一个,光写了一个department ID。光写个底,发埋地现在能有十多个部门,但工种的话是不是又混乱了呀?你这个工种怎么去处理啊?
39:01
你看一下结果是不是同样的错了,同样错了就是你这是一个不同的部门,你还得告诉编译器不同部门的时候,你还得按照不同的工种来给我算一下平均,所以说要求你这个照白力啊,是一定要加上来的,一定要加上来的。那么把刚才我们说的这样一个知识点是很重要的知识点总结一下,就是这个意思,大家注意我说。凡是当你查询当中啊,凡是不是组函数的这个列。比如说这里的赵国ID和department ID,都应该让它出现在group腐败当中。再说一遍查询,查询的这相应的这些列,只要不是组函数。只要不是组函数的列,就都应该让它出现在隔或败当中。
40:02
如果你少一个那就废了,少一个那它一定是不错的,少一个是一定不行的,那反过来的话。反过来你这边不少,你这边少,这没问题,这只是给输出而已,你不想让让它输出也行,对吧,你不想让它输出也行,但是呢,下边这是一定。他有的他一定要有,反过来他有的他可以没有,比如说你这里给他干掉一个,看一下这个结果是不是也行,仅仅是没有列出这个部门ID而已。是吧,好,这是我们讲的关于go,说的很细致了,大家总结一下,我们在这里边都有看。说在select列当中,所有未包含在主函数中的列都应该包含在主派当中。如果不的话,它就会。
41:01
这是反过来,反过来的话,这有的它可以没有啊,如果你不这样写的话,是不是就会出现叫非法使用组函数的一个概念,像这里面的department ID就没有放在group当中就出错了。行,我们说第二个知识点,下一个关于叫过滤的having关键词。非法使用主函数,不能够在外子集中使用主函数,这是我们这个讲having这个的一个解释。在前面呢,我们讲,包括我们这一节也刚才说了啊,我刚才求42 62,八十二三个部门的平均工资,我们用的是where。但是呢,有些情况下我们就不能再用where,什么时候不能用啊?这个V死机当中表示过滤,不能够在它的条件里边使用组函数。如果你要是真的就得使用主函数的话,就要改成开。
42:00
这个说清楚了,我们这节就讲完了,我们说这个事儿,举个例子。这你没有出现在这个有有它是吧,它就一定得出现在这个组函数当中,所以得加上勾代它,我现在想输出一下这个事,刚才这个例子就我们刚才那会写的,求出各个部门平均工资,现在呢,求出。哎,求出各部门中平均工资大于6000的部门,以及以及其平均工资能看懂吧。
43:06
我不光让你求这个列出各个部门以及他平均工资,我只想只想要那些平均工资大于6000的这些部门,那相应的我们得需要加上一个条件,这个时候如果你还想用where的话,首先你写是写在方后面,然后是不是就avg要求这个只输出平均工资大于6000,对吧?但你这样写的话,我们一运行就挂了。这就是我们刚才说的这个,就是在where子句当中是不可以使用组函数的,它有组函数的话,因为这有组函数的avg的,所以就不能够用where,在这个时候我们给它得用另一个关键词,如果说你这个Y里边没有使用组函数,比如像我们刚才那会写了一个。写了一个他我只只只找那个什么40号,60号,80号这几个部门的ID in 40 60 80,你要光这样的话没问题,因为这没有组函数,我还是可以用where的,把它放在from后边,但是要使用组函数的话,就不能够用它,所以把它注意改成谁啊,就仅需要把这个Y改成ton就完了。
44:21
How是,它也可以应该表示叫过滤条件是可以使用组函数的,那么现在这个题目就搞定了,它表示的意思就是求出各部门当中平均工资大于6000的部门以及他的平均数。就这样一些,这些部门的平均工资是大于6000的,这里边我们说where的时候要求给from,他俩给挨着,哎,这个having就没有要求了,这呢,我们实际上它俩挨着你也可以,嗯,说X把它放在轴Y的后面也行。也没问题,这个呢,习惯就大家你自己选择吧,用哪个都行啊,我是习惯给他写在上面啊,写在上面的话,你读BY,就是把这个分组给它都放到后面,在后面的话就放,你可以再再写个order by是吧,再按照某一个给你排进去,比如说哎,Order five department ID,按照这个ASA顺序进行一个排列。
45:25
这都行。就是看你的,看你自己了,看你自己选择了,但是当时我们讲这个from跟where他俩得挨着。行吧,这个having是没有,没有这样一个限制的,那这个关键内容我们实际上就说完了,同样的,你说求出部门最高工资比1万高的,那就相当于是having max salary得大于1万。就是改一下这个条件就可以了。啊,这是having,这这就刚才说的这个例子是吧,最高工资是大于一半的,这个时候因为有mark在,就不能用where,所以得用having,它的位置是。
46:02
哎,没有没有额外的限制,就没有说他必须得挨着where,挨着from。显示各个部门的平均工资最大值,平均工资算出来以后再加上最大值。通过这个例子我们说明组函数是可以嵌套的。主函数是可以嵌套的,哎,这个说一下吧。Direct AG salary from employee,这呢,求出来是公司当中所有员工都算进去,求一个平均值,我加上一个得过半,这是不是求出各个部门的平均平均工资啊?你运行的话有很多个,然后呢,我看看这些结果当中哪个部门是最大的,显然这里边应该是。应该是这个吧,19333这个比较大,我呢想仅输出各个部门当中平均工资最大的是哪个部门,那你就加上一个max就完了,就是哪个部门就看最大值是多少啊,我就在avg前面再加一个max就行,那你这里边是输出了多条语句,再加个max是不是就成了一条了?
47:24
就是刚才这个数,所以说主函数是可以相互嵌套的。这一节呢,我们就讲了三个知识点,一个呢叫组函数,五个大家熟悉一下,说这俩里边数据类型没有限制,123,前三个数据类型上是只能使用数值型的,同时呢,他们在使用的时候,中间你放的这个表达式仅仅计算非空的,你想让它计算空的,使用NVR。然后N就等于sum除以count是关于组函数的概念,查询group,凡是s select当中出现的不是组函数的列都应该放在败里。
48:06
然后having在使用过滤条件的时候,如果这个过滤条件中使用的主函数用having来替代之前的where,好,这就是我们这一节讲的内容。
我来说两句