【OracleDB】 07 分组查询 & 分组函数

分组函数

分组函数作用于一组数据,并对一组数据返回一个值。

 

Oracle中分组函数的种类:

- 求平均值 AVG

- 计数记录数 COUNT

- 求最大值 MAX

- 求最小值 MIN

- 求和 SUM

- 求标准差? STDDEV

 

分组函数的语法公式:

SELECT    [column,] group_function(column), ...
FROM        table
[WHERE    condition]
[GROUP BY    column]
[ORDER BY    column];

 

AVG(平均值)和 SUM (合计)函数

对数值型数据使用AVG 和 SUM 函数。

SELECT 
    AVG(salary), MAX(salary),
    MIN(salary), SUM(salary)
FROM   
    employees
WHERE  
    job_id LIKE '%REP%';

 

MIN(最小值)和 MAX(最大值)函数

对任意数据类型的数据使用 MIN 和 MAX 函数。

SELECT 
  MIN(hire_date), MAX(hire_date) FROM
  employees;

 

COUNT(计数)函数

COUNT(*) 返回表中记录总数,适用于任意数据类型。

SELECT COUNT(*)
FROM  employees
WHERE  department_id = 50;

COUNT(expr) 返回expr不为空的记录总数。

SELECT COUNT(commission_pct)
FROM   employees
WHERE  department_id = 50;

 


分组函数与空值

所有的分组函数都是忽略空值进行计算的

SELECT AVG(commission_pct)
FROM   employees;

使用NVL函数去设置空值,可以被分组函数计算

SELECT AVG(NVL(commission_pct, 0))
FROM   employees;

 


COUNT结合DISTINCT排除重复的计数

COUNT(DISTINCT expr)返回expr非空且不重复的记录总数

SELECT COUNT(DISTINCT department_id)
FROM   employees;

 


分组函数: GROUP BY

求出EMPLOYEES表中各部门的平均工资

 

语法公式:

可以使用GROUP BY子句将表中的数据分成若干组

SELECT    column, group_function(column)
FROM    table
[WHERE    condition]
[GROUP BY    group_by_expression]
[ORDER BY    column];

【明确:WHERE一定放在FROM后面】

 

在SELECT 列表中所有未包含在组函数中的列都应该包含 在 GROUP BY 子句中。

SELECT   department_id, AVG(salary)
FROM     employees
GROUP BY department_id ;

 

包含在 GROUP BY 子句中的列不必包含在SELECT 列表中

SELECT   AVG(salary)
FROM     employees
GROUP BY department_id ;

 

对多个列进行分组

SELECT   department_id dept_id, job_id, SUM(salary)
FROM     employees
GROUP BY department_id, job_id ;

非法使用组函数

所有包含于SELECT 列表中,而未包含于组函数中的列都 必须包含于 GROUP BY 子句中。

SELECT department_id, COUNT(last_name)
FROM   employees;

错误警告:

GROUP BY 子句中缺少列

ERROR at line 1:
ORA-00937: not a single-group group function

 

不能在 WHERE 子句中使用组函数。

可以在 HAVING 子句中使用组函数。

SELECT   department_id, AVG(salary)
FROM     employees
WHERE    AVG(salary) > 8000
GROUP BY department_id;

错误警告:

WHERE 子句中不能使用组函数

ERROR at line 3:
ORA-00934: group function is not allowed here

 

练习:

部门最高工资比 10000 高的部门

 


过滤分组: HAVING 子句

使用 HAVING 过滤分组:

1. 行已经被分组。

2. 使用了组函数。

3. 满足HAVING 子句中条件的分组将被显示。

 

语法公式:

SELECT    column, group_function
FROM        table
[WHERE    condition]
[GROUP BY    group_by_expression]
[HAVING    group_condition]
[ORDER BY    column];

 

案例:

SELECT   department_id, MAX(salary)
FROM     employees
GROUP BY department_id
HAVING   MAX(salary)>10000 ;

 


嵌套分组函数

查询各部门平均工资的最大值

SELECT   MAX(AVG(salary))
FROM     employees
GROUP BY department_id;

 

posted @ 2020-05-15 12:07  emdzz  阅读(239)  评论(0)    收藏  举报