02-分组查询

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

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');
原文地址:https://www.cnblogs.com/shici/p/13397422.html