练习案例数据

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个客户"等

[Mysql] GROUP BY分组相关推荐

  1. mysql 组内分组_[MySQL] group by 分组并进行组内排序取得最新一条

    有一个需求是获取指定用户发送的最新的内容,这个时候需要使用group by分组功能 但是怎么获取最新的呢 ? 如果直接进行order by 是不能实现的,因为MysqL会先执行group by 后执行 ...

  2. mysql group by 分组查询

    分组的SQL语句有2个: group by 和分组聚合函数实现 partition by (oracle和postgreSQL中的语句)功能 group by + having 组合赛选数据 注意:h ...

  3. Mysql Group by 分组取最小的实现方法

    表结构如下图: 字段说明:id自增列,name姓名,age年龄, grade班级ID 想到得的结果如下图: 需求描述:取出每个班里年龄最小的用户 SQL如下: SELECT * FROM (SELEC ...

  4. mysql单列去重复group by分组取每组前几条记录加order by排序

    <div class="post"><h1 class="postTitle"><a id="cb_post_title ...

  5. mysql如何进行分组操作的_mysql group by 对多个字段进行分组操作

    在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据. 比如有一个学生选课表,表结构如下: Table: Subject_Selection ...

  6. MYSQL GROUP BY 对多个字段进行分组

    在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_SelectionSu ...

  7. MYSQL  GROUP BY 对多个字段进行分组

    在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_SelectionSu ...

  8. mysql group by 聚合_浅析MySQL使用 GROUP BY 分组聚合与细分聚合

    1. 聚合函数(Aggregate Function) MySQL(5.7 ) 官方文档中给出的聚合函数列表(图片)如下: 除非另有说明,否则聚合函数都会忽略空值(NULL values). 2. 聚 ...

  9. mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)

    mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)_toString的博客-CSDN博客 select * from  mt_customer_bind_info_ax ...

最新文章

  1. 老p7,来阿里快十年了,怎么着资产都上千万了,但是过的无比拮据
  2. Apriltag : 用于视觉系统标定图标tag36H11
  3. crypto-RSA-常用解密代码块
  4. 中国汽车脚垫市场消费趋势与营销渠道分析报告2022版
  5. SFB 项目经验-55-另类更新Exchange 2016 KB
  6. 平板涂色(信息学奥赛一本通-T1445)
  7. mac下配置openfire
  8. PKU《程序设计导引及在线实践》刷题记录(下)
  9. 使用Proteus软件制作温控风扇电路仿真
  10. 关于FlashDB的应用-GD32F450上
  11. DDoS防御选高防IP还是高防CDN?
  12. POJ 1915(双向广搜)
  13. 全系列毕业设计论文来了
  14. 国产CPU与国产操作系统
  15. 利用 Matlab 在 CST 中自动构建龙伯(Luneburg)透镜
  16. 树莓派魔镜MagicMirror —— 4 系统安装与配置
  17. 对同性恋的称呼与禁忌(不足的请补充啊)
  18. 【Java学习笔记之七】java函数的语法规则总结
  19. 数据库内创建用户失败
  20. 基于Android的校园共享自行车管理系统设计

热门文章

  1. 户型平面原型设计-简介
  2. 低学历该如何逆袭,2023年给你一个赚钱翻盘路径
  3. 基于python获取雅虎金融股票数据及相关可视化操作
  4. ViewFlipper-仿淘宝垂直广告滚动
  5. 正则将长数字转为英式写法(从后向前3个数字一个逗号)
  6. 应用程序图标变成白色
  7. 跨境卖家:如何让海外KOL营销达到理想效果?
  8. python中用pygame创建一个精致的窗口
  9. 7、任务分配-任务分派其他人
  10. 1.6 电源树中电流的计算方法(硬件基础系列)