首页 > 代码库 > 分组统计查询(学习笔记)
分组统计查询(学习笔记)
查询出公司每个月支出的工资总和
--查询出公司每个月支出的工资总和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子句是在分组之后使用,主要是为了针对分组的结果进行过滤
分组统计查询(学习笔记)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。