13、分组查询

学习目标:

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

猜你喜欢

转载自blog.csdn.net/liubao616311/article/details/83957129