聚合函数和Group by

  • Post author:
  • Post category:其他


聚合函数: sql语言中一种特殊的函数:聚合函数,SUM, COUNT, MAX, MIN, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM COUNTRY
这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数
通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值,也就是说,表中所有除region(地区)外的字段【被Group by指定的列可以返回多个值外】,只能通过 SUM, COUNT等聚合函数运算后
返回一个值
HAVING子句可以筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前。而 HAVING子句在聚合后对组记录进行筛选。

二、例子:
一)显示每个地区的总人口数和总面积: SELECT region, SUM(population), SUM(area)
FROM COUNTRY
GROUP BY region
region Population are
上海

1080 12000km
广州 2123 18000km




先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。






二) 显示每个地区的


总人口数


和总面积.仅显示那些面积超过1000000的地区。




SELECT region, SUM(population), SUM(area)




FROM COUNTRY




GROUP BY region




HAVING SUM(area)>1000000




在这里,不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以筛选成组后的各组数据。






三) 查询每个部门的每种职位的雇员数。




select deptno,job,count(*) from emp group by deptno,job。






三、




在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。




在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数




select max(sal),job emp group by job;




(注意max(sal),job的job并非一定要出现,但有意义)




查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。




select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;




当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个


sql语句


中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。




having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。




表的设计:

表里面的内容:

 

一:在不使用聚合函数的时候,group by 子句中必须包含所有的列,否则会报错,如下

select name,MON from [测试、] group by name

会报错:

在子句中加上所有的列的时候

select name,MON from [测试、] group by name,mon

这时候不报错,执行结果

此时虽然成功执行了,但是可以看出来group by在这里并没有发挥任何的作用,我们完全可以直接select而不用group by,所以,group by子句要配合聚合函数使用,并且,在配合聚合函数使用的时候,在group by子句中不要加上聚合函数处的列名(加入as了的话)

配合聚合函数使用了的情况:

select SUM(mon),name from [测试、] group by name

结果:

是我们想要的。

再如:

select MAX(ID),name from [测试、] group by name

结果:

也是我们想要的。

 

但是说如果这样的话:

select MAX(ID) as id,name from [测试、] group by name,id

得到的结果是:

很明显这不是我们想要的。

所以这时候在使用聚合函数的地方若是使用了as另外命名,请不要在group by子句后再加上那个令命名的名字,否则就和文章刚开始出现的情况一样