MySQL学习笔记3——条件查询和聚合函数

条件查询和聚合函数

  • 一、条件查询语句
  • 二、聚合函数
    • 1、SUM()
    • 2、AVG()、MAX()、MIN()
    • 3、COUNT()

一、条件查询语句

WHERE 和 HAVING 的区别:

  • WHERE是直接对表中的字段进行限定,来筛选结果;
  • HAVING则需要跟分组关键字GROUP BY一起使用,通过对分组字段或分组计算函数进行限定,来筛选结果。

虽然它们都是对查询进行限定,却有着各自的特点和适用场景。

WHERE

WHERE关键字的特点是,直接用表的字段对数据集进行筛选。如果需要通过关联查询从其他的表获取需要的信息,那么执行的时候,也是先通过WHERE条件进行筛选,用筛选后的比较小的数据集进行连接。这样一来, 连接过程中占用的资源比较少,执行效率也比较高。

HAVING

HAVING不能单独使用,必须要跟GROUP BY 一起使用。

我们可以把GROUP BY理解成对数据进行分组,方便我们对组内的数据进行统计计算。

它们两个典型的区别就是:

  • 如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而HAVING是先连接后筛选。
  • WHERE可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;HAVING必须要与GROUP BY配合使用,可以把分组计算的函数和分组字段作为筛选条件。

这决定了,在需要对数据进行分组统计的时候,HAVING 可以完成WHERE不能完成的任务。这是因为,在查询语法结构中,WHERE在GROUP BY之前,所以无法对分组结果进行筛选。HAVING在GROUP BY之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是WHERE无法完成的。

这么说可能不太好理解,举个小例子理解一下。假如超市经营者提出,要查询一下是哪个收银员、在哪天卖了2单商品。

这种必须先分组才能筛选的查询,用WHERE语句实现就比较难,我们可能要分好几步,通过把中间结果存储起来,才能搞定。但是用HAVING,则很轻松,代码如下:

SELECT
	a. transdate, c.operatorname
FROM 
	demo. transactionhead AS a
JOIN
	demo. transactiondetails AS b ON (a. transactionid = b. transactionid)
JOIN
	demo.operator AS C ON (a.operatorid = c. operatorid)
GROUP BY a. transdate, c. operatorname
HAVING count(*)=2; 	--销售了2单

不过需要注意的是,WHERE和HAVING也不是互相排斥的,也可以在一 个查询里面同使用WHERE和HAVING。

二、聚合函数

MySQL中有5种聚合函数较为常用,分别是:

  • 求和函数SUM)
    可以返回指定字段值的和。
  • 求平均函数AVG()
  • 最大值函数MAX()
  • 最小值函数MIN()
  • 计数函数COUNT()

先创建三个表,基于这三个表的基础上对聚合函数进行操作理解:

-- 创建销售明细表
CREATE TABLE demo.transactiondetails
(
transactionid INT NOT NULL,
itemnumber INT NOT NULL,
quantity INT,
price DECIMAL(10,2),
salesvalue DECIMAL(10,2),
-- 联合主键
PRIMARY KEY(transactionid,itemnumber)
);

销售明细表(transactiondetails):
在这里插入图片描述
销售单头表(transactionhead):
在这里插入图片描述
商品信息表(goodmaster):
在这里插入图片描述

1、SUM()

SUM () 函数可以返回指定字段值的和。我们可以用它来获得用户某个门店,每天、每种商品的销售总计数据:

SELECT
	LEFT(b.transdate, 10),  -- 从关联表获取交易时间,并且通过LEFT函数,获取交易的年月日
	c.goodsname,					  -- 从关联表获取商品名称
	SUM(a.quantity),				-- 数量求和
	SUM(a.salesvalue)				-- 金额求和
FROM
	demo.transactiondetails a
		JOIN
	demo.transactionhead b ON (a.transactionid = b. transactionid)
		JOIN
	demo.goodmaster c ON (a.itemnumber = c.itemnumber)
GROUP BY LEFT(b.transdate,10), c.goodsname				-- 分组
ORDER BY LEFT(b.transdate,10), c.goodsname;				-- 排序

查询结果:
在这里插入图片描述

这里引入了两个关键字:

  • LEFT(str, n):表示返回字符串str最左边的n个字符。
  • ORDER BY:表示按照指定的字段排序。

需要注意的是,求和函数获取的是分组中的合计数据,所以要对分组的结果有准确的把握,否则就很容易搞错。这也就是说,我们要知道是按什么字段进行分组的。

  • 如果是按多个字段分组,就要知道字段之间有什么样的层次关系;
  • 如果是按照以字段作为变量的某个函数进行分组的,就要知道这个函数的返回值是什么,返回值又是如何影响分组的等。

2、AVG()、MAX()、MIN()

AVG()
首先,我们来学习下计算平均值的函数AVG ()。它的作用是,通过计算分组内指定字段值的和,以及分组内的记录数,算出分组内指定字段的平均值。
举个例子,如果用户需要计算每天、每种商品,平均一次卖出多少个、多少钱,这个时候,我们就可以用到AVG () 函数了如下所示:

SELECT
	LEFT(a. transdate,10),
	c.goodsname,
	AVG (b.quantity),		-- 平均数量
	AVG (b.salesvalue)		-- 平均金额
FROM
	demo. transactionhead a
		JOIN
	demo. transactiondetails b ON (a.transactionid = b.transactionid)
		JOIN
	demo. goodmaster c ON (b.itemnumber = c.itemnumber )
GROUP BY LEFT(a. transdate,10) ,c.goodsname
ORDER BY LEFT(a. transdate,10) ,c.goodsname;

查询结果:
在这里插入图片描述
MAX()、MIN()
MAX()表示获取指定字段在分组中的最大值,MIN()表示获取指定字段在分组中的最小值。它们的实现原理差不多。

我们还是来看具体的例子。假如户要求计算每天里的一次销售的最大数量和最大金额,就可以用下面的代码,得到我们需要的结果

SELECT
	LEFT(a. transdate,10),
	MAX(b.quantity),
	MAX(b.salesvalue)
FROM
	demo. transactionhead a
		JOIN
	demo. transactiondetails b ON (a.transactionid = b.transactionid)
		JOIN
	demo. goodmaster c ON (b.itemnumber = c.itemnumber )
GROUP BY LEFT(a. transdate,10) ,c.goodsname
ORDER BY LEFT(a. transdate,10) ,c.goodsname;

注意,MAX (字段)这个函数返回分组集中最大的那个值。如果你要查询MAX (字段1)和MAX (字段2),而它们是相互独立、分别计算的,千万不要想当然地认为结果在同一条记录上。

3、COUNT()

通过COUNT (),我们可以了解数据集的大小,这对系统优化十分重要。

比如分页策略,这个策略能够实现的一个关键,就是要计算出符合条件的记录一共有多少条,之后才能计算出一共有几页、能不能翻页或跳转。

要计算记录数,就要用到COUNT()函数了。这个函数有两种情况。

  • COUNT (*) :统计一共有多少条记录;
  • COUNT (字段) :统计有多少个不为空的字段值。

COUNT (*)
如果COUNT (*)与GROUP BY 一起使用,就表示统计分组内有多少条数据。它也可以单独使用,这就相当于数据集全体是一个分组,统计全部数据集的记录数。

那么,如果超市经营者想知道,每天、每种商品都有几次销售,我们就需要按天、按商品名称,进行分组查询:

SELECT
	LEFT(a.transdate, 10), c.goodsname, COUNT(*) -- 统计销售次数
FROM
	demo. transactionhead a
		JOIN
	demo. transactiondetails b ON (a.transactionid = b.transactionid)
		JOIN
	demo. goodmaster c ON (b.itemnumber = c.itemnumber )
GROUP BY LEFT(a. transdate,10) ,c.goodsname
ORDER BY LEFT(a. transdate,10) ,c.goodsname;

运行结果:
在这里插入图片描述

COUNT (字段)
COUNT (字段)用来统计分组内这个字段的值出现了多少次。如果字段值是空,就不统计。
在这里插入图片描述
针对这个表:

  • 如果我们要统计字段"cashierNo" 出现了多少次,就要用到函数COUNT (cashierNo), 结果是3次;
  • 如果我们要统计字段"memberId" 出现了多少次,就要用到函数COUNT (memberId), 结果是1次。

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

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

相关文章

相交链表(双指针)

160. 相交链表 - 力扣(LeetCode) 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据…

#猫咪养护机模块功能分析

1.供电部分 AC转DC模块 220V交流转12V直流 系统的整体供电模块,可以直接接入220V交流电,并且输出12V直流电,12V直流电一方面供电给TB6600电机驱动板,一方面供电给PTC加热模块,还有一方面接入DCDC直流12转直流5V模块供…

定制Pro版研究区底图,为你的SCI论文增色!

研究区图(Research Area Map)是一种用于可视化学术研究内容所处地理位置的图表。论文中的研究区图不仅需要准确传达地理和地质数据,还应当在视觉上具有吸引力,以便更好地引起读者的兴趣。经常在高影响力的SCI论文中看到一些非常美…

半导体成品测试详述(Final Test,简称FT)

00、FT的一些概念 半导体成品测试(Final Test,简称FT)是在芯片封装完成后进行的最后一个测试阶段,其目的是确保芯片在实际应用中的性能和可靠性。FT测试可以包括环境测试、老化测试和应用特定的性能测试。 FT测试主要是为了解决各…

Stable Diffusion AI绘画宝典:从新手到高手,一图胜千言!

在这个数字化时代的浪潮中,人工智能技术以其惊人的创造力和创新性席卷全球。党的二十大报告把“实施科教兴国战略,强化现代化建设人才支撑”作为战略举措进行系统阐述,彰显我国不断发展新动能、新优势的决心和气魄。 Stable Diffusion是一款…

淘宝天猫玩具销售数据可视化

目录 背景描述数据说明数据来源1. 导入模块2. 乐高淘宝数据分析及其可视化2.1 乐高淘宝数据概览2.2 乐高淘宝数据处理2.3 乐高销量排名淘宝店铺Top502.4 乐高产地数量排名top502.5 天猫乐高价格分布2.6 不同价格区间的销售额整体表现分布2.7 淘宝乐高标题词云图 3. 乐高天猫旗舰…

06-java面向对象(中)封装与继承

6.1 封装 6.1.1 封装概述 1、为什么需要封装? 适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。 通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。 随着我们系统越来越复杂,…

SQL数据库管理开发工具:DataGrip 2024(win/mac)激活版

JetBrains DataGrip是一款专业的SQL数据库管理开发工具。DataGrip允许您以不同的方式发展模式以及执行信息查询,并提供服务本地文化历史问题记录,可以提高跟踪您的所有学生活动并保护如果您不选择丢失您的工作。DataGrip允许您通过建立相应的操作按名称就…

mPEG-NCO,mPEG-isocyanate常被用于修饰蛋白质、肽或其他具有这些基团的材料组

【试剂详情】 英文名称 mPEG-NCO,mPEG-isocyanate 中文名称 聚乙二醇单甲醚异氰酸酯, 甲氧基-聚乙二醇-异氰酸酯 外观性状 由分子量决定,粘性液体或固体粉末 分子量 400,1k,2k,3.4k,5k&a…

vscode格式化找不到使用...格式化文档

问题记录: 修改一年前的一个项目的时候,忽然发现vscode没有办法对项目进行合理的格式化,但凡保存,因为格式化问题几百个错刷屏。 问题排查: 开始以为是setting.json文件被我修改乱了,复制过来最开始保存的…

HackMyVM-Pwned

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirsearch wfuzz FTP ssh连接 提权 get user 系统信息收集 横向渗透 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, …

草柴返利APP如何查询领取天猫超市优惠券拿天猫超市购物返利?

草柴返利APP是一款购物省钱工具。通过草柴APP可查询到淘宝、天猫、京东隐藏的大额优惠券及购物返利。今天分享,如何使用草柴返利APP查询领取天猫超市商品的优惠券拿天猫超市购物返利。购物前先领券,确认收货后再拿返利; 草柴返利APP如何查询领…

带你读论文第十期:上海人工智能实验室、ICCVW最佳论文奖,钟怡然博士分享...

Datawhale论文 来源:WhalePaper,负责人:芙蕖 WhalePaper简介 由Datawhale团队成员发起,对目前学术论文中比较成熟的 Topic 和开源方案进行分享,通过一起阅读、分享论文学习的方式帮助大家更好地“高效全面自律”学习&…

读天才与算法:人脑与AI的数学思维笔记01_洛夫莱斯测试

1. 创造力 1.1. 创造力是一种原动力,它驱使人们产生新的、令人惊讶的、有价值的想法,并积极地将这些想法付诸实践 1.2. 创造出在表面上看似新的东西相对容易 1.3. 在遇到偶然间的创造性行为时,都会表现得异…

多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量…

10分钟学会提示词工程

以下是我制作ppt的截图,更多内容可以下载对应ppt自己学习哈~

zabbix解析以及安装

目录 目录 zabbix 是什么? 监控主要功能 zabbix 监控原理: zabbix运行机制 Zabbix的监控方式 Zabbix监控系统监控对象 Zabbix的优缺点 Zabbix的缺点 zabbix主要特点 zabbix 监控部署在系统中,包含常见的五个程序: 监控的架构 3.maste…

WebApis知识总结以及案例(续3)

综合案例 小兔鲜页面注册 分析业务模块 发送验证码模块 用户点击之后,显示05 秒后重新获取 时间到了,自动改为重新获取 //1.发送短信验证码模块const codedocument.querySelector(.code)let flagtrue//通过一个变量来控制 节流阀 // 1.1 点击事件co…

布局香港之零售中小企篇 | 传承之味,迈向数字化经营的时代

随着内地与香港两地经贸合作日渐紧密,越来越多内地消费品牌将目光投向香港这片充满机遇的热土,纷纷入驻香港市场。「北店南下」蔚然成风,其中不乏已在内地市场深耕多年的传统老字号。数字化经营时代,老字号焕新刻不容缓&#xff0…

Vue3 笔记

vue3笔记 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options API…
最新文章