首页 > 代码库 > 分组统计查询(学习笔记)

分组统计查询(学习笔记)

技术分享

查询出公司每个月支出的工资总和

--查询出公司每个月支出的工资总和SELECT SUM(sal) FROM emp;

查询出公司的最高工资,最低工资和平均工资

--查询出公司的最高工资,最低工资和平均工资SELECT MAX(sal),MIN(sal),ROUND(AVG(sal),2) FROM emp;

统计出公司最早雇佣和最晚雇佣的雇佣日期

--统计出公司最早雇佣和最晚雇佣的雇佣日期SELECT MIN(hiredate) 最早雇佣日期 , MAX(hiredate) 最晚雇佣日期 FROM emp ;

统计公司工资之中中间的工资值

--统计公司工资之中中间的工资值SELECT MEDIAN(sal) FROM emp ;

验证COUNT(*)、COUNT(字段)、COUNT(DISTINCT 字段)的使用区别

--验证COUNT(*)、COUNT(字段)、COUNT(DISTINCT 字段)的使用区别SELECT COUNT(*) , COUNT(ename) , COUNT(comm) , COUNT(DISTINCT job) FROM emp ;

 

分组统计语法
SELECT [DISTINCT]  分组字段 [AS] [列别名] ,... | 统计函数 [AS] [别名] , ….    FROM 表名称1 [表别名1] , 表名称2 [表别名2] ….    [WHERE 条件(s)]     [GROUP BY 分组字段]    [ORDER BY 排序字段 ASC|DESC] ;
 

 

单字段分组统计

统计出每个部门的人数
--统计出每个部门的人数SELECT COUNT(empno) FROM empGROUP BY deptno; 

 统计出每种职位的最低、最高工资

--统计出每种职位的最低、最高工资SELECT job,MIN(sal) 最低工资,MAX(sal) 最高工资FROM emp GROUP BY job;

查询出每个部门的名称,部门人数,部门平均工资,平均服务年限

--查询出每个部门的名称,部门人数,部门平均工资,平均服务年限SELECT d.dname,COUNT(e.empno),ROUND (AVG(e.sal),2),ROUND(AVG (months_between(SYSDATE,e.hiredate)/12),2)FROM emp e,dept dWHERE e.deptno(+)=d.deptnoGROUP BY d.dname;

查询出公司各个工资等级雇员的数量、平均工资。

--查询出公司各个工资等级雇员的数量、平均工资。SELECT s.grade,COUNT(e.empno),ROUND (AVG(e.sal),2)FROM emp e,salgrade sWHERE e.sal BETWEEN s.losal AND s.hisalGROUP BY s.grade;

统计领取佣金与不领取佣金的员工的平均工资,平均入职年限,员工人数

--统计领取佣金与不领取佣金的员工的平均工资,平均入职年限,员工人数--comm是空内容不能直接分组,用集合来完成SELECT ROUND(AVG(e.sal),2),ROUND(AVG(months_between(SYSDATE,e.hiredate)/12),2),COUNT(e.empno)FROM emp eWHERE e.comm IS NULLUNION SELECT ROUND(AVG(e.sal),2),ROUND(AVG(months_between(SYSDATE,e.hiredate)/12),2),COUNT(e.empno)FROM emp eWHERE e.comm IS NOT NULL;

多字段分组统计

--语法SELECT [DISTINCT]  分组字段1 [AS] [列别名] , [分组字段2 [AS] [列别名] , …] | 统计函数 [AS] [别名] , ….    FROM 表名称1 [表别名1] , 表名称2 [表别名2] ….    [WHERE 条件(s)]     [GROUP BY 分组字段1 , 分组字段2 , ….]    [ORDER BY 排序字段 ASC|DESC] ;
现在要求查询出每个部门的详细信息
--现在要求查询出每个部门的详细信息,部门编号,部门名称,部门位置,部门人数,平均工资,总工资,最高、最低工资SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal),SUM(sal),MAX(sal),MIN(sal)FROM dept d,emp eWHERE d.deptno=e.deptno(+)GROUP BY d.deptno,d.dname,d.loc;

HAVING子句

      使用GROUP BY子句可以实现数据的分组显示,但是在很多时候往往需要对分组之后的数据进行再次的过滤,
而后再通过统计结果进行数据的过滤,而要想实现这样的功能就只能通过HAVING子句完成。
语法:
SELECT [DISTINCT]  分组字段1 [AS] [列别名] , [分组字段2 [AS] [列别名] , …] | 统计函数 [AS] [别名] , ….    FROM 表名称1 [表别名1] , 表名称2 [表别名2] ….    [WHERE 条件(s)]     [GROUP BY 分组字段1 , 分组字段2 , ….]    [HAVING 过滤条件(s)]    [ORDER BY 排序字段 ASC|DESC] ;
查询出所有平均工资大于2000的职位信息、平均工资、雇员人数
--查询出所有平均工资大于2000的职位信息、平均工资、雇员人数SELECT e.job,AVG(e.sal),COUNT(e.empno)FROM emp eGROUP BY e.jobHAVING AVG(e.sal)>2000;
列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资。
--列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资。SELECT d.deptno,d.dname,AVG(e.sal) avgsal,MIN(e.sal),MAX(e.sal),COUNT(e.empno) 人数FROM emp e,dept dWHERE e.deptno(+)=d.deptnoGROUP BY d.deptno,d.dnameHAVING COUNT(e.empno)>0;

显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,
并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列

 
--显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,--并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列SELECT e.job,SUM(e.sal) sumsalFROM emp eWHERE e.job<>SALESMAN GROUP BY e.jobHAVING SUM(e.sal)>5000ORDER BY sumsal ASC;
HAVING子句是在分组之后使用,主要是为了针对分组的结果进行过滤
 

 

分组统计查询(学习笔记)