大家还记不记得我们在讲第三节的时候,第三节讲单行函数,什么叫单行函数,我们说一行记录通过函数
返回一个结果,这就叫单行函数,我们也分了好几类,来回忆一下,有字符型,日期,转换,和通用,其中我们
说转换型的比较重要,这个叫单行函数,跟单行函数相对应的,有一个叫多行函数,什么叫多行,那是不是
意味着你针对多行进行处理的,相当于多行记录通过这样一个函数,返回一个结果,那就是多行,对吧,
有了这个概念以后,我们再回来看我们的分组函数,那么我们说,分组函数就是我们要说的多行函数,
进行一个分组,比如说我们举个例子,这是我们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