分组函数
分组函数作用于一组数据,并对一组数据返回一个值
**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 过滤分组的条件:
- 行已经被分组。
- 使用了组函数。
其语法:
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 子句中使用组函数。