四,聚合函数

SQL中,常用的聚合函数有SUM(总和)、MAX(最大值),MIN(最小值),AVG(平均值)以及COUNT(计数)。
聚合函数是对一组数据(一列或多列)进行处理,返回单个结果;而普通函数则通常是对一组数据中的每条记录进行处理,返回的是一组结果……

4.1 简单的聚合函数

注意1:

SUM、AVG参数支持的类型:数值 和 ‘数值’

注意2:

以下聚合函数都是忽略NULL值的
SELECT SUM(销售数量) FROM 销售表;
SELECT AVG(销售数量) FROM 销售表;
SELECT MAX(销售数量) FROM 销售表;
SELECT MIN(销售数量) FROM 销售表;
SELECT COUNT(销售数量) FROM 销售表;
SELECT SUM(销售数量) AS 求和,AVG(销售数量) AS 求平均,MAX(销售数量) AS 最大值,MIN(销售数量) AS 最小值,COUNT(销售数量) AS 计数 FROM 销售表;
image.png

与Distinct搭配:【不建议使用,因为每次它会对字段做判断,判断是否为空,会浪费时间】 较多时候,Count(distinct 字段名) 配合使用,计算字段非重复值的个数

搭配【推荐使用】 以后提到个数,你就优先想到Count()
Count(*) 用来统计表中的总行数,比Count(distinct 字段名)用的时候要多一些,它的优点是只要有一列这一行中有数据不为空就计1次数,所有列这一行全为 空就不计数了。

与常量值(例如1)搭配
Count(1) 相当于在表的最左侧新建了一个虚拟列,你自己看不到,但是他用这个列计算行数

重点:以上函数查出来都是一个值,所以注意和以上函数一同查询的字段要求是group by后的字段(后面会详细讲)

4.2 分组聚合函数GROUP BY

切记: SELECT 后面的字段,必须是group by后出现的字段。条件和排序可以省略

例如:我们查询每家店铺的销售数量
image.png
可以使用group gy子句将表中的数据分成若干组 切记:
语法:
SELECT 字段名,聚合函数(字段名) FROM 表名
WHERE 条件
GROUP BY 分组表达式
ORDER BY 字段名;

4.2.1 基础应用 image.png

4.2.2 HAVING与WHERE子句

HAVING与WHERE子句:
(1)HAVING在分组后使用,WHERE在分组前使用
(2)运算顺序:WHERE优先于HAVING
(3)作用对象不同,WHERE只作用于表,而HAVING作用于GROUP BY子句的分组结果,如果不存在GROUP BY子句,则作用于WHERE子句的搜索结 果,如果WHERE子句也不存在,则直接作用于表。

(4)计算对象不同,HAVING是用于组的计算,WHERE则计算指定字段的每条记录。
(5)孙兴华总结:凡是表里没有这个字段的时候(你自造的字段)必需用HAVING。否则建议用WHERE,因为根据计算规则,它的性能更优。

例1:2020年1月1日这一天,各店铺最小销售数量

SELECT 店号,MIN(销售数量) AS 最小销售量 FROM 销售表 WHERE 日期 = ‘2020-01-01’ GROUP BY 店号; image.png

例2:哪个小类的商品个数大于2 (提到个数先想到哪个函数?)

count()>2 但是他不能做where子句条件,因为哪家表里都没有count()这个字段,
详见(4)
SELECT 小类名,COUNT() AS 商品个数 FROM 商品表 GROUP BY 小类名 HAVING COUNT()>2;
条件这个字段不存在于这张表中的时候,我们使用HAVING,如果存在,那么WHERE
image.png

例3:查询每个店铺2020年1月1日至1月3日最高销量大于250

SELECT 店号,MAX(销售数量) AS 最大销量
FROM 销售表
WHERE 日期 BETWEEN’2020-01-01’ AND ‘2020-01-03’ GROUP BY 店号

HAVING 最大销量>250;

4.2.3 按表达式和函数分组

语法:
SELECT 字段名,聚合函数(字段名) AS 别名 FROM 表名
WHERE 条件
GROUP BY 函数(字段名) # sum(销售数量)

ORDER BY 字段名;
也支持别名,如果函数名(字段名)特别长,建议使用别名

4.2.4 按多个字段分组

例如:每个商品,每一天的销售数量

SELECT 日期,商品编码,销售数量 FROM 销售表
GROUP BY 日期,商品编码
ORDER BY 销售数量 DESC;
image.png

总结1:按多个字段分组,只需要把多个字段放在GROUP BY后面用逗号隔开
总结2:按多个字段分组,只需要把多个字段放在GROUP BY后面用逗号隔开

4.3 MySQL中的TopN 前几名

目前的版本中MySQL中没有这个关键字,但是SQL Server中有
在 SQL Server中,查询前几名,是这样的语法:SELECT TOP n 字段名 FROM 表名 WHERE… ORDER BY…
在MySQL中,查询前几名使用 LIMIT 名次 一定要放在最后面使用,LIMIT不只这一个功能,其它功能以后再讲

例如:查询每家店铺,所有日期区间内,总销量的前3名。
SELECT 店号,SUM(销售数量) AS 销售总量 FROM 销售表 GROUP BY 店号 ORDER BY 销售总量 DESC LIMIT 3;

切记:使用limit排名时,一定要先排序

4.4 分页

分页的作用:节省内存空间,但是图片一般使用瀑布流(百度图片)。可是文本,数据都会使用分页。
image.pngimage.png

4.5 SELECT语法结构和运算顺序

4.5.1 语法结构

SELECT [DISTINCT] 字段名 FROM 表名 [WHERE] 条件筛选
[GROUP BY] 分组
[HAVING] 分组筛选

[ORDER BY] 排序 [LIMIT] 名次或分页

4.5.2 运算顺序

(1)首先运算的是FROM子句,根据FROM子句中指定的一个或多个表创建工作表。
(2)如果存在WHERE子句,则WHERE子句对步骤1获得的工作表进行条件筛选,删除不符合条件的记录。
(3)如果存在GROUP BY子句,则对步骤2生成的结果表按指定字段进行分组,生成一份新的结果表。
(4)如果存在HAVING子句,则对步骤3的结果表按指定条件进行筛选,删除掉不满足筛选条件的记录。
(5)执行SELECT子句,删除不包含在SELECT 字段名 ,所指定的字段。如果SELECT子句中包含关键字DISTINCT,则执行去重复运算……
(6)如果有ORDER BY子句,则按指定的排序规则对结果表进行排序操作。
(7)如果需要找前几名,用LIMIT 名次

三、总结

(1)来自哪张表
(2)where筛选条件
(3)[GROUP BY] 分组
(4)[HAVING] 分组筛选
(5)排序
(6)名次或分页





















  1. <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br />