Mysql学习笔记(6)—— 聚合函数 及 GROUP BY

本文详细介绍了MySQL中的聚合函数,如AVG、COUNT、DISTINCT的使用方法及其特点。重点讲解了AVG在处理数值和NULL值时的行为,以及COUNT对非NULL值的计数。同时,通过示例阐述了GROUP BY语句的用法,包括如何根据多个列进行分组,以及与HAVING的区别。文中强调了WHERE和HAVING在不同阶段筛选数据的差异,指出在能够使用WHERE的情况下应优先选择WHERE以提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聚合函数

AVG()需注意两点
AVG针对数值型数据做操作,对字符串虽然没有抛出异常,但为0值,没有实际含义。
AVG计算有空值的数据时,会把NULL扔掉,总数会相应减少。

COUNT()
COUNT返回的是非NULL值的所有值的计数。

聚合函数特点:对多列进行操作,操作之后返回一行值

SELECT SUM(Price),SUM(SqFt),SUM(Neighborhood)
FROM `house-prices`

在这里插入图片描述
DISTINCT与集合函数的结合运用
DISTINCT相当于去重, COUNT相当于计数

SELECT COUNT(DISTINCT Price)
FROM `house-prices`

在这里插入图片描述
判断是否有重复值,可以用SUM和DISTINCT结合来判断

SELECT SUM(DISTINCT SqFt),SUM(SqFt)
FROM `house-prices`

在这里插入图片描述
如果两个数不相等,就可以说明有重复值

另外可参考这篇博客
MySQL 聚合函数

GROUP BY

SELECT Bedrooms,COUNT(*)
FROM `house-prices`
GROUP BY Bedrooms;

根据Bedrooms的数量(2,3,4,5)类别,来分别统计各自的房子数量。

在这里插入图片描述
如果有NULL,也会当作一个类来进行统计

SELECT Price ,COUNT(*)
FROM `house-prices`
GROUP BY Price;

在这里插入图片描述

SELECT Bedrooms, Bathrooms, COUNT(*)
FROM `house-prices`
GROUP BY Bedrooms, Bathrooms;

想要根据Bedrooms和Bathrooms来计算相应的房子数,那在GROUP BY后面就要两个都写上,不能只写一个
在这里插入图片描述

SELECT Bedrooms as Br, Bathrooms, COUNT(*)
FROM `house-prices`
GROUP BY Br, Bathrooms;

在这里插入图片描述
现在可能由于版本更新可以GROUP BY 后面写别名了,但是仍旧不建议这么写

GROUP BY不会自动做排序

SELECT Bedrooms, COUNT(*)
FROM `house-prices`
WHERE COUNT(*) > 20
GROUP BY Bedrooms;

选择按Bedrooms分类下大于20的房子数,发现这样写报错
这里不应该用WHERE,应该用HAVING

SELECT Bedrooms, COUNT(*)
FROM `house-prices`
GROUP BY Bedrooms
HAVING COUNT(*) > 20;

在这里插入图片描述
所以这里应该能明白,WHERE是对初始的表的行进行筛选的,而我们现在想选择的是分组之后显示的数据表,然后再对行进行筛选,也就是对分组后结果进行筛选。

如果是这样极端的筛选,这时结果是一样的,但更推荐用WHERE,HAVING是对GROUP BY分组之后进行的筛选,主要是执行顺序的差异,WHERE是在GROUP BY之前执行的,性能和运算速度会提高,所以能在原始数据筛选的就首选WHERE,分组之后才能筛选的就用HAVING。

SELECT Bedrooms, COUNT(*)
FROM `house-prices`
WHERE Bedrooms = 2
GROUP BY Bedrooms;
SELECT Bedrooms, COUNT(*)
FROM `house-prices`
GROUP BY Bedrooms
HAVING Bedrooms = 2;

在这里插入图片描述
HAVING 的参数一般是GROUP BY中的字段名,另外还可以有聚合函数

SELECT Bedrooms, SUM(Price)
FROM `house-prices`   
GROUP BY Bedrooms
HAVING COUNT(*) > 2;

首先按照Bedrooms分组,然后计数所有Bedrooms>2的房间数,并根据价格求和。这里没有SELECT COUNT(*),所以不会显示分组后计数的房间数。

ORDER BY 后面可以接合理的聚合函数,GROUP BY中出现的字段,SELECT 中出现的字段

SELECT Bedrooms, SUM(Price)
FROM `house-prices`
GROUP BY Bedrooms
ORDER BY SUM(Price);

在这里插入图片描述
当然,还有另外的情况,ORDER BY中接SELECT中没有的字段,这是就要把聚合函数删除了,因为聚合函数的基础是在GROUP BY的基础之上的。

SELECT Bedrooms
FROM `house-prices`
ORDER BY Bathrooms;

在这里插入图片描述
SELECT语句的执行顺序,例如

SELECT Bedrooms,COUNT(*)
FROM `house-prices`
WHERE Bathrooms = 2
GROUP BY Bedrooms
HAVING COUNT(*) > 20
ORDER BY Bedrooms;

在这里插入图片描述
首先执行FROM
其次执行WHERE,也就是筛选条件
再执行GROUP BY,分组
分组之后执行HAVING来过滤条件
过滤之后再SELECT,选择呈现的字段
最后ORDER BY呈现效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值