分组函数

分组函数

分组函数作用于一组数据,并对一组数据返回一个值

**sum()对指定列的各行求和
max() 对指定列的最大值
min() 对指定列的最小值
avg() 对指定列的平均值
count()统计指定列的非空行数
**

SQL > sum(sal) "总工资",count(sal) "发薪员工总数", 
max(sal) "最高工资",min(sal)"最低工资",avg(sal)"平均工资"
from emp;

SQL> select sum(sal)/count(*) 方式一, 	//此种方式当 sal中有空值出现时,计算不正确
avg(sal) 方式二  			//组函数都有自动滤空功能(忽略空值)
from emp;

如何屏蔽 组函数 的滤空功能

SQL> select
count(*)方式一, count(nvl(comm,0)) 方式二
 from emp;					//滤空和不滤空广义上都对,还是得看问题本身是否要求统计空值

distinct(去除重复记录)

SQL> select
count(distinct job) 				//统计 job 列中不重复的数据个数
from emp; 

SQL> select distinct job from emp;		

分组数据

按照group by 后给定的表达式,将from后面的table进行分组。针对每一组,使用组函数。

SQL> select deptno, job, avg(sal) 	//avg(sal) 语句 是针对每一组,使用组函数
from emp 			
group by deptno, job  			//对 deptno 列进行分组,然后再按 job 进行分组
order by 1; 				

在SELECT 列表中所有没有包含在组函数中的列,都必须在group by的后面出现
分组数据的设计理念,所有的数据的检索,必须是分组的结果之上

SQL>select 
department_id, COUNT(last_name)
from employees;

select 						//提示错误
department_id, COUNT(last_name)	
       *
from at line 1:
ORA-00937: not a
single-group group function			//错误理由,GROUP BY 子句中缺少列	
	//大白话, 你既然对数据进行分组, 还想查看每行中特有的数据,  
	//你真是王中之王->王中王, 你就是  火腿肠

过滤分组

使用 HAVING 过滤分组的条件:

  1. 行已经被分组。
  2. 使用了组函数。

其语法:
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];

先分组,再过滤

SQL> select
deptno, avg(sal)  		//使用了组函数  条件2
from emp  
group by deptno 		//行已经被分组  条件1
having avg(sal)>2000; 		//使用分组函数 having 

where和having都是将满足条件的结果进行过滤。
但是差别是where子句中不能使用 组函数! 所以上句中的having不可以使用where代替。

先过滤,再分组

SQL> select deptno, avg(sal) 
from emp
where deptno=10 	
group by deptno; 		

不能在 WHERE 子句中使用组函数(注意)。
可以在 HAVING 子句中使用组函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值