• MySQL --- 数据库查询 - 聚合函数的使用、聚合查询、分组查询


    聚合函数(统计函数)

    SQL 允许对表中的数据进行计算,将表中每一列数据作为一个整体,进行纵向计算。

    column 表示字段名,对某一字段进行某些操作

    MAX、MIN、COUNT 不会对空值进行计算

    COUNT(*) 返回所有列的行数,包含空值

    其中 COUNT 函数可用于任何数据类型 (因为它只是记录行数),而 SUM 、AVG 函数都只能对数值类型做计算,MAX 和 MIN 可用于数值、字符串或是日期时间数据类型。

    1.统计该企业员工数量 

    SELECT COUNT(*) FROM emp;

    注意 COUNT() 不会把空值计算在内

    SELECT COUNT(mgr) FROM emp;

    2.统计该企业员工的平均工资

    SELECT AVG(sal) FROM emp;

    3.查询该企业员工的最高工资

    SELECT MAX(sal) FROM emp;

    4.查询该企业员工的最低工资

    SELECT MIN(sal) FROM emp;

    5.计算所有销售的工资之和

    1. SELECT sal FROM emp WHERE job='salesman';
    2. SELECT SUM(sal) FROM emp WHERE job='salesman';

    分组查询

    聚合函数实际上就是一些统计函数。

    接下来我们来学习分组统计查询。

    需要声明一点的是,虽然说统计函数一般是搭配分组查询,但是单独使用的情况一定是有的。例如:在做报表显示的时候基本的分页操作,一定要查询出全部的数据。

    那么什么是分组呢?

    分组这个概念在生活中其实是很常见的,比如有以下需求:

    • 1.在一个班级之中,要求男女各一组进行辩论赛

    • 2.在公司中,要求每个部门一组进行拔河比赛

    对于第一个需求,假设存在学生表,那么在学生表之中一定会存在一个性别字段,性别只可能是男或者女。

    而在公司之中,如果要进行部门分组,肯定需要一个部门列的内容存在重复。部门和员工是一对多的关系,一个部门对应多个员工。

    分组只对数据有重复的字段才有意义,我们可以先查看 emp 表,找到可以分组的字段职位 job 和部门编号 deptno。

    首先员工编号 empno 不能是重复的,如果重复了,就是同一个人,姓名 ename 一般也不会存在重复的

    语法

    GROUP BY 后面写上要对哪一个字段进行分组

    HAVING 对分组之后对分组的数据进行筛选

    WHERE 对分组之前的数据进行筛选

    HAVING 对分组之后的数据进行筛选

    SELECT 分组字段/聚合函数 FROM 表名 [WHERE 条件] GROUP BY 分组字段 [HAVING 分组后条件];

    查询需求

    1.统计出每个工作岗位的人数,输出所有的工作岗位,然后对它进行分组,多个重复的算是一组里面,最后对每一组统计岗位里面有多少人

    SELECT job,COUNT(*) FROM emp GROUP BY job;

    2.统计出每种职位的最低和最高工资

    1. -- 统计出每种职位
    2. SELECT job FROM emp GROUP BY job;
    3. SELECT job,MIN(sal),MAX(sal) FROM emp GROUP BY job;

    以上两个查询就实现了分组的基本操作,而且这些代码都按照标准格式进行了编写。可是在分组之中,个人认为最麻烦的地方就是在于分组操作的若干限制。

    注意事项

    1.如果一个查询之中(不存在GROUP BY子句),那么在SELECT子句之中只允许出现统计函数,其他任何字段都不允许出现。

    有统计函数的时候,其他任何字段都不允许出现。

    1. #错误的语句
    2. SELECT ename,COUNT(job) FROM emp;
    3. #正确的语句
    4. SELECT COUNT(job) FROM emp;

    2.在统计查询之中(存在GROUP BY子句),SELECT子句之中只允许出现统计函数和分组字段(GROUP BY之后定义的字段),其他的任何字段都不允许出现。

    1. #错误的语句
    2. SELECT ename,COUNT(job) FROM emp GROUP BY job;
    3. #正确的语句
    4. SELECT deptno,COUNT(job) FROM emp GROUP BY job;

    在以后进行分组操作的时候,本着一个原则:GROUP BY子句之中允许出现的字段才是SELECT子句中允许出现的字段。

    查询需求

    1.显示不同职位薪资少于1500的人数

    1. -- 显示不同职位
    2. SELECT job FROM emp GROUP BY job;
    3. -- 显示不同职位的人数
    4. SELECT job,COUNT(*) FROM emp GROUP BY job;
    5. -- 显示不同职位薪资少于1500的人数
    6. SELECT job,COUNT(*) FROM emp WHERE sal<1500 GROUP BY job;

    2.多加一个限制条件,只显示人数大于 2 的,其实就是第 1 题的结果再进行一个筛选

    SELECT job,COUNT(*) FROM emp WHERE sal<1500 GROUP BY job HAVING COUNT(*)>2;

    3.显示非销售人员(salesman)工作名称以及从事同一工作的员工的月工资的总和,并且要满足从事同一工作的员工的月工资合计大于等于5000

    1. SELECT job FROM emp WHERE job!='salesman';
    2. SELECT job,SUM(sal) FROM emp WHERE job!='salesman' GROUP BY job;
    3. SELECT job,SUM(sal) AS total FROM emp WHERE job!='salesman' GROUP BY job HAVING total>=5000;

    WHERE和HAVING区别

    • WHERE:是在分组之前使用(可以没有GROUP BY),不允许使用统计函数。

    • HAVING:是在分组之后使用(必须结合GROUP BY),允许使用统计函数。

     

  • 相关阅读:
    Flink学习20:聚合算子(sum,max,min)
    Raiden Network(二)—— Mediated transfers(多跳支付里的中介传输)
    微服务[Nacos]
    2023江苏师范大学计算机考研信息汇总
    公司新来的实习生问我SpringBoot多个环境的配置方式
    怎样才能做到C++入门到精通,看看大佬们是怎么做的!
    腾讯云轻量数据库试用初体验
    NLP工具学习(1)Thulac分词工具与WordCloud词云
    新能源三电系统测试如何快速连接,避免多次插拔?安规测试电连接器的作用
    layui使用富文本已经使用第三方插件Kz.layedit来优化layui的富文本
  • 原文地址:https://blog.csdn.net/weixin_60569662/article/details/125582052