Oracle之组函数、分组统计

时间:2022-02-23 09:38:11

1.组函数

在SQL中常用的组函数有以下几个:

  • COUNT():求出全部的记录数     --SELECT COUNT(empno) FROM emp ;
  • MAX()    :求出一组中的最大值  --SELECT MAX(sal) FROM emp ;
  • MIN()     :求出最小值  --SELECT MIN(sal) FROM emp ;
  • AVG()     :求出平均值 --SELECT AVG(sal) FROM emp ;
  • SUM()    :求和    --SELECT SUM(sal) FROM emp WHERE deptno=20 ;
 其中MAX()和MIN()一般是针对数字的应用函数。


2.分组统计

要使用GROUP  BY进行分组,此时SQL语法格式如下:

SELECT {DISTINCT} * | 查询列1 别名1, 查询列2 别名2,…
FROM 表名称1 别名1 , 表名称2 别名2 ,…
{WHERE 条件(s)}
{GROUP BY 分组条件 }
{ORDER BY 排序字段 ASC|DESC , 排序字段 ACS | DESC ,…}

1.求出每个部门雇员数量:

SELECT deptno,COUNT(empno) FROM emp GROUP BY deptno ;--按照部门分组的。

2.求出每个部门的平均工资:

SELECT deptno,AVG(sal)FROM emp GROUP BY deptno ;

注意:

1.如果程序使用了分组函数,则有两种可以使用的情况:

  • 程序中存在了GROUP BY ,并指定了分组条件,这样可以将分组条件一起查询出来。
  • 如果不适用分组,则只能单独使用分组函数。
2.在使用分组函数的时候,不能出现分组函数和分组条件之外的字段。

3.按部门分组,并显示部门的名称,级每个部门的员工数:
SELECT d.dname,COUNT(e.empno) FROM dept d,emp e WHERE d.deptno=e.deptno GROUP BY d.dname ;

4.要求显示出平均工资大于2000的部门编号和平均工资 条件:AVG(sal)>2000.
SELECT deptno,AVG(sal) FROM emp WHERE AVG(sal)>2000 GROUP BY deptno ;
Oracle之组函数、分组统计
分组函数只能在分组中使用,不允许在WHERE语句之中出现,那么如果现在假设要指定分组的条件,则只能通过第二种条件的指令:HAVING,此时的SQL语法格式:
SELECT {DISTINCT} * | 查询列1 别名1,查询列 2 别名2,…
FROM 表名称1 别名1 , 表名称2 别名2 ,…
{WHERE 条件(s)}
{GROUP BY 分组条件 {HAVING 分组条件}}
{ORDER BY 排序字段ASC|DESC ,排序字段 ACS | DESC ,…}
· 使用HAVING完成以上的操作
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal)>2000;

5.显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列:
5.1显示全部的非销售人员:job<>'SALESMAN'
SELECT *
FROM emp
WHERE job<>'SALESMAN' ;

5.2按工作分组,同时求出工资的总和:
SELECT job,SUM(sal)
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job ;

5.3对分组的条件进行限制,工资总和大于5000
SELECT job,SUM(sal)
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job HAVING SUM(sal)>5000 ;

5.4使用排序,按升序排序
SELECT job,SUM(sal) su
FROM emp
WHERE job<>'SALESMAN'
GROUP BY job HAVING SUM(sal)>5000
ORDER BY su ;


分组的简单原则:
· 只要一列存在重复的内容才有可能考虑到分组
注意:· 分组函数可以嵌套使用,但是在组函数嵌套使用的时候,不能再出现分组条件的查询语句。