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

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

聚合函数

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呈现效果

内容概要 本资源是一套完整可运行的 Qt Widgets 批量图片压缩桌面工具源码,基于 Qt5/C++ 从零开发,专为初学者设计,分步实现图片批量处理全套功能。工具支持多选单张图片、直接读取整个文件夹内所有 JPG/PNG 图像,可自定义输出图片分辨率、调节 JPG0~100 区间压缩质量,自带锁定宽高比防拉伸变形功能;批量处理完成后自动统计每张图片压缩前后文件体积,计算整体压缩缩小比例,直观展示压缩效果。 适用人群 Qt/C++ 零基础初学者,学习 QImage 图像绘图、文件目录遍历、UI 交互开发; 需要本地批量处理图片的办公、设计、自媒体从业者; 想要学习图片缩放、JPG 压缩、本地文件 IO、进度条交互的开发学习者。 使用场景 自媒体批量压缩配图,降低图片体积节省上传流量; 摄影、设计批量统一图片尺寸,批量轻量化相册图片; 程序开发学习:QFileDialog 文件选择、QDir 文件夹遍历、QImage 缩放保存、QSlider 参数联动、批量循环界面防卡顿、文件大小格式化转换全套 Qt 图像开发实战案例。 工具核心功能清单 双模式导入图片:手动多选单张图片 / 一键读取整个文件夹全部图片; 自定义输出宽高分辨率,支持锁定原始宽高比,避免图片拉伸变形; 滑块调节 JPG 压缩质量 0~100,平衡图片清晰度与文件占用大小; 自定义输出保存目录,批量生成压缩后的图片文件; 实时进度条展示处理进度,循环中刷新界面,程序不会假死卡顿; 自动统计每张图片压缩前后体积,换算 KB/MB 直观展示; 批量完成弹窗汇总:图片总数、成功数量、单张大小对比、整体压缩节省空间比例; 完整模块化代码,功能拆分清晰,每段代码附带详细注释,新手可分步拆解学习。 其他说明 开发环境:Qt Creator + Qt5.15 MSVC,Windows 平台可直接编译运行; 源码结构清晰,功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值