• 分组统计查询


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

    --查询出公司每个月支出的工资总和
    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子句是在分组之后使用,主要是为了针对分组的结果进行过滤
     
  • 相关阅读:
    Backbone.js 1.0.0源码架构分析(一)
    汤姆大叔的博客(深入理解JavaScript系列(2):揭秘命名函数表达式)
    求职之路(拿到百度、美团、趋势科技、华为offer)
    请大家注意这个网站www.haogongju.net
    后缀数组求最长重复子串
    2015阿里在线笔试题求两个字符串的最长子串
    剑指offer42:翻转单词顺序 VS 左旋转字符串(更高效、简便的解法)
    求和为s的连续正数序列
    数组中的逆序对
    求一串字符串的全排列和所有组合
  • 原文地址:https://www.cnblogs.com/Soprano/p/10659095.html
Copyright © 2020-2023  润新知