Oracles数据库学习笔记(四)分组查询

分组查询

一、分组函数

  分组函数是对表中一组记录进行操作,每组只返回一个结果,即首先要对表记录进行分组,然后再进行操作汇总,每组返回一个结果,分组时可能是整个表分为一组,也可能根据条件分成多组。

分组函数常用到以下五个函数:
1、MIN()
2、MAX()
3、SUM()
4、AVG()
5、COUNT()

1.MIN函数和MAX函数

MIN和MAX函数主要是返回每组的最小值和最大值。

MIN([DISTINCT|ALL] column|expression)
MAX([DISTINCT|ALL] column|expression)

eg:查询入职日期最早和最晚的日期

SQL> SELECT MIN(HIREDATE), MAX(HIREDATE)
FROM    EMP

这里写图片描述

2.SUM函数和AVG函数

SUM和AVG函数分别返回每组的总和及平均值。

SUM([DISTINCT|ALL] column|expression)
AVG([DISTINCT|ALL] column|expression)

注意:SUM和AVG函数都是只能够对数值类型的列或表达式操作。

eg:查询职位以SALES开头的所有员工平均工资、最低工资、最高工资、工资和。

SELECT  AVG(SAL), MAX(SAL),MIN(SAL), SUM(SAL)
FROM    EMP
WHERE   JOB LIKE 'SALES%';

这里写图片描述

3.COUNT函数

COUNT函数的主要功能是返回满足条件的每组记录条数。
COUNT( *|{[DISTINCT|ALL] column|expression})

eg:查询部门30有多少个员工

SELECT  COUNT(*)
FROM    EMP
WHERE   DEPTNO = 30;

这里写图片描述

注意:
  (1)分组函数中DISTINCT会消除重复记录后再使用分组函数
  (2)除了COUNT(*)之外,其它所有分组函数都会忽略列中的空值,然后再进行计算
  (3)在分组函数中使用NVL函数,可以使分组函数强制包含含有空值的记录

练习1

(1)查询部门20的员工,每个月的工资总和及平均工资。

SELECT SUM(SAL),AVG(SAL)
FROM EMP
WHERE DEPTNO = 20

这里写图片描述
(2)查询工作在CHICAGO的员工人数,最高工资及最低工资。

SELECT COUNT(ENAME),MAX(SAL),MIN(SAL)
FROM EMP,DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 'CHICAGO'

这里写图片描述
(3)查询员工表中一共有几种岗位类型。

SELECT COUNT(DISTINCT JOB)
FROM EMP

这里写图片描述

二、创建数据组

实现:查询每个部门的平均工资

1.用GROUP BY子句创建数据组

  通过 GROUP BY 子句可将表中满足WHERE条件的记录按照指定的列划分成若干个小组,其中GROUP BY子句指定要分组的列。

  注意:
  (1)在SELECT列表中除了分组函数那些项,所有列都必须包含在GROUP BY 子句中。
  (2)GROUP BY 所指定的列并不是必须出现在SELECT 列表中。

SELECT   AVG(SAL)           SELECT  DEPTNO, COUNT(ENAME)
FROM     EMP                FROM    EMP
GROUP BY DEPTNO;
//没毛病                     //error
2.按多列分组的GROUP BY子句

eg:查询每个部门每个岗位的工资总和。

SELECT   DEPTNO, JOB, SUM(SAL)
FROM     EMP
GROUP BY DEPTNO, JOB

Oracles数据库学习笔记(四)分组查询_第1张图片

练习2

(1)查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。
这里写图片描述

SELECT EMP.DEPTNO,DNAME,COUNT(ENAME),MAX(SAL),MIN(SAL),SUM(SAL),AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY EMP.DEPTNO,DNAME

(2)查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资。

SELECT EMP.DEPTNO,DNAME,JOB,COUNT(ENAME),MAX(SAL),MIN(SAL),SUM(SAL),AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY JOB,EMP.DEPTNO,DNAME
ORDER BY DEPTNO

Oracles数据库学习笔记(四)分组查询_第2张图片
(3)查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。

SELECT MANAGER.EMPNO AS MGRNO, MANAGER.ENAME AS MGRNAME, COUNT(WORKER.ENAME)
FROM EMP WORKER, EMP MANAGER, DEPT
WHERE WORKER.MGR = MANAGER.EMPNO(+) AND DEPT.DEPTNO = WORKER.DEPTNO
GROUP BY MANAGER.EMPNO,MANAGER.ENAME

Oracles数据库学习笔记(四)分组查询_第3张图片

三、排除组结果

1.使用HAVING子句排除组结果。
注意:
(1)HAVING子句要在GROUP BY之后才能使用
(2)HAVING子句相当于WHERE但是只能用于分组函数作为筛选条件的情况下

eg:查询每个部门最高工资大于2900的部门编号,最高工资
这里写图片描述

练习3

(1)查询部门人数大于2的部门编号,部门名称,部门人数。

SELECT EMP.DEPTNO, DNAME, COUNT(ENAME)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY EMP.DEPTNO,DNAME
HAVING COUNT(ENAME)>2

这里写图片描述

(2)查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排序。

SELECT EMP.DEPTNO, DNAME, COUNT(ENAME),AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY EMP.DEPTNO,DNAME
HAVING COUNT(ENAME)>2 AND AVG(SAL)>2000
ORDER BY COUNT(ENAME)

这里写图片描述

四、组函数的嵌套

eg:显示平均薪水的最大值

SELECT MAX(AVG(SAL))
FROM EMP
GROUP BY DEPTNO;

这里写图片描述

你可能感兴趣的:(数据库)