• 聚合函数--


    SQL函数还有一类,叫做聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。
    在这里插入图片描述
    聚合函数作用于一组数据,并对一组数据返回一个值。比如求一组数据的和、平均值等等…
    在这里插入图片描述
    AVG/SUM
    在这里插入图片描述
    AVG/SUM:只适用于数值类型的字段(或变量)。
    注意
    AVG和SUM计算时都会过滤null值。比如公司100个人,95个有salary,5个人salary为null,那么AVG(salary)=95个人的平均工资。SUM(salary)=95个人的工资总和。

    max/min
    在这里插入图片描述
    count
    在这里插入图片描述
    如果计算表中有多少条记录,如何实现?
    #方式一:count()
    #方式二:count(常数)
    #方式三:count(具体字段) 不一定对,因为该字段在某一行可能为null,不会计入。
    注意
    计算指定字段出现的个数时,是不计算null值的。
    在这里插入图片描述
    查询公司员工的平均奖金率
    在这里插入图片描述
    ==**若需要统计表中的记录数,使用count(
    )、count(常数)、count(具体字段),哪个效率更高?**==
    1.若使用的是MyISAM存储引擎,则三者效率相同,都是O(1)
    2.若使用的是InnoDB存储引擎,则三者效率:count(*)=count(常数)>count(字段)

    group by的使用
    需求:查询各个部门的平均工资
    按照部门id来分组。
    在这里插入图片描述
    各个部门department_id下面还有工作分类job_id。
    需求:查询各个department_id下面的各个job_id的平均工资
    这里department_id和job_id的先后顺序可以颠倒,因为只有这两种属性都相同的才会分到一个组,区别在于先对哪个进行分类,但结果是一样的。
    在这里插入图片描述
    注意
    1.select中出现的非组函数的字段必须声明在group by中(但是MySQL不会报错)。反之,group by中声明的字段可以不出现在select中。
    2.group by声明在from后面,where后面,order by前面,limit前面。
    3.若在MySQL中group by使用with rollup,在查询最后一条会统计数据和
    说明:用了with rollup就不能用order by排序了。但8.0版本不会报错
    在这里插入图片描述
    having的使用
    作用:用来过滤数据。

    查询各个部门中最高工资比1w高的部门信息

    #错误写法
    select department_id,max(salary)
    from employees
    where max(salary)>10000
    group by department_id;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果过滤条件中使用了聚合函数,则必须使用having来替换where,否则报错
    也就是说where中不能有聚合函数
    having必须声明在group by后面

    #正确写法
    select department_id,max(salary)
    from employees
    group by department_id
    having max(salary)>10000
    
    • 1
    • 2
    • 3
    • 4
    • 5

    一般开发中,我们使用having的前提是SQL中使用了group by。

    查询部门id为10,20,30这三个部门中最高工资比1w高的部门信息

    #方式一
    select department_id,max(salary)
    from employees
    where department_id in(10,20,30)
    group by department_id
    having max(salary)>10000;
    
    #方式二
    select department_id,max(salary)
    from employees
    group by department_id
    having max(salary)>10000 and department_id in(10,20,30);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结论
    当过滤条件中有聚合函数时,此过滤条件必须声明在having中。
    当没有时,过滤条件声明在where中或having中都可,但建议声明在where中,效率更高。

    在这里插入图片描述

    #sql92语法 基本结构
    select ...,...(存在聚合函数)
    from ...,...,...
    where 多表的连接条件 and 不包含聚合函数的过滤条件
    group by...,...
    having 包含聚合函数的过滤条件
    order by...,...(asc/desc)
    limit ...,...
    
    #sql99语法 基本结构
    select ...,...,...(存在聚合函数)
    from...(left/right)join...on 多表的连接条件
    (left/right)join...on...
    where 不包含聚合函数的过滤条件
    group by...,...
    having 包含聚合函数的过滤条件
    order by ...,...(asc/desc)
    limit ...,...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    SQL语句的执行过程
    from—on----(left / right join)----where-----group by -----having----select----distinct(去重)—order by----limit

  • 相关阅读:
    第一百三十四回 自定义缓冲组件
    SpringMVC源码分析(四)请求流程分析
    一键自动化博客发布工具,用过的人都说好(腾讯云篇)
    Python中__init__.py的作用介绍
    Springboot莱昂纳多作品集推荐系统jcpqz计算机毕业设计-课程设计-期末作业-毕设程序代做
    C++语法——详细剖析多态与虚函数
    4.1 初探Spring Boot
    如何使用Google Analytics跟踪WordPress网站的用户参与度
    建立复数类
    MongoDB的导入导出、备份恢复总结
  • 原文地址:https://blog.csdn.net/catcat2003/article/details/125038371