分组统计查询

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

--查询出公司每个月支出的工资总和
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 emp
GROUP 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 d
WHERE e.deptno(+)=d.deptno
GROUP BY d.dname;

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

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

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

复制代码
--统计领取佣金与不领取佣金的员工的平均工资,平均入职年限,员工人数--comm是空内容不能直接分组,用集合来完成
SELECT ROUND(AVG(e.sal),2),ROUND(AVG(months_between(SYSDATE,e.hiredate)/12),2),COUNT(e.empno)
FROM emp e
WHERE e.comm IS NULL
UNION 
SELECT ROUND(AVG(e.sal),2),ROUND(AVG(months_between(SYSDATE,e.hiredate)/12),2),COUNT(e.empno)
FROM emp e
WHERE 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 e
WHERE 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 e
GROUP BY e.job
HAVING 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 d
WHERE e.deptno(+)=d.deptno
GROUP BY d.deptno,d.dname
HAVING COUNT(e.empno)>0;

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

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

 

posted @ 2019-04-05 16:43  TonySoprano  阅读(572)  评论(0编辑  收藏  举报