[Mysql] GROUP BY分组

news/2023/11/29 6:39:17

练习案例数据

DROP TABLE IF EXISTS purchase_info; 
CREATE TABLE purchase_info( 
commodity_id VARCHAR(8), 
category VARCHAR(16), 
colour VARCHAR(16),
purchase_quantity INT, 
purchase_date DATE 
) 
ENGINE = InnoDB 
DEFAULT CHARSET = utf8; 
INSERT INTO 
purchase_info 
(commodity_id,category,colour,purchase_quantity,purchase_date) 
VALUE ('c001','clothing','black',150,'2020-04-25') 
,('c002','clothing','white',50,'2020-04-05') 
,('c003','shoes','white',500,'2020-03-23') 
,('c004','shoes','red',200,'2020-04-07') 
,('c005','clothing','blue',120,'2020-04-15')
,('c007','clothing',NULL,NULL,'2020-04-15');

purchase_info表(商品进货信息表)


分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算 

分组是在SELECT语句的GROUP BY子句中建立

1.GROUP BY创建分组

GROUP BY的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组

GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集

使用GROUP BY的重要规定:

1.GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制,如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总

2.GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚合函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名

3.除聚合函数外,SELECT语句中的每个列都必须在GROUP BY子句中给出

4.如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组

5.GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前

问题1:分组统计不同类别商品的平均进货量

SELECT category, AVG(purchase_quantity)
FROM purchase_info
GROUP BY category;

结果展示:

这里的GROUP BY category表示根据category列分组,然后计算每组的AVG(purchase_quantity)

问题2:根据category列和color列分组统计平均进货量(多列分组)

SELECT category,colour,AVG(purchase_quantity)
FROM purchase_info
GROUP BY category,colour;

结果展示:

由于colour列值存在Null,因此结果中会出现包含Null的记录;在上表中,由于没有category列值和colour列值都相同的记录,因此根据category列和colour列分组统计之后的数据条数还是和原始表的数据条数相同,都是6条

扩展

1.GROUP BY可用于单个字段分组,也可用于多个字段分组

2.多列分组:多列取值都相同则为一组 

3.GROUP BY易错点

当存在GROUP BY时,使用SELECT查询出来的字段必须出现在GROUP BY之后,或者以聚合函数的形式出现

问题3:根据category列和purchase_date列分组统计总进货量

SELECT category,purchase_date,SUM(purchase_quantity)
FROM purchase_info
GROUP BY category;

上述代码运行后会得不到问题3所需要的结果,需要将上述代码进行修正

SELECT category,purchase_date,SUM(purchase_quantity)
FROM purchase_info
GROUP BY category,purchase_date;

结果展示:

2.使用HAVING过滤分组

过滤分组,规定包括哪些分组,排除哪些分组

对分组后的组进行过滤可以使用HAVING,并且需要将其写在GROUP BY部分之后

HAVING支持所有运用在WHERE上的操作符

HAVING语句与WHERE语句的区别

1.WHERE语句用于对行进行过滤,HAVING语句对分组后的组进行过滤

2.WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤

3.WHERE排除的行不包括在分组中

问题4:筛选出按照商品类别分组后,组成员个数大于3的平均进货量

SELECT category,AVG(purchase_quantity)
FROM purchase_info
GROUP BY category
HAVING COUNT(*) > 3;

结果展示:

原始表中的商品类别为shoes的记录只有两条,不满足组成员个数大于3的要求,而商品类别为clothing的记录有4条,满足上述要求,则分组后会被筛选出来进行聚合计算 

3.分组排序

问题5:查询平均价格最高的3种商品的颜色

SELECT colour,AVG(purchase_quantity)
FROM purchase_info
GROUP BY colour
ORDER BY AVG(purchase_quantity) DESC
LIMIT 3;

结果展示:

先使用GROUP BY,再使用ORDER BY,最后使用LIMIT限制返回的结果行数

注意:上述方法有一个缺陷,如果出现平均价格相同且并列第3名的情况,则查询结果应当是所有前3名的信息(即返回超过3条数据),解决该类问题可以使用排序类窗口函数

扩展

使用分组排序常用题型:"总订单金额最多的n个商品","总订单金额最多的n个客户"等 


http://www.ppmy.cn/news/688583.html

相关文章

微信小程序类ExpandableListView分组实现

效果图 小程序分组实现。 实现 代码结构如下图图: 文件目录说明如下: │ app.js │ app.json │ app.wxss │ project.config.json │ ├─constants │ restApi.js //存放api │ ├─images //图片 │ arrow-down.png …

微信公众平台如何给粉丝分组打标签?

公号粉丝自动打标签的5种类型 1、关键词自动打标签(小程序或公号) 2、根据关注条件自动打标签(公号) 3、输入openid自动打标签(公号) 4、根据点击菜单自动打标签(公号) 5、渠道二维…

group by 如何自定义规则分组,合并分组

sql语句 group by时如何自定义规则进行分组 1. 问题描述 最近开发项目时遇到了一个需求:统计不同类型的物品的数量,但是某几种类型要合并到一起进行统计,例如:有A,B,C,D,E,F,G其中类型,但是统计时ACD合计为一种&…

使用List进行分组操作

普通对象列表进行分组 // 创建一个实体类 Data public class People {String name; //姓名Integer age; //年龄Integer sex; //性别 0 - 女; 1 - 男Double height; //身高Double weight; //体重 }public class ListGroupTest {public static void ma…

排序和分组

Python序列操作之进阶篇 转载 更新时间:2016年12月08日 09:31:59 投稿:daisy 我要评论 序列sequence是python中最基本的数据结构,本文是Python序列操作的进阶篇,本文先对序列做一个简单的概括&#…

微信公众号【用户分组管理-web页面】

人生的意志和劳动将创造奇迹般的奇迹。 Model层实体类: public class UserList{public string total { get; set; }public string count { get; set; }public userlistopenid data { get; set; }public string next_openid { get; set; }}public class userlistopenid{public …

分组、分类(分组汇总)

分类一: GROUP BY (PRODUCT,FLOOR); COL1COL2countsumAA115AA214BB113 分类二: GROUP BY ROLLUP (Col1,Col2); COL1COL2countsum备注AA115AA214A(null)29 (每一组COL2的综合) BB113B(null)13 (每一组COL2的综合) (null)(null…

2.分组列表

分组列表 sqlite3 /var/lib/murmur/murmur.sqliteserver_id,channel_id,parent_id,name,inheritaclinsert into channels values(1,2,0,2-分组,1); 来源张永光的博客

微信公众号平台如何批量给粉丝自动打标签分组

关于微信公众号平台批量给粉丝自动打标签分组功能,第三方工具微号帮提供了功能粉丝分组批量转移实现,可以在线给公众号所有粉丝自动分组打标签,公众号粉丝批量打标签分组,与公众号平台后台用户管理功能数据同步,公众号…

分组 (group)

题目描述: Yyx 给 KZB 出了一道题,就是给出n和m(m≤n),叫 KZB 求出n个相同的杯子分m组,一共会有几种分法。 KZB 已经在失败中吸取了教训他特意叫你来帮帮他。 因为 Yyx 不喜欢去模1055之类的那太小了,所以他她要你对取…

List分组的两种方式

java8之前List分组 假设有个student类&#xff0c;有id、name、score属性&#xff0c;list集合中存放所有学生信息&#xff0c;现在要根据学生姓名进行分组。 public Map<String, List<Student>> groupList(List<Student> students) {Map<String, List&…

如何对微信订阅公众号用户进行打标签分组管理

为了实现微信订阅公众号用户进行打标签分组管理&#xff0c;第三方平台微号帮提供了粉丝分组批量转移功能实现&#xff0c;可以对微信公众号用户批量打标签分组&#xff0c;通过功能自动与公众号后台用户管理功能数据同步&#xff0c;可以设置按照指定条件提交用户打标签分组任…

通讯录新建分组功能php,微信通讯录分组怎么设置

1在通讯录里找到“标签”并点击2可通过图中两种按钮新建标签3选择要新建分组中的好友&#xff0c;选择完毕后点右上角的“确定”4可编辑分组名、添加和删除分组成员5完成后分组列表会显示在标签里&#xff0c;之后仍可点击右上角的新建创建新分组6也可以长按已有分组&#xff0…

分组是什么?

1.报文(message) 我们将位于应用层的信息分组称为报文。报文是网络中交换与传输的数据单元&#xff0c;也是网络传输的单元。报文包含了将要发送的完整的数据信息&#xff0c;其长短不需一致。报文在传输过程中会不断地封装成段、包、帧来传输&#xff0c;封装的方式就是添加控…

Group by 分组详解

先来看下表1&#xff0c;表名为test&#xff1a; 表1 执行如下SQL语句&#xff1a; 1 2 SELECT name FROM test GROUP BY name 你应该很容易知道运行的结果&#xff0c;没错&#xff0c;就是下表2&#xff1a; 表2 可是为了能够更好的理解“group by”多个列“和”聚合函数“…

微信公众号怎么实现批量标签分组粉丝好友管理

当下&#xff0c;微信公众号实现批量标签分组粉丝好友管理&#xff0c;微号帮提供了粉丝分组批量转移在线功能实现&#xff0c;快速为公众号粉丝分组标签&#xff0c;通过功能批量给公众号粉丝打标签分组&#xff0c;且自动与公众号平台用户管理功能数据同步;公众号粉丝管理能实…

IP分组

IP分组格式 协议版本&#xff1a;0100表示IPv4 &#xff0c;0110表示IPv6 报头长度&#xff1a;IP头部有多长&#xff08;字节&#xff09;&#xff0c;4bits&#xff08;0101~1111&#xff09; 服务类型&#xff1a;8bits&#xff0c;目前基本没怎么使用&#xff0c;表示该分…

微信公众号已关注用户能分组吗?怎么分?

实现微信公众号已关注用户分组&#xff0c;微号帮提供了粉丝分组批量转移功能实现&#xff0c;可以实现公众号在线给用户分组&#xff0c;将用户分组条件设置好通过功能提交给微号帮&#xff0c;微号帮自动进入后台处理任务&#xff0c;批量给公众号用户分组&#xff0c;与公众…

如何合理利用微信分组做好微信好友的管理

随着微信在人们生活中的普遍化&#xff0c;很多的企业和微商都进军这里&#xff0c;希望在新的领域中打开销路&#xff0c;扩大推广范围&#xff0c;那么微信管理就变成了一个最基本最重要的事情。物以类聚&#xff0c;人以群分&#xff0c;我们永远只能为一小部分人服务&#…

微信群发可以分组吗?群组标签分组设置

当然可以&#xff0c;我知道有一个工具webot社群助手可以这么做&#xff0c;这个工具其中有一个基础功能就是群发信息和标签管理&#xff0c;群发是微信营销中常用到的一个功能&#xff0c;但是群发怎么发也很关键&#xff0c;有时候我们群发的消息只是针对特定的人群&#xff…
最新文章