Oracle之分组函数

1、组函数
	(1)获取员工表员工的平均工资、工资总和、工资的最大值、工资的最小值以及工资记录数
			SQL> select avg(sal) 平均工资,sum(sal) 工资总和,max(sal) 最大值,min(sal) 最小值,count(sal) 记录数 
			2  from emp;

			  平均工资   工资总和     最大值     最小值     记录数
			---------- ---------- ---------- ---------- ----------
			2073.21429      29025       5000        800         14
	(2)组函数遇到null:求员工的平均奖金
		<1>三种方式:
			SQL> select avg(comm) 方式一,sum(comm)/count(comm) 方式二,sum(comm)/count(*) 方式三
		  2  from emp;

			    方式一     方式二     方式三
			---------- ---------- ----------
			       550        550 157.142857
			
			SQL> select count(comm),count(*) from emp;
		<2>原因:
			COUNT(COMM)   COUNT(*)
			----------- ----------
			          4         14
		<3>结论:组函数会自动过滤空值
		<4>解决方案:
			SQL> select count(nvl(comm,0)),count(*) from emp;

			COUNT(NVL(COMM,0))   COUNT(*)
			------------------ ----------
			                14         14
2、分组数据
	(1)求各个部门的平均工资
			SQL> select deptno,avg(sal) from emp group by deptno;

			   DEPTNO   AVG(SAL)
			--------- ----------
			       30 1566.66667
			       20       2175
			       10 2916.66667
	(2)按不同部门和不同的职位来统计平均工资
			SQL> select deptno,job,avg(sal),count(deptno)
		  2  from emp
		  3  group by deptno,job
		  4  order by 1;

			   DEPTNO JOB         AVG(SAL) COUNT(DEPTNO)
			--------- --------- ---------- -------------
			       10 CLERK           1300             1
			       10 MANAGER         2450             1
			       10 PRESIDENT       5000             1
			       20 ANALYST         3000             2
			       20 CLERK            950             2
			       20 MANAGER         2975             1
			       30 CLERK            950             1
			       30 MANAGER         2850             1
			       30 SALESMAN        1400             4

			已选择9行。
	(3)group by的使用要求
			<1>select检索的列必须要位于group by后面的集合列中(不包含组函数)
				 select a, b, c
			   from emp
			   group by a, b, c, d;
			<2>必须要在分组数据之上, 进行结果集的检索
3、分组过滤
	(1)查询平均工资大于2000的部门
			SQL> select deptno,avg(sal) from emp
		  2  group by deptno
		  3  having avg(sal) > 2000;

			   DEPTNO   AVG(SAL)
			--------- ----------
			       20       2175
			       10 2916.66667
	(2)having和where子句的区别
			<1>求10号部门的平均工资(先分组再过滤)
				SQL> select deptno,avg(sal) from emp
			  2  group by deptno
			  3  having deptno = 10;

				   DEPTNO   AVG(SAL)
				--------- ----------
				       10 2916.66667
			<2>求10号部门的平均工资(先过滤再分组)
				SQL> select deptno,avg(sal) from emp
			  2  where deptno = 10
			  3  group by deptno;

				   DEPTNO   AVG(SAL)
				--------- ----------
				       10 2916.66667

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值