SQL—分组函数
日期:2019.05.23
作者:chj
什么是分组函数
- 分组函数作用于一组数据,并对一组数据返回一个值
分组函数类型
- AVG 平均值
- COUNT 统计值
- MAX 最大值
- MIN 最小值
- SUM 合计
- STDDEV 标准差(用的少)
- VARIANCE 方差(用的少)
AVG、MAX、MIN、SUM函数的使用方法:
select avg(sal),max(sal),min(sal),sum(sal)
from emp;
AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)
---------- ---------- ---------- ----------
2073.21429 5000 800 29025
COUNT函数的使用方法:
count(*):查看表格中非空值的行数
select count(*)
from emp;
COUNT(*)
----------
14
count(comm):查看comm列中的非空值行数:
select count(comm)
from emp;
COUNT(COMM)
-----------
4
分组函数与空值
- 分组函数忽略空值:
emp表中有14人,因为分组函数直接忽略空值,所以可以计算出comm的综合,计算平均值时也只是对4个人做了计算:
select sum(comm),avg(comm)
from emp;
SUM(COMM) AVG(COMM)
---------- ----------
2200 550
- nvl函数使分组函数无法忽略空值:
select sum(nvl(comm,0)),avg(nvl(comm,0))
from emp;
SUM(NVL(COMM,0)) AVG(NVL(COMM,0))
---------------- ----------------
2200 157.142857
分组数据
group by 子句语法
- 将信息表分成更小的组。这可以通过使用 group by 子句来实现。
- group by子句的作用:将表中的数据分成若干组。
- 在 select 列表中所有未包含在组函数中的列都应该包含在 group by 子句中。
使用单列分组
- 例:查询公司各部门的员工个数
SQL> select deptno,count(*)
from emp
group by deptno;
DEPTNO COUNT(*)
---------- ----------
30 6
20 5
10 3
使用单列分组
- 例:查询各部门分别有什么工作岗位,各岗位有几个人
select deptno,job,count(*)
from emp
group by deptno,job;
DEPTNO JOB COUNT(*)
---------- --------- ----------
20 CLERK 2
30 SALESMAN 4
20 MANAGER 1
30 CLERK 1
10 PRESIDENT 1
30 MANAGER 1
10 CLERK 1
10 MANAGER 1
20 ANALYST 2
having 子句用法
- where子句和 having子句的区别
having子句过滤组,where子句过滤记录 - 例:查询各部门的平均薪水及部门编号,要求只有员工姓名中包含‘A’才参与统计,只列出平均薪水>1500的,按照平均薪水降序排列。
select deptno,avg(sal)
from emp
where ename like '%A%'
group by deptno
having avg(sal)>1500
order by 2 desc;
DEPTNO AVG(SAL)
---------- ----------
10 2450
30 1580
嵌套组函数
- 例:从emp表中筛选平均工资最高的部门
select max(avg(sal))
from emp
group by deptno;
MAX(AVG(SAL))
-------------
2916.66667