分组函数

大家还记不记得我们在讲第三节的时候,第三节讲单行函数,什么叫单行函数,我们说一行记录通过函数

返回一个结果,这就叫单行函数,我们也分了好几类,来回忆一下,有字符型,日期,转换,和通用,其中我们

说转换型的比较重要,这个叫单行函数,跟单行函数相对应的,有一个叫多行函数,什么叫多行,那是不是

意味着你针对多行进行处理的,相当于多行记录通过这样一个函数,返回一个结果,那就是多行,对吧,

有了这个概念以后,我们再回来看我们的分组函数,那么我们说,分组函数就是我们要说的多行函数,

进行一个分组,比如说我们举个例子,这是我们employees这个表,在这个表格里边,其中有两列,有department_id,

有salary,那么我们关注一下这个salary,整个员工很多,我想把employees这个表里边,工资的最大值给输出出来,

看看谁的工资是最大的,这是不是意味着你得把employees表里边的,所有员工的工资都输到这个行里边,然后通过

这个函数对比以后输出这个结果,只要最大的,这个是求出最大值,我还可以求最小值,我要求一个工资的平均值,

那都是多行记录进去一行结果出来,这里面我们提到的,最大,最小和平均,就是典型的分组函数,其中的三个,那么我们回来

再说一下,这一章主要要学的哪些内容,一个是我们刚才提高的最大,最小,平均

这个叫做组函数,我们需要了解的组函数,并且能够描述组函数的用途,知道怎么使用,

这个难度不大,难度稍微大一点的是后面两个知识点,一个叫使用group by字句对数据进行分组,在使用

group by以后,如果还涉及到过滤了,而且在过滤条件中使用了组函数,还要讲另外一个关键字叫having,

使用having字句进行过滤分组,这是我们这一章要学习的内容,重点是后面两个,当然后面两个是需要嵌入

子函数的,所以我们先来学些组函数

这一节里面我们要讲的组函数呢,有这样几个,也是最常用的,一个叫AVG,COUNT,MAX,MIN,SDDEV这是求方差的一个,

应该叫标准差,这里叫SUM,这几个单词大家应该不太陌生,我们在讲JAVA当中多多少少的接触过,我们先把加灰色的

说几句,大家读高中的时候,是接触过这样一个概念的,他说是用于求标准差,标准差是个什么概念,或者说方差是个

什么概念,下面有解释说,做聚类分析使用的,尤其是做统计的,经常要和他打交道的,我们在有样本的前提下,经常需要

用它来分析数据的一些情况的,我在这里举个例子了解一些叫样本的标准差,之后呢我们也不再怎么去提他了,我们举一个

实际情况,现在呢我们有两个人,一个呢我们就叫张三,这是一个运动员,李四,这儿有两个人,张三和李四,加入这两个人都是

练跳远的,当然我不知道现在跳远的世界纪录是多少,我们比如说,张三,我们假如现在世界纪录是两米,假设世界纪录是两米,

张三这样一个运动员,现在想看看谁参加奥运会更合适一点,当然是谁的成绩更优秀,就应该选择谁去,现在世界纪录是两米,

那张三经过这一年数据的统计,我们判断说,他在一次大赛当中,平均的一个成绩,是2.1米,相当于是能稳破世界纪录的,可是呢

李四,如果成绩也是2.1米,那么这个时候就比较纠结了,这两个人平均成绩都是2.1米,按说呢,如果他们去参加奥运会的话,正常

来讲都能破世界纪录,都能够拿到冠军,应该问题不大,但是呢,他两谁去更合适呢,我们再度需要一个样本偏差的一个概念,这个是

另一个数据,相当于我们刚才的2.1米是AVG,平均的一个情况,那么样本标准差怎么用呢,我再看一下这个数据,发现张三在进行100个

进行统计,最后统计结果是2.1米,但是他的样本标准差,是10,单位是1,李四发现他是2,那么选谁更合适啊,我们说选李四更合适,

选李四去参加比赛,更合适,这个怎么讲,这个样本标准差描述的是个什么概念,比如说,大家都知道,我们要选李四了,他每一个100个

数据,我用每一个数据去做差,做差以后求平方,有时候是正的,有时候是负的,做平方以后,所有的值加起来,发现张三等于10,李四等于

2,那么这个数越小,是不是就意味着他距离这个平均的情况,是越近,对吧,我们这里描述的是这样一个概念,假设这里平均的是2.1,

肯定这个人的成绩有高于2.1的,有低于2.1的,平均才是2.1,我描述的是这个数每一个成绩,跟这个平均的2.1做差以后,求平方,

相当于一个距离的平方,把这个所有距离的平方都给加起来,如果这个数越小,说明越趋近于平均值,那就说明这个人的成绩就

越稳定,那么张三是10就意味着,他距离平均值就越松散,就是成绩发挥的不稳定,最后一求也是2.1,而李四呢成绩很稳定,

那李四去更合适,因为他去很大的可能性去破记录,那你张三去的话有很大的风险,有可能他的记录更好,跳到了2.5,有可能跳到了

1.2,这个风险比较大,所以我们选李四去,而这里面的他是通过STDDEV这个概念,要是有学理科的,学统计的,做线性回归分析,

也都需要用到这个概念,这是我们讲的这个概念,他做了以后,我们用不着,除非是跟专业相关的了,要用这个,那么除了这几个以外,

剩下的5个就是我们要学习的组函数,我们来简单体会一下

select avg(salary),我求工资的平均值,max(salary),min(salary),还有一个count,count完了,sum总和,

from employees,我们先体会一下

select avg(salary),max(salary),sum(salary) from employees

我写这样两行代码,想描述个什么事,我要求出employees表里面的所有员工工资的平均,所有工资中的最大最小,

以及总和

这里我们很清晰的看出来,employees表当中工资最高的2万4,最低的是2100,一个月需要发多少钱,

发工资就得发69万多,每个员工的工资是6千多,这是我们简单体会了一下组函数,下面我们再分别来提一下,

怎么提,我们先看中间这两个,max和min,我们这里需要提一下,max和min里边写的就是employees里边的列,

那么这个表有哪些列,desc employees;一看

我们刚才使用的叫salary,我求了一下最大和最小的salary,那我们再考虑,那其他的变量我能不能求,最大的employee_id,

最小的employee_id,name最大的最小的,hire_date最大最小,分别表示什么意思,我们试一下,select max,我写一个email吧,

last_name,max(last_name),然后min,min(last_name),再写一个max(hire_date),这个能看懂吧,我想求一下名字中的最大,

名字中的最小,这什么意思,我们看一下结果你就知道了,hire_date这我清楚,看看来公司的谁的hire_date最大,谁的最小

select max(last_name),min(last_name),max(hire_date),min(hire_date) from employees

从结果当中我们能看到,最大的是首字母最大,那这个人是最大的,最小的叫Abel,日期这一块,那过去的日期我们把它看做一个

数的话,最大的当然是最近的,最接近我们的这个日期,他就是最大的,以及我们刚才用的salary,大家要注意了,我要说一句话,

max和min,这两个主函数来讲,他里面放的对比的列,既可以是varchar类型的,也可以是date类型的,也可以是number类型的,

他这个数据是没有限制的,任何数据类型都可以使用max和min,这句话我们清楚以后,再回来看另外两个函数,叫AVG和SUM,

AVG和SUM,我们这儿里面放的是number类型,求一下这些数的平均,这些数的总和,那我们试图跟刚才这样行不行,给他改成avg,

select avg(last_name),sum(last_name),avg(hire_date),sum(hire_date) from employees

这想一想应该也不行

你看数据类型不一致,应该为number类型,但是却获得了date型,后边的不行,那前边的行吗

select avg(last_name),sum(last_name) from employees

是不是也不行啊,这我们要说明一个什么事,大家注意我们要总结一下,avg和sum,作为两个组函数,他里面存放的

数据类型,是比较严格的,只能够存放number类型的,只能够存放number类型,你像last_name作为varchar类型的,

hire_date做为date型的,都没法使用他们两,这是我们从结果上看出来,然后我们体会一下,我们想一想,这个名字

这一块,求个平均,这成了什么了,这没有任何意义,名气求个总和,没有总和这个概念,hire_date求来公司的平均,

要是number类型的行,因为日期里面可能含有特殊字符,怎么求平均,怎么求和,也没有意义,所以他们两个使用是有

严格要求的,我们在这里有写,他们两只能针对数值类型,而max和min是可以针对任何数据类型的,这个是大家需要注意

的一点

然后下边还有一个叫count,这是我们第五个组函数,叫count,返回表中的记录总数,他也是适用于

任何数据类型的,那我们来看一下,他既然适用于任何的数据类型,select count,我们这里写salary,

employee_id,这是不是也是一个number类型的,然后count一下,last_name,count一下hire_date,能

看懂是什么意思吧

select count(employee_id),count(last_name),count(hire_date) from employees

我看看你这个表里面employee_id,有多少个,last_name有多少个,hire_date有多少个,这是不是相当于求出来,

这个公司里边员工的个数,都是107,那你看我使用这个呢,select count(1),这个需要大家来理解,count(1),count(2),

count(*),或者你随便再来一个,count(&),from employees,大家看看这个结果,第一看有没有错,第二个有没有输出结果,

第三个输出结果是不是一样

select count(1),count(2),count(*),count(&) from employees

最后这个有特殊含义了,特殊含义就不搞了这个了

select count(1),count(2),count(*) from employees

这个都行,都是107,他竟然都是107,这个需要大家来理解一下,我来说明一下这个原因,为什么都是107,

我们说这个是叫分组函数,是不是我们把一条条记录往里面放,往组函数里面放,这个组函数表达的具体的意思,

然后来计算一条数据,算多少条记录的,最后返回一个数,相当于employees这个表一条一条的往里进,进一条数据,

里面显示的1,就算一个,一共是107条,这里进一条数据显示的是2,显示的是几无所谓,只要你这里有值就行,算上了,

再来一个又算上,还是107,同样他也是这样,跟你这里是1还是2没有关系,不能说你这里是1就是107,如果你那样理解

的话,那每个人那个是01,那个是02,你结果也是107,或者last_name也是107,跟你这里具体哪个值是没有关系的,就是

进去一条数据,就相当于你每个人进电影院一样,人不一样,只要你有票的话我就让你进来,算是一个人,当你算一个电影

多少人看,只要有票就算一个,这是我们说的一个count,然后我们结合这三个说一下,哪三个,我这里select一下avg,

avg(salary),sum(salary),以及叫count(salary),这样三个概念,我这儿不这样写,我让sum(salary)去除一下count(salary),

select avg(salary),sum(salary)/count(salary) from employees

大家看,这个结果是不是完全一样,这个小数点多一点而已,这个自动保留了6位,这两个值完全一样,

这就说明我们这个avg,他是怎么算出来的,实际上不就是所有工资的总和,除以一下你有多少个人,明白吧,

所有的salary的总和除以多少个salary的数据,一除不是相当于平均工资,那就从这个例子当中我们就看到了,

这三个主函数之间,是有关系的,这个avg(salary)就等于sum除以count,这是我们要说的第二个知识点,关于他们三的

知识点,那么我们说一下第三个知识点,关于他们三个的第三个知识点,也不一定关于他们三,所有组函数的第三个知识点,

我们看这,count里面具体的列,表达式,他返回的是不为空的记录总数,以他为代表,什么叫不为空的,我们计算一个这个

概念,select,我们知道commission_pct有一些值是为空的,我们清楚这些表里面有些值是107条记录的,但是有些人的奖金率

是为空的,我看一下这个表输出的是什么

select count(commission_pct) from employees


他输出的是35,而不是107,那就意味着,他仅仅计算了这些不为空的值,一共是35个,

是这个意思吧,他计算是非空的,他计算是非空的,同样他计算非空的,除的这个也是非空的,我们现在想看这个事,

我让他除以一下count,大家看这个,这个是avg他,这个还是让他的总和除以一下他的count

这肯定一样,我们刚才说了,avg就等于sum除以count,相当于avg也是忽略了空值,那么我们说这个事,你这里算的

叫平均的奖金率,结果平均的奖金率一看,还不少,等于0.222,但是实际上你细着发现,我们刚才也看到这儿了,这儿

要是想计算,计算这个公司当中,员工的平均的奖金率的话,你不能仅仅除以有奖金的这个人,其他的没有奖金的,

你是不是也应该给他算进来,但是你这样算肯定是没有算进来,就像咱们谈国民生产总值,国民生产总值已经全球

第二了,去年前年已经超过日本了,国内生产总值GDP,全球第二,但是一算人均的话非常少,你这个sum大,但是count

分母也很大,如果你仅仅算有工作的这些人,一除的话工资就高了,但是中国为了在国际上少担一些责任,我就想办法

让分母大一点,人均的少,一说我是发展中国家,那你加入WTO的时候上税啊,我们的税比较低,要照顾,因为分母大,

要除以所有的人,我们这个公式是为了显示公司的福利好,不能光除这个,是不是得除一下107,我们看一下公司真正

所有公司的奖金率是多少,不应该是除他,除以你的人数107,这样才行

select avg(commission_pct),sum(commission_pct)/count(commission_pct),sum(commission_pct)/107 

from employees

就是真正的公司的奖金率只有0.072,0.22是你除的是35,大家明白这个概念,使用组函数,算的是非空的,

仅仅计算非空的,所以他们计算的结果是有区别的,那为什么我刚才计算salary,如果我这里换乘avg(salary,),

这里也换乘sum(salary)/count(salary),大家看这个结果一样不一样

这个是不是一样,为什么一样,因为avg就等于sum除以count,跟sum/107一样,是因为你判断这个count有工资员工的

个数,有工资每个人都有工资,这个工资也正好是107,他们两个是相等,但是你这个commission_pct你要注意,以他为

代表的,只要他有空的,他就不计算在内的,导致count(commission_pct)这个数会变小,这是我们说的这个意思,然后呢

我们想,怎么保证我们在计算的时候,有没有别的方式,大家是否还记得我们之前讲的通用函数,怎么办啊,这里有为空的,

我就让你改改呗,当你为空的时候,我给你赋个值就行了,赋值赋谁都行,只要被赋空就行,别赋null,赋null和没写一样,

改一个,比如我们这里赋值为*,赋成*我们看这两个值一样不一样,看后面两个值,因为这个时候已经改了,你看后面两个

一样不一样

select avg(commission_pct),sum(commission_pct)/count(nvl(commission_pct,*)),sum(commission_pct)/107 

from employees

缺失表达式,我们改成1

select avg(commission_pct),sum(commission_pct)/count(nvl(commission_pct,1)),sum(commission_pct)/107

from employees

这个你看结果,后边两个是不是完全一样了,相当于我们通过一个单行函数,叫nvl,他呢处理了一下,

当你commission_pct为空的时候,将他赋值为1,现在这个个数算出来的就是107,跟他就一样了,这是

这样的一个内容,他是正常是忽略主函数的,但是你要是想不让他忽略,就使用一些nvl,这我们在前面也

讲了这个函数,这是我们说的这个概念

count(distinct),就是我可以返回这个表达式非空的且不重复的一个记录总数,我们看看这个例子就行了,

说返回employees表当中的depart_id的个数

就是select count,department_id,department_id不为空,那就算一条记录,所以这个from employees完了以后

结果是106

有个哥们没有部门,但是106并不意味有106个id,公司肯定不能有那么多部门,因为你每一条记录进去都给你算

了一个值,都给你算一条记录,所以最后106,你为了把他这重复的去掉,加上一个distinct

select count(distinct department_id) from employees

这不就把重复的给他去了

结果就11个,使用了distinct,这是我们讲的这一章的第一个知识点,叫组函数,有了组函数以后,

我们就讲group by分组数据了,分组数据,我现在想求这个事,大家把这个思路转过来,刚才已经讲了

5个组函数了,再捋一捋,下面我们如何借助我们讲的组函数,分组数据,比如说我们现在有一个这样的需求,

什么需求啊,我要求出employees表当中,各个部门的,平均工资,各个部门的平均工资,你要看这个图的话,

我们这一条条数据,根据department_id,都列出来,部门一样的连在一起,求一个平均,一样的连在一起求个

平均,然后各个部门的,然后平均工资,当然你这里涉及到平均工资,就要用到组函数了,那如何借助组函数来

实现这个数据的分组呢,我们直接写了,select,你想最后输出的哪些列,其中有一个叫department_id,

还想输出哪个部门的salary,from employees,这样写还不行,我们需要使用组函数,group by,按照什么进行分组,

一个部门的连在一起,所以按照部门进行一个分组,按照部门分组,你是哪个部门的,20号部门,20号部门就是一个单独的20,

然后求一下20号部门的平均工资,30号部门的,30号部门的平均工资,按照他来分组

select department_id,avg(salary) from employees group by department_id

这里我们列出来的就是各个部门的,有一个哥们他是没有部门,所以他的平均工资也列出来了,因为这里

的小数点很多,你也可以使用一个单行函数给他round,给他来一个四舍五入,这是我们要讲的主函数,

就是这个意思,我们可以给他进行一个分组使用,我们这里求出来的是各个部门的平均工资,如果我这里

不想求各个部门的平均工资,仅仅求10号,我们看看这里的部门,如果我仅仅想求10,30,40号部门的平均工资,

仅仅想求三个部门的平均工资,那你不就加一个过滤条件呗,我们之前讲过滤的话,第二节说到了,得用where,

我们讲where一定要和from挨着,from后面加一个where,department_id in (40,60,80),在这三个部门里边的,

员工的平均工资

select department_id,avg(salary) from employees where department_id in(40,60,80)

group by department_id

这是我们讲的这个,如果你要使用一些过滤条件的话,要保证这个过滤条件和from是挨着的,

这是我们说的这个概念,然后我们再进行一个细分

我们先看这个,我们再细分,刚才我们是各个部门的平均工资,我现在还想细分一下,知道各个部门里边,

有可能有不同的工种,50号部门里面,你看,这两两块,除了有ST_CLERK这个之外,还有ST_MAN,我想再细分一下

看看,不同部门的,不同工种的平均工资,比如这样出来以后,一个是ST_MAN这个工种的平均工资,一个是50号部门

ST_CLERK这样的平均工资,那我们再细分一下,就是再进行一个分组,如何实现这个

那就是这样,select这是一个部门id,再需要一个job_id,区分他两,这个时候分组的时候需要不同部门的,不同

工种的,平均工资,分组除了要使用department_id以外,是不是还得用一个job_id

select department_id,job_id avg(salary) from employees group by department_id,job_id

显然的数据就比他多了,就是你不同的部门里边,同一个部门里边会有不同的工种,50号部门里有ST_CLERK,

还有ST_MAN

然后还是SH_CLERK,就是不同部门的,或者叫各个部门的,不同工种之间的,一个平均工资是多少,我们就这样

来计算的,这样来计算,20条记录,但是这个前后两个都行,这个到前面,这个到后面,这两个调一下都行,

这里我先写的department_id,然后写的job_id,group by后面先写的job_id,department,这都没问题,

select department_id,job_id avg(salary) from employees group by job_id,department_id

然后我们就说清楚这个事,如果你想进行多层分组的话,那你就group by的时候就写明多个,就这样就行,

这个说完以后,我们再说一个事,现在我们先把他给去掉,这个我们是求各个部门的平均工资,各个部门的平均

工资我们在这里列出来了,然后有个他,我可不可以把department_id给去掉,能不能去,你就看意思是不是明确,

语法上是否能通过,我这里进输出一下平均工资,还是按照部门进分组,那还是求一下各个部门的平均工资,只是没有

把平均工资的各个部门给输出来

select avg(salary) from employees group by department_id

没问题的,只是看不到是哪个部门的,这样写就行,这样写行,那有人就会想,那刚才我是把department_id给

他删了,那现在这个保留,我能不能把group by department_id给删掉,把它给删掉,这个时候就废了,

select department_id,avg(salary) from employees

相当于我们这里没有使用group by进行分组,为什么错了,他说不是单组的分组,你这样想,我们当时如果不列

department_id的话,他就求出整个公司的平均工资,就一个值,这就输出一个值,你在突然就整了一个department_id,

这个department_id我们知道公司里面,就即使你去重以后,也有10几个部门,这10几个部门相当于有10几行,那这里只有

一行,那怎么去匹配,所以说就错了,那你必须显示的告诉编译器,说我就按照这个分组的,所以你这个avg也必须跟着我这个

department_id,列出相应的行,而不能只有一行,我求的是每一个组里面的工资,就是这个意思,那再回到我们刚才那样一个

问题,这个是不同部门并且不同工种的平均工资,那同样的道理,我能不能在group by 后边删一个,光写了一个department_id,

现在有10多个部门,但是工种的话,是不是又混乱了,你这个工种怎么去处理

select department_id,job_id,avg(salary) from employees group by department_id

是不是同样的错,就是你这是不同的部门,你还得告诉编译器,不同的部门的时候,你还得

按照不同的工种来算一下平均,所以你这个job_id是一定要加上来的

那么把刚才我们说的这样一个知识点,很重要的知识点,总结一下,就是这个意思,大家注意,我说凡是

查询当中,凡是不是组函数的,这个列,比如这里的job_id,department_id,都应该出现在group by当中,

再说一遍,查询相应的列,只要不是组函数的列,就应该都出现在group by当中,如果你少一个,那就废了,

select department_id,job_id,avg(salary) from employees group by department_id


少一个一定是不行的,那反过来的话,group by不少,select后面的少,这没问题,这只是输出而已,

不想让他输出,也行,select后面有的,group by后面一定要有,反过来group by后面有的,select后面可以

没有,比如你这里干掉一个,看看结果

select job_id,avg(salary) from employees group department_id,job_id

仅仅是没有列出部门id而已,这是我们讲的关于group by的,说的很细致的,大家总结一下,我们在

这里边都有,在select列当中,所有未包含在组函数中的列都应该包含在group by当中,反过来,group by有的

select后面可以没有,你不这样的话就会出现非法使用组函数的一个概念,像这里的department_id就没有放在

group by当中

我们说第二个知识点,下面关于过滤的having,关键字,非法使用组函数,不能在where字句中使用组函数,这是

我们讲having的一个解释,在前面我们讲,我们刚才也说了,我们刚才求42,62,82三个部门的平均工资,我们用的

是where,但是呢,有些情况下,你就不能再用where,什么时候不能用,where字句当中表示过滤,不能够在他的条件

里面使用组函数,如果你真的就得使用组函数的话,就要改成having,这个说清楚了,这节就讲完了,我们说这个事,

举个例子,这个有department_id,就一定会出现在group by当中,我现在想输出这个事,刚才我们这个例子,我们这么写的,

求出各个部门的平均工资,求出各个部门平均工资大于6000的部门,以及其平均工资,能看懂吧,我不仅要列出各个部门,

以及平均工资,而且只想平均工资大于6000的部门,那相应的我们得加上一个条件,这个时候如果你还想用where的话,

首先你写你写在from的后面,avg只是平均工资大于6000的

select department_id,avg(salary) from employees where avg(salary)>6000 group by department_id

这就是我们刚才说的这个,就是在where字句当中,是不可以使用组函数的,他有组函数的话,因为组函数avg,

就不能用where,在这个时候,我们得给他用另一个关键字,如果你这个where里面没有使用组函数,比如我只写了他,

我只找42,62,82部门的,id in 40,60,80,你要是这样的话没有问题,因为这没有组函数,我还是可以用where的,

把它放在from后面,但是要使用组函数的话,就不能够用它,只要把这个where改成having就完了,having他也可以用来

过滤条件,是可以使用组函数的,那么现在这个题目,就搞定了,他表示的意思就是,求出各部门中平均工资大于6000

的部门

select department_id,avg(salary) from employees having avg(salary)>6000 group by department_id

这些部门的平均工资是大于6000的,这里说where的要和from挨着,这个having就没有要求了,你也可以

把它放在group by的后边也行

select department_id,avg(salary) from employees group by department_id having avg(salary)>6000

这个习惯大家你自己选择吧,用哪个都行,我是习惯写在上边,group by就放在后边,然后后面就是

order by,给你排个序,比如说order by department_id,asc顺序进行排列

select department_id,avg(salary) from employees having avg(salary)>6000 group by department_id

order by department_id

就看你自己选择了,但是我们当时讲from和where得挨着,having是没有这样一个限制的,这样实际上就已经

做完了,from求出部门最高工资,比1万高的,相当于having max(salary)>10000,就是改一下这个条件,最高

工资大于1万的,这个时候因为有max在,就不能用where,就得用having,他的位置没有额外的限制,没有必须得挨着

from

显示各个部门平均工资的最大值,平均工资算出来以后,再加最大值,通过这个例子可以证明,

组函数是可以嵌套的,这个说一下吧,select avg(salary),from employees,这儿求出来的是

公司当中所有员工都算进去求一个平均值,我加上一个group by,这个是不是求出各个部门的平均工资,

select avg(salary) from employees group by department_id

你这个一运行的话有很多个

然后呢我看看这些结果当中,哪个部门是最大的,显然是19333,这个比较大,我仅仅想输出每个部门最大的是哪个,

不是哪个部门,就看最大值是多少,我在avg前面加上一个max就行,那你这里面是输出了多条语句

select max(avg(salalry)) from employees group by department_id

就是刚才这个,所以组函数是可以相互嵌套的,这一节我们就讲了三个知识点,一个叫组函数,5个大家熟悉一下,

max,min这两个里面类型没有限制,avg,sun只能使用数值型的,同时你在使用的时候,中间放的表达式,仅仅计算非空的,

你想让他计算空的,用nvl,avg就等于sum除以count,这是关于组函数的概念,查询group by,group by,凡是select当中,

出现的不是组函数的列,都应该放在group by里,然后having,在使用过滤条件的时候,如果过滤条件中使用了组函数,

用having替代之前的where

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值