数据分组:
在关系数据库中,使用数据分组可以取得表数据的汇总信息。数据分组是通过分组函数,group by以及having等子句共同实现的。
分组函数:
是多行函数,作用于一组数据,并对一组数据返回一个值。
语法结构:
SELECT [column,]group function(column)... //加粗为分组函数位置
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column]
常用的分组函数:
AVG 平均
举例:求员工平均工资
Select avg(sal) from emp;
SUM 求和
举例:求出员工的工资总和
Select sum(sal) from emp;
MIN 最小
举例:求员工工资的最小值
Select min(sal) from emp;
MAX 最大
举例:求员工工资的最大值
Select max(sal) from emp;
COUNT 个数
举例:求出员工的总人数
Select count(*)from emp;
Select count(empno) from emp;
//求部门个数 这里需要去除重复项 (distinct)
//select count(distinct deptno) from emp;
WM_CONCAT
查询结果行转列:把列值以’,’分割,并显示成一行
Select wm_concat(ename) from emp;
分组函数与空值:(空值问题很重要)
举例:求员工的平均工资
1.select sum(sal)/count(sal) from emp;
2.select sum(sal)/count(sal) from emp;
3.select avg(sal) from emp;
求员工的平均补助
1.select sum(comm)/count(*) from emp; //方法1和2结果可能是不同的
2.select sum(comm)/count(comm) from emp; //因为补助可能有空值
3.select avg(comm) from emp;
注意:分组函数会自动忽略空值
NVL函数使分组函数无法忽略空值:
Select count(*),count(nvl(comm,0)) from emp
Select count(nlv(comm,0)) from emp;
注意:nvl(comm,0) //如果comm不为null返回comm否则返回0(值自己设置)
GROUP BY:可以将表中的数据分成若干组
语法格式:
SELECT [column,] group function(column),...
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_expresson]
[ORDER BY column];
应用举例:
1求出每个部门的平均工资,要求显示:部门号,部门的平均工资。
Select deptno,avg(sal) from emp group by deptno;
//在SELECT列表中所有未包含在分组函数中的列都应包含在GROUP BY子句中, 如上,
sal在分组函数中,deptno不在 所以 dept应包含在group by后面
2求出每个部门的平均工资,要求显示:每个部门的平均工资
Select avg(sal) from emp group by deptno;
//包含在group by子句中的列不必包含在SELECT列表中。如上,deptno就不在select列表中
3求出每个部门的员工姓名,要求显示:部门编号,员工姓名
Select deptno,wm_concat(ename) from emp group by deptno;
HAVING子句:对分组后的结果进行过滤
HAVING语句的语法:
SELECT [column,] group function(column),...
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_expresson]
[ORDER BY column];
举例:
1求平均工资大于2500的部门,要求显示:部门号,平均工资
Select depino,avg(sal) from emp group by deptno having avg(sal)>2500;
//不能在where子句中使用组函数,如果条件中没有组函数,正常使用where子句就可以,比如:
Select deptno,avg(sal)from emp where deptno=10 group by deptno;
//注意: where子句使分组记录数大大降低,从而提高效率
从SQL优化角度看,尽量使用where子句,先过滤后分组
分组函数的嵌套:必须和group by 一起使用
求部门平均工资的最大值
Select max(avg(sal)) from emp group by deptno;