Oracle分组函数

来源:互联网 发布:addiction动作数据mmd 编辑:程序博客网 时间:2024/06/03 14:17

这里写图片描述

一、常见的分组函数:

常见的分组函数有AVG、COUNT MAX MIN SUM OVER–分组排序的一个函数

–count
很多时候用count(1)去替代count(*)查询效率比较高

SELECT COUNT(*) FROM T_EMP e;SELECT COUNT(1) FROM T_EMP e;SELECT COUNT(e.ename) FROM T_EMP e;

用字段查询count,当字段为空时,不计入数量。

–max

SELECT MAX(e.sal) FROM T_EMP e;SELECT e.ename FROM T_EMP e WHERE e.val=(SELECT );

–avg

SELECT AVG(e.sal) FROM T_EMP e;

–sum

SELECT SUM(e.sal) FROM T_EMP e;

重点–over—-不是分组函数
over函数是实现按指定字段分组排序,对于相同分组字段结果集进行排序。其中partition by 为分组字段,order by 为指定排序字段。

SELECT e.sal,e.dpet,sum(e.sal)over(partition by e.dept order by e.sal) FROM T_EMP e;

按照部门dept分组,各个分组后在各组内部按照sal进行排序

SELECT e.sal,e.dpet,sum(e.sal) rank() over(partition by e.dept order by e.sal) FROM T_EMP e;

相同的并列排名的话,后面的增加

SELECT e.sal,e.dpet,sum(e.sal) dense_rank() over(partition by e.dept order by e.sal) FROM T_EMP e;

相同的并列排名的话,后面的不增加继续按照序号进行排序

通过over可以实现分页。

–group by
查询每个部门的员工总数

SELECT COUNT(1),e.deptno FROM T_EMP e GROUP BY e.deptno ORDER BY e.deptno; 

以下不能执行,报错不是group by 表达式

SELECT COUNT(1),e.deptno,e.ename FROM T_EMP e GROUP BY e.deptno ORDER BY e.deptno; 

需要修改为:

SELECT COUNT(1),e.deptno,e.ename FROM T_EMP e GROUP BY e.deptno,e.ename ORDER BY e.deptno; 

才能执行
例如:
查询每个部门的最高工资和最低工资

SELECT t.deptno, MAX(t.sal),MIN(t.sal) from T_EMP t group by t.deptno;

–having
对分组函数后的筛选,紧跟group by
例如:
筛选平均销售额大于两千的

SELECT t.deptno,AVG(t.sal) avg_sal FROM T_EMP t group by t.deptno having avg_sal > 1000;

如果一条语句中有where,group by,order by,having那么执行顺序是什么呢?

where/group by/having/order by

order by 要放到最后