oracle分组函数
### Oracle 分组函数详解 #### 一、章节目标与内容概览 在Oracle数据库中,分组函数(也称为聚合函数)是一种强大的工具,用于处理数据集并从中提取有用的信息。通过本章节的学习,读者将能够理解单行函数与分组函数之间的区别,并熟练掌握常用的五种分组函数,包括如何使用`GROUP BY`语句来进行数据分组,以及如何使用`HAVING`子句来过滤分组后的记录。 #### 二、为什么使用分组函数? 在实际业务场景中,我们经常需要对大量的数据进行统计分析,例如计算某个部门的员工总数、计算某个时间段内的销售额等。这些需求通常需要对数据进行分组后进行统计,这就需要用到分组函数。例如: - **查询所有员工每个月的工资总和和平均工资**:这需要按照月份对数据进行分组,并计算每个月的工资总和和平均工资。 - **查询工资最高和最低的金额**:这可以通过使用`MAX()`和`MIN()`函数来实现。 - **查询公司的总人数**:可以通过`COUNT(*)`函数来计算总员工数。 - **查询有奖金的总人数**:这需要先找出哪些员工有奖金,然后使用`COUNT()`函数计数。 #### 三、分组函数概述 分组函数(Group Functions),也称为聚合函数,是用来对数据行的集合进行操作,并按组给出一个结果。与单行函数不同,分组函数处理的是数据集中的多行记录,并返回单一的结果。常用的分组函数有: - **MIN()**:返回每组中的最小值。 - **MAX()**:返回每组中的最大值。 - **SUM()**:返回每组的总和。 - **AVG()**:返回每组的平均值。 - **COUNT()**:返回满足条件的每组记录条数。 这些函数的基本语法如下: ```sql SELECT [column,] group_function(column) FROM table [WHERE condition] [GROUP BY column] [HAVING group_function(column) expression] [ORDER BY column|group_function(column) expression]; ``` #### 四、单行函数与分组函数的区别 - **单行函数**:对每一行数据进行操作,返回一行数据的结果。 - **分组函数**:对一组或多组数据进行操作,返回一个结果。 #### 五、分组函数详解 - **MIN() 和 MAX()**:这两个函数主要用来获取每组的最小值和最大值。例如,查询入职日期最早的日期和最晚的日期。 ```sql SELECT MIN(hiredate), MAX(hiredate) FROM emp; ``` - **SUM() 和 AVG()**:分别用于计算每组的总和和平均值。这些函数只能用于数值类型的列或表达式。例如,查询职位以SALES开头的所有员工的平均工资、最低工资、最高工资、工资总和。 ```sql SELECT AVG(sal), MAX(sal), MIN(sal), SUM(sal) FROM emp WHERE job LIKE 'SALES%'; ``` - **COUNT()**:此函数的主要功能是返回满足条件的每组记录条数。它有两种用法: - `COUNT(*)`:返回表中满足条件的行记录数。例如,查询部门30有多少个员工。 ```sql SELECT COUNT(*) FROM emp WHERE deptno = 30; ``` - `COUNT([DISTINCT|ALL] column|expression)`:返回满足条件的非空(NULL)行的数量。例如,查询部门30有多少个员工领取奖金。 ```sql SELECT COUNT(comm) FROM emp WHERE deptno = 30; ``` - **GROUP BY**:用来指定按照哪个或哪些列进行分组。例如,查询每个部门的员工总数。 ```sql SELECT deptno, COUNT(*) FROM emp GROUP BY deptno; ``` - **HAVING**:用于过滤已经分组的数据。与`WHERE`子句不同,`HAVING`子句可以在分组之后进行筛选。例如,查询每个部门的员工总数大于等于5的情况。 ```sql SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) >= 5; ``` - **DISTINCT**:当与分组函数一起使用时,可以去除重复记录。例如,查询有多少个不同的部门。 ```sql SELECT COUNT(DISTINCT deptno) FROM emp; ``` - **分组函数中空值处理**:除了`COUNT(*)`之外,其他所有分组函数在计算时不考虑NULL值。例如,如果想计算所有员工的平均奖金,但有些员工没有奖金(即`comm`列为NULL),则`AVG(comm)`将不考虑这些记录。 ```sql SELECT AVG(comm) FROM emp; -- 不考虑NULL值 ``` 通过上述内容的学习,我们可以看出分组函数在Oracle数据库中的强大功能及其在数据分析中的重要性。熟练掌握这些函数的使用方法,对于提高数据处理效率和准确度具有重要意义。