Oracle学习——Oracle数据库的分组函数与数据分组——having、group by、分组函数

Oracle数据库的分组函数与数据分组

数据分组:

在关系数据库中,使用数据分组可以取得表数据的汇总信息。数据分组是通过分组函数,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;

你可能感兴趣的:(数据库知识点,分组函数,数据分组,group,by,having,count)