• 聚合函数--


    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

  • 相关阅读:
    图像傅里叶变换
    算法通关村16关 | 堆与滑动窗口问题结合
    Redis 内存优化神技,小内存保存大数据
    【社媒营销】如何知道自己的WhatsApp是否被屏蔽了?
    AVR单片机及其编译软件
    使用UiPath和AA构建的解决方案 6. 完成RPA挑战
    细胞膜修饰金属有机骨架/上转换纳米粒子/仿生温敏水凝胶载体/纳米碳球的制备
    RabbitMQ初步到精通-第七章-RabbitMQ之延迟队列
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    IPv4/IPv6、DHCP、网关、路由
  • 原文地址:https://blog.csdn.net/catcat2003/article/details/125038371