Oracle 分组函数和 group by 分组语句
Oracle里的多行函数也组函数,例如AVG, COUNT, MAX, MIN, SUM操作的是一组数据,返回一个结果。
求和函数SUM
sum() 可以对指定列的各行求和
select sun(sal) from emp; --将sal列里的数值全部相加
非空行函数 COUNT
count() 函数可以统计指定列的非空行数、如果要求不重复的个数,使用distinct。
select count(*) from emp;
select count(distinct job) from emp; --重复的行 只取一次
求平均数函数 AVG
select avg(sal) from emp;
求员工的平均奖金:
结果:方式一结果不同,方式二 和 方式三结果一样。
,所以:
如何屏蔽 组函数 的滤空功能:
但是实际应用中,结果为14和结果为4都有可能对,看问题本身是否要求统计空值。
分组数据
group by 、按照group by 后给出的表达式,将from后面的table进行分组,针对每一个组使用组函数
比如查询公司里 “部门”的平均工资:
SELECT deptno, avg(sal)FROM emp GROUP BY deptno;
--可以抽象成:select a, 组函数(x) from 表 group by a; 这样的格式。
注意:所有没有包含在组函数中的列,都必须在group by的后面出现。所以语句中。
由于语法规定group by后面 就会出现有多列的情况,例如这条SQL语句:
select deptno, job, avg(sal) from emp group by deptno, job order by 1;
该SQL的语义:按部门,不同的职位统计平均工资。先按第一列分组,如果第一列相同,再按第二列分组。所以查询结果中,同一部门中没有重复的职位
使用group by的时候还需要注意的一点的是 ,where子句中不能使用“组函数”。可以使用 Having来过滤分组。
比如查找出平均薪水大于2000的部门, sql语句如下:
SELECT deptno, avg(sal) FROM emp GROUP BY deptno having avg(sal)>2000;
从功能上讲,where还having都可以将满足条件的结果过滤处理来,但是语法规定 代替。
如果只是单纯的求某个部门的平均工资,那么使用where和having都可以(因为子句中没有使用组函数),这种情况下优势明显。
最后修改于 2015-12-25