分组函数:组用于一组数据,并对一组数据返回一个值;
在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中
group by 子句对数据分组;
having 子句过滤分组结果集(可使用组函数);
AVG:只适用于Number,计算非空;
count(expr):使用于任何类型,返回expr不为空的记录数;
Max/Min:适用于varchar、Number、Date类型;
STDDEV:标准差(很少用到);
SUM:只是用于Number,计算非空;
count(distinct expr):返回expr非空且不重复记录;
group by:查询列中不是组函数,一定要写在此其中;
不能在where子句中使用组函数;
可在having子句中使用组函数;
组函数可以嵌套;
eg:
1 --组函数处理多行返回一行吗? 2 --是 3 4 --组函数不计算空值吗? 5 --是 6 7 --where子句可否使用组函数进行过滤? 8 --不可以,用having替代 9 10 --查询公司员工工资的最大值,最小值,平均值,总和 11 select max(salary),min(salary),avg(salary),sum(salary) 12 from employees; 13 14 --查询各job_id的员工工资的最大值,最小值,平均值,总和 15 select job_id,max(salary),min(salary),avg(salary),sum(salary) 16 from employees 17 group by job_id; 18 19 --选择具有各个job_id的员工人数 20 select job_id,count(employee_id) 21 from employees 22 group by job_id; 23 24 --查询员工最高工资和最低工资的差距(DIFFERENCE) 25 select max(salary),min(salary),max(salary)-min(salary) "DIFFERENCE" 26 from employees; 27 28 --查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内 29 select manager_id,min(salary) 30 from employees 31 where manager_id is not null 32 group by manager_id 33 having min(salary) >= 6000; 34 35 --查询所有部门的名字,location_id,员工数量和工资平均值 36 select department_name,location_id,count(employee_id),avg(salary) 37 from employees e right outer join departments d 38 on e.department_id = d.department_id 39 group by department_name,location_id; 40 41 --查询公司在1995-1998年之间,每年雇用的人数,结果类似下面的格式 42 --total 1995 1996 1997 1998 43 --20 3 4 6 7 44 select count(*) "total", 45 count(decode(to_char(hire_date,'yyyy'),'1995',1,null)) "1995", 46 count(decode(to_char(hire_date,'yyyy'),'1996',1,null)) "1996", 47 count(decode(to_char(hire_date,'yyyy'),'1997',1,null)) "1997", 48 count(decode(to_char(hire_date,'yyyy'),'1998',1,null)) "1998" 49 from employees 50 where to_char(hire_date,'yyyy') in ('1995','1996','1997','1998');