MySQL基础学习---6、聚合函数

文章详细介绍了SQL中的聚合函数,如AVG、SUM、MIN、MAX和COUNT的用法,以及GROUPBY用于数据分组和HAVING用于过滤分组的概念和区别。同时,阐述了SQL查询的执行过程,包括FROM、WHERE、GROUPBY、HAVING、ORDERBY和LIMIT的关键字顺序及其作用。
摘要由CSDN通过智能技术生成

1、聚合函数

1.聚合函数介绍
聚合函数作用于一组函数,并对一组数据返回一个值。

在这里插入图片描述

2.聚合函数语法
select [column,] group function(column),...
from table
[where condition]
[group by column]
[order by column];
3.聚合函数类型
3.1 AVG()和SUM()函数
可以对数值型数据使用AVG()和SUM()函数。

举例:
在这里插入图片描述

3.2 MIN()和MAX()函数
可以对任意数据类型使用MIN()和MAX()函数。

举例:
在这里插入图片描述

3.3 Count()函数
count(*) 返回表中记录总数,适用于任意数据类型
count(expr) 返回expr不为空的记录总数。

举例:
在这里插入图片描述
在这里插入图片描述

2、GROUP BY

将表中的数据分成若干组
明确:1、where一定放在from后面!!!
		2、在select列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中。
		3、包含在GROUP BY子句中的列不必包含在Select列表中。
2.1 基本使用(只用一个分组)

举例:
在这里插入图片描述

2.2 使用多个列分组

举例:
在这里插入图片描述

3、HAVING

过滤分组的作用
注意:
	1、行已经被分组
	2、使用了聚合函数
	3、满足HAVING子句中条件的分组将被显示
	4、HAVING不能单独使用,必须要跟GROUP BY 一起使用
3.1 基本使用

举例:
在这里插入图片描述
注意:不能再where子句中使用聚合函数

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

4、Select的执行过程

4.1 查询的结构
方式1:
	select ...,...,...
	from ...,...,...
	where 多表的连接条件
	AND 不包含组函数的过滤条件
	group by ...,...
	order by ...ASC/DESC
	limit ...,...;

方式2:
	select ...,...,...
	from ... join ...
	on 多表的连接条件
	join...
	on...
	where 不包含组函数的过滤条件
	AND/OR 不包含组函数的过滤条件
	group by ...
	having 包含组函数的过滤条件
	order by ...ASC/DESC
	limit...,...
其中:
	1、from:从哪些表筛选
	2、on:关联多表查询时,去除笛卡尔积
	3、where:从表中的筛选条件
	4、group by:分组依据
	5、having:在统计结果中再次筛选
	6、order by:排序
	7、limit :分页
4.2 查询的顺序
1、关键字的顺序是不能颠倒的
select ...from...where...order by...having...order by ...limit...
2、select语句实际的执行顺序
from->where->group by->having->select字段->distinct->order by ->limit
4.3 SQL的执行原理
select是先执行FROM这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
		1、首先通过CROSS JOIN求笛卡尔积,相当于得到虚拟表vt(virtual table)1-1;
		2、通过ON进行筛选,在虚拟表vt-1的基础上进行筛选,得到虚拟表vt1-2;
		3、添加外部行。如果我们使用的是左连接、右连接或者全连接,就会涉及到外部行,也就是在虚拟机表vt1-2的基础上增加外部行,得到虚拟表vt1-3.
如果我们操作的事两张以上的表,还会重复上面的步骤,直到所有的表被处理完为止。这个过程的得到是我们的原始数据。
然后进入第三步和第四步,也就是GROUP BY和HAVING阶段。在这个阶段中,实际上是虚拟表vt2的基础上进行分组和过滤,得到中间的虚拟表vt3和vt4。
	当我们完成了条件筛选部分之后,就可以按照筛选表中提前的字段,也就是进入到select和distinct阶段。
	首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表vt5-1 和 vt5-2 。
当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段 ,得到虚拟表 vt6 。
最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段 ,得到最终的结果,对应的是虚拟表vt7 。
当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略。同时因为 SQL 是一门类似英语的结构化查询语言,所以我们在写 SELECT 语句的时候,还要注意相应的关键字顺序,所谓底层运行的原理,就是我们刚才讲到的执行顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光下的赶路人star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值