学习目标:
1、掌握分组查询的语法
2、掌握基础的分组统计函数
学习过程:
一、组函数
组函数的操作是基于一批行进行的,从而每一组得出一个结果。常用的分组函数有:
AVG:求平均值
COUNT:统计数量
MAX:求最大值
MIN:求最小值
SUM:求和
STDDEV:标准差
VARIANCE:方差
示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
--查询全体员工的平均工资 select round(avg(salary), 2 ) as 平均工资 from employee --统计全部员工的数量 select count(*) from employee --统计员工总工资 select sum(salary) from employee --查询最高工资,最低工资 select max(salary),min(salary) from employee select min(salary) from employee where dep_id= 2 |
二、GROUP BY子句
使用GROUP BY子句将表中的行分成几个小组,然后再进行相关统计。
1 2 3 4 5 6 7 8 |
--统计各个部门的平均工资 select dep_id , avg(salary) from employee group by dep_id ----统计各个部门的平均工资 ,按照平均工资从高到低排列 select dep_id , avg(salary) as 平均工资 from employee group by dep_id order by 平均工资 desc --多个列的分组统计 select dep_id,grps, avg(nvl(salary, 0 )) from employee group by dep_id,grps |
三、HAVING子句
你无法通过WHERE子句限定组,但是你可以使用HAVING子句限定组,同时不能在WHERE子句中使用组函数。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 |
--先做条件查询 过滤数据后在做分组统计查询 --统计各个部门所有姓刘的员工的平均工资。按照平均工资从高到低排列 select dep_id,avg(salary) as 平均工资 from employee where employee_name like '刘%' group by dep_id order by 平均工资 -- 对统计后的结果进行条件查询的时候就需要使用HAVING子句了。 -- 统计各个部门的平均工资,显示平均工资大于 2000 的工资。 select dep_id , avg(salary) as 平均工资 from employee group by dep_id having avg(salary) > 2000 |
四、注意问题。
1、在SELECT列表中的任何列或者表达式不是一个累积函数,则它必须出现在GROPU BY子句中,如下面这样写是错误的。应为employee_name并没有参与分组统计。
--统计各个部门的平均工资
select dep_id ,employee_name, avg(salary) from employee group by dep_id
2、对null值的处理,如果有一个用户的工资的值是null值,那么在统计的时候会如何处理呢,可能不同的数据库有不同的处理,这样就会导致歧义性,因为null值比较特殊,所以我们在设计数据库的时候就应该尽量限定为非空值,当然如果已经发生了null值的数据,那么我们也可以使用NVL函数强迫组函数包括空值,显示说明如何处理空值。
1 2 |
-- null 值的处理 nvl (列名,默认值) 如果该列为 null ,就是用默认值 select avg(nvl(salary, 0 )) from employee |