分组查询

发表时间:2017-05-11 16:48:22 浏览量( 10 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

一、组函数

组函数的操作是基于一批行进行的,从而每一组得出一个结果。常用的分组函数有:

AVG:求平均值

COUNT:统计数量

MAX:求最大值

MIN:求最小值

SUM:求和

STDDEV:标准差

VARIANCE:方差

示例如下:

 --查询全体员工的平均工资
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子句将表中的行分成几个小组,然后再进行相关统计。

 --统计各个部门的平均工资
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子句中使用组函数。示例代码如下:

--先做条件查询 过滤数据后在做分组统计查询  
--统计各个部门所有姓刘的员工的平均工资。按照平均工资从高到低排列
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函数强迫组函数包括空值,显示说明如何处理空值。

--null 值的处理 nvl (列名,默认值) 如果该列为null,就是用默认值
select avg(nvl(salary,0)) from employee