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

这篇具有很好参考价值的文章主要介绍了MySQL学习笔记3——条件查询和聚合函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、条件查询语句

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):
MySQL学习笔记3——条件查询和聚合函数,mysql,学习,笔记
销售单头表(transactionhead):
MySQL学习笔记3——条件查询和聚合函数,mysql,学习,笔记
商品信息表(goodmaster):
MySQL学习笔记3——条件查询和聚合函数,mysql,学习,笔记

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;				-- 排序

查询结果:
MySQL学习笔记3——条件查询和聚合函数,mysql,学习,笔记

这里引入了两个关键字:

  • 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;

查询结果:
MySQL学习笔记3——条件查询和聚合函数,mysql,学习,笔记
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;

运行结果:
MySQL学习笔记3——条件查询和聚合函数,mysql,学习,笔记

COUNT (字段)
COUNT (字段)用来统计分组内这个字段的值出现了多少次。如果字段值是空,就不统计。
MySQL学习笔记3——条件查询和聚合函数,mysql,学习,笔记
针对这个表:文章来源地址https://www.toymoban.com/news/detail-853077.html

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

到了这里,关于MySQL学习笔记3——条件查询和聚合函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MySQL】聚合函数与分组查询

    MySQL中的聚合函数用于对数据进行计算和统计,常见的聚合函数包括下面列举出来的聚合函数: 查看班级有多少同学 统计数学成绩有多少个 统计英语不及格的人数 查看数学成绩的总和 统计英语不及格的分数总和 统计不及格的英语的平均分不需要上面那么麻烦自己手动除:

    2024年02月14日
    浏览(31)
  • Mysql 数据库DQL 数据查询语言 SELECT 基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询——包含DQL所有查询语句。吐血分享。

    DQL:数据查询语言; 用来对表内的数据进行查找 。Database Query Language SQL语句分为:基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询。  可以发现name字段就只剩下一个张三了;   条件: 条件查询—比较运算符 比较运算符 功能 大于 = 大于等于 小于 = 小于等

    2024年01月19日
    浏览(45)
  • MySQL 时间日期函数,流程控制函数,加密解密函数以及聚合查询函数

    注:本文仅作为查找函数和部分理解使用,希望能给大家带来帮助 以下函数均可以使用 重点记忆前三个红色标注的函数, 第一个函数返回值如2024-01-02的形式 第二个如 15:20:21 第三个则是两者追加 如: 2024-01-02 15:20:21 注:注意 DAYOFWEEK 和 WEEKDAY 的区别   相当于取date的某个单独的字

    2024年01月23日
    浏览(37)
  • 【MYSQL】聚合函数和单表/多表查询练习、子查询、内外连接

    目录 1.聚合函数 1.1.group by子句 1.2.having语句 2.单表查询  2.2单表查询 3.多表查询  3.2.子查询 5.内链接 6.外连接 函数 说明 count 返回查询到的数据的数量 sum 返回查询到的数据的总和 avg 返回查询到的数据的平均值 max 返回查询到的数据的最大值 min 返回查询到的数据的最小值

    2024年02月04日
    浏览(33)
  • MySQL IF()函数:在查询中灵活应用条件逻辑

    在数据库查询中,我们经常需要根据条件逻辑来选择返回不同的结果。MySQL提供了强大的 IF() 函数,使得在查询语句中应用条件逻辑变得非常简单和灵活。本篇文章将深入探讨MySQL的 IF() 函数,并展示如何在查询中利用它来进行条件判断和结果选择。 MySQL的 IF() 函数允许我们根

    2024年02月16日
    浏览(31)
  • SQL-条件查询与聚合函数的使用

     🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页: 小小恶斯法克的博客 🎈该系列文章专栏: 重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏 📜 感谢大家的关注! ❤️ 目录 DQL-条件查询 1.语法

    2024年01月23日
    浏览(33)
  • MYSQL学习——聚合函数

    目录 1. 聚合函数介绍 1) AVG和SUM函数 2) MIN和MAX函数 3) COUNT函数 2. GROUP BY 1) 基本使用 2) 使用WITH ROLLUP 3. HAVING 1) 基本使用 2) WHERE和HAVING的对比 4. SELECT的执行过程 1) 查询的结构 2) SQL的执行原理 什么是聚合函数 聚合函数作用于一组数据,并对一组数据返回一个值。 聚合函数类型

    2024年01月21日
    浏览(29)
  • MySQL数据库增删改查及聚合查询SQL语句学习汇总

    目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table   查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的函数:now()  查询 查询表作列与列之间进

    2024年02月09日
    浏览(66)
  • MySQL --- 聚合查询 和 联合查询

    下文中的所有 聚合查询 的示例操作都是基于此表: 聚合函数都是行与行之间的运算。 count() select count(列名) from 表名; 统计该表中该列的行数,但是 null 值不会统计在内, 但是如果写为 count(*) 那么 null 也会算进去( 就算一整行都是 null 也会算进去 ) 例如我们暂时使用这个

    2024年02月08日
    浏览(28)
  • 【MySQL】进阶查询-聚合查询和联合查询

    文章主要围绕着以下三个问题: group by的作用 where与having的区别 表的连接分为哪些,分别是什么作用 在创建数据表时,我们通常时根据需求找到\\\"实体\\\", 梳理\\\"实体\\\"之间的关系,从而进行创建. \\\"实体\\\"之间可能会有以下几种关系:1.没关系 2.一对一 3.一对多 4.多对多. 没关系应该是最好

    2023年04月11日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包