MySQL 08 章——聚合函数

聚合函数是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值

MySQL中,目前不能对聚合函数进行嵌套

一、聚合函数介绍

(1)AVG和SUM函数

  1. 举例:
  2. 只适用于数值类型的字段(或变量)
  3. AVG函数和SUM函数在计算空值时,会自动把NULL过滤掉

(2)MIN和MAX函数

  1. 举例:
  2. 适用于数值类型、字符串类型、日期时间类型的字段(变量)

(3)COUNT函数

  1. 举例:
  2. 作用:计算指定字段在查询结构中出现的个数,如果值为NULL就不会被计算进去
  3. 如果计算表中有多少条记录,如何实现?
    1. COUNT(*)
    2. COUNT(1)
    3. COUNT(具体字段):不一定对!因为字段中的NULL值不会被计算进去
  4. AVG = SUM / COUNT,因为这三个函数都过滤掉了NULL值,所以
  5. 需求:查询公司中的平均奖金率
  6. 如果需要统计表中的记录数,使用COUNT(*)、COUNT(1)、COUNT(具体字段)哪个效率更高呢?
    1. 如果使用的是MyISAM存储引擎,则三者的效率相同,都是O(1)
    2. 如果使用的是InnoDB存储引擎,则三者效率:COUNT(*) = COUNT(1) > COUNT(具体字段)

二、GROUP BY

(1)基本使用

  1. 需求:查询各个部门的平均工资、最高工资

(2)使用多个列分组

  1. 需求:查询各个部门中,各个工种的平均工资
  2. 注意:SELECT中出现的非聚合函数的字段,必须声明在GROUP BY中;反之,GROUP BY中声明的字段可以不出现在SELECT中
  3. GROUP BY声明在FROM后面,WHERE后面,ORDER BY前面,LIMIT前面

(3)GROUP BY中使用WITH ROLLUP

  1. 使用WITH ROLLUP关键字之后,在所有查询出的记录之后,增加了一条记录。该记录就是汇总行
  2. 当使用WITH ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即WITH ROLLUP和ORDER BY是相互排斥的

三、HAVING

(1)基本使用

  1. HAVING的作用:是用来过滤数据的
  2. 练习:查询各个部门中最高工资比10000高的部门信息
  3. 如果过滤条件中使用了聚合函数,则必须用HAVING来替换WHERE,否则报错
  4. HAVING必须声明在GROUP BY的后面
  5. 开发中,使用HAVING的前提是使用了GROUP BY

(2)WHERE和HAVING的对比

  1. 练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息(两种方式)
  2. 推荐使用方式一,执行效率高于方式二
  3. 当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。当过滤条件中没有聚合函数时,则此过滤条件声明在HAVING或WHERE中都可以。但是建议声明在WHERE中,效率更高
  4. WHERE和HAVING对比:
    1. 从适用范围上来讲,HAVING的适用范围更广
    2. 如果过滤条件中没有聚合函数,这种情况下,WHERE的效率要高于HAVING

四、SELECT的执行过程

(1)查询的结构

  1. sql92语法:
    SELECT ...,...,...(存在聚合函数)
    FROM ...,...,...
    WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
    GROUP BY ...,...
    HAVING 包含聚合函数的过滤条件
    ORDER BY ...,...(ASC/DESC)
    LIMIT ...,...
  2. sql99语法:
    SELECT ...,...,...(存在聚合函数)
    FROM ...(LEFT / RIGHT)JOIN...ON 多表的连接条件
    JOIN...ON 多表的连接条件
    WHERE 不包含聚合函数的过滤条件
    GROUP BY ...,...
    HAVING 包含聚合函数的过滤条件
    ORDER BY ...,...(ASC/DESC)
    LIMIT ...,...

(2)SELECT执行顺序

  1. FROM ...JOIN...,先对两张表进行笛卡尔积。ON用来去掉不应该关联的数据
  2. 关注左外连接和右外连接
  3. WHERE过滤数据
  4. 对过滤后的数据进行分组(GROUP BY),然后执行HAVING
  5. SELECT选出字段
  6. ORDER BY排序,然后分页查询

(3)SQL的执行原理

  1. SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
    (1)首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1
    (2)通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2
    (3)添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3
    (4)当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据

  2. 当我们拿到了查询数据表的原始数据,也就是最终的虚拟表 vt1,就可以在此基础上再进行 WHERE 阶段。在这个阶段中,会根据 vt1 表的结果进行筛选过滤,得到虚拟表 vt2

  3. 然后进入第三步和第四步,也就是 GROUP 和 HAVING 阶段。在这个阶段中,实际上是在虚拟表 vt2 的基础上进行分组和分组过滤,得到中间的虚拟表 vt3 和 vt4

  4. 当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT 阶段首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表 vt5-1 和 vt5-2

  5. 当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段,得到虚拟表 vt6

  6. 最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段,得到最终的结果,对应的是虚拟表 vt7

  7. 当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略

五、课后练习

  1. 查询公司员工工资的最大值、最小值、平均值、总和
    SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary)
    FROM employees;
  2. 查询各job_id的员工工资的最大值、最小值、平均值、总和
    SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
    FROM employees
    GROUP BY job_id;
  3. 选择具有各个job_id的员工人数
    SELECT job_id,COUNT(*) "workers"
    FROM employees
    GROUP BY job_id;
  4. 查询员工最高工资和最低工资的差距(DIFFERENCE)
    SELECT MAX(salary) - MIN(salary) "DIFFERENCE"
    FROM employees;
  5. 查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
    SELECT manager_id,MIN(salary)
    FROM employees
    WHERE manager_id IS NOT NULL
    GROUP BY manager_id
    HAVING MIN(salary) >= 6000;
  6. 查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
    SELECT department_name,location_id,COUNT(*),AVG(salary) avg_sal
    FROM departments d LEFT OUTER JOIN employees e
    ON d.department_id = e.department_id
    GROUP BY department_name,location_id#select中出现的非聚合函数的字段,必须出现在group by中
    ORDER BY avg_sal DESC;
  7. 查询每个部门的部门名,以及它对应工种的工种名和该工种的最低工资
    SELECT department_name,job_id,MIN(salary)
    FROM departments d LEFT OUTER JOIN employees e
    ON d.department_id = e.department_id
    GROUP BY department_name,job_id;

该笔记根据尚硅谷的MySQL课程整理 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM对象创建过程

1 类加载检查 jvm通过new指令开始创建对象jvm执行new指令时,首先通过指令参数从常量池中取到需要创建的类名检查该类是否被加载,解析,和初始化过如果没有,则执行类的加载过程new指令对应到java语言具体的操作为 new 关键字创建对象…

Outlook2024版如何回到经典Outlook

Outlook2024版如何回到经典Outlook 如果新加入一家公司,拿到的电脑,大概率是最新版的Windows, 一切都是新的。 如果不coding, 使用国产的foxmail大概就可以解决一切问题了。可惜老程序员很多Coding都是基于传统Outlook的,科技公司所有人都是I…

三甲医院等级评审八维数据分析应用(五)--数据集成与共享篇

一、引言 1.1 研究背景与意义 随着医疗卫生体制改革的不断深化以及信息技术的飞速发展,三甲医院评审作为衡量医院综合实力与服务水平的重要标准,对数据集成与共享提出了更为严苛的要求。在传统医疗模式下,医院内部各业务系统往往各自为政,形成诸多“信息孤岛”,使得数据…

Scala_【4】流程控制

第四章 分支控制if-else单分支双分支多分支返回值嵌套分支 For循环控制包含边界不包含边界循环守卫循环步长嵌套循环循环返回值 While循环Break友情链接 分支控制if-else 单分支 双分支 多分支 返回值 嵌套分支 For循环控制 Scala也为for循环这一常见的控制结构提供了非常多的…

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二: 状态码写法三 : 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…

医院机房运维:所有IT资源运行状态同一平台实时呈现

在当今数字化医疗高速发展的时代,医院的信息化系统已然成为保障医疗服务顺畅开展、守护患者生命健康的关键基础设施。以郑州人民医院为例,随着医疗业务不断拓展,其背后支撑的机房运维面临着诸多棘手难题。 传统的分散式人工维护模式&#xff…

AcWing练习题:油耗

给定一个汽车行驶的总路程(km)和消耗的油量(l),请你求出汽车每消耗 1 升汽油可行驶多少公里路程。 输入格式 输入共两行,第一行包含整数 X,表示行驶总路程。 第二行包含保留一位小数的浮点数…

前后端规约

文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…

Redis(二)value 的五种常见数据类型简述

目录 一、string(字符串) 1、raw 2、int 3、embstr 二、hash(哈希表) 1、hashtable 2、ziplist 三、list(列表) ​编辑 1、linkedlist 2、ziplist 3、quicklist(redis 3.2后的列表内…

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务,不是像其他服务器一样,负责逻辑处理,然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息, 第一步&a…

仿生的群体智能算法总结之二(十种)

群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是10种常见的群体智能算法,接上文https://blog.csdn.net/lzm12278828/article/details/144933367仿生的群体智能算法总结之一(十种)-CSDN博客https://blog.csdn.net/lzm12278828/article/detail…

Jenkins(持续集成与自动化部署)

Jenkins 是一个开源软件项目,是基于Java开发的一种持续集成工具。 官网:https://www.jenkins.io/ GitLab安装使用 安装前提:内存至少需要4G 官方网站:https://about.gitlab.com/ 安装文档:https://docs.gitlab.c…

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站,按照下图所示即可生成高质量的视频,同时,我们也提供了简单易用的 API 方便集成调用,可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术,实现了上面的图…

Day17补代码随想录 654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树

654.最大二叉树 题目 【体会为什么构造二叉树都是前序遍历】 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右…

vue代理问题

vue代理问题 场景:前后端分离项目问题,在前端中请求接口,返回数据这个过程,但是在这个过程中,前端会有两个环境,一个是开发环境,一个是生产环境. 在开发环境中请求接口可能会遇到跨域问题,比如请求的端口是3000,当前端口是8080,这时候就会遇到跨域问题,或者ip不同,也会存在跨…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

📢📢📢:先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

phpIPAM容器化部署场景下从1.5.x更新到1.7.0提示禁用安装脚本配置的处理

phpIPAM容器化部署场景下从1.5.x更新到1.7.0,在系统登录页面出现“Please disable installaion scripts....”提示,本文件记录处理过程。 一、问题描述 phpIPAM从1.5.x更新到1.7.0,在系统登录页面出现提示: “Please disable in…

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

目录 重要信息 大会简介 组织单位 大会成员 征稿主题 会议日程 参会方式 重要信息 大会官网:www.icicml.org 大会时间:2024年11月22日-24日 大会地点:中国 深圳 大会简介 第三届图像处理、计算机视觉与机器学…

技术人做Youtuber第一次实战

2025年第一篇,新年好~ 大概2012年还是大三时,不记得从哪里搞到了youtube注册方法,注册了youtube, facebook等被"walled"的网站,当时沉迷海贼王,上传了类似"六分钟看海贼王多热血"的视频&#xff0…

仓颉笔记——windows11安装启用cangjie语言,并使用vscode编写“你好,世界”

2025年1月1日第一篇日记,大家新年好。 去年就大致看了一下,感觉还不错,但一直没上手,这次借着元旦的晚上安装了一下,今年正式开动,公司众多的应用国产化正等着~~ 第一步:准备 官网:…