0 概念: 作用在一组数据上,操作这组数据并返回数值。
1 类型: AVG COUNT MAX MIN SUM
2 案例:
工资总额 : select sum(sal) from emp;
总人数: select count(*) from emp;
平均工资: select sum(sal)/count(*) 一,avg(sal) 二 from emp;
一 | 二 |
2335 | 2335 |
|
组函数会自动滤空:
select count(*), count(comm) from emp;
COUNT(*) | COUNT(COMM) |
15 | 4 |
select count(*), count(nvl(comm,0)) from emp;
COUNT(*) | COUNT(NVL(COMM,0)) |
15 | 15 |
|
group by:
1 在select 列表中所有未包含在组函数中的列都应该包含在group by子句中
公式为:select a,b,c,组函数(x) from 表 group by a,b,c;
如果写成select a,b,c,d组函数(x) from 表 group by a,b,c; 则会报错!!
2 将1倒过来就不一定成立 : select a,b,c,组函数(x) from 表 group by a,b,c,d; 照样可以执行
eg:
select deptno ,avg(sal) from emp group by deptno; --->deptno出现在 avg函数外,因此会在group by函数中出现。
select deptno ,ename,avg(sal) from emp group by deptno; ---》第 1 行出现错误:
ORA-00979: 不是 GROUP BY 表达式
过滤分组(having语句, 功能和where类似,只不过他能用组函数,同时他和group by常绑定使用, having必须是分组后在过滤,如果没有group by时,尽量使用where,where是先过滤在分组,这样效率更高):
查询部门平均工资大于2000的部门编号和平均工资:
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>2000;
DEPTNO | AVG(SAL) |
20 | 2175 |
10 | 3687.5 |
|
求20号部门的平均工资:
select deptno,avg(sal)
from emp
group by deptno
having deptno=20;
DEPTNO | AVG(SAL) |
20 | 2175 |
|