avatar

一条在知识海洋的咸鱼

这个家伙很懒,啥也没有留下😋

  • 首页
  • Linux
  • OCJP
  • Java核心技术卷
  • J2EE相关标准
  • 深入理解Java虚拟机
  • NIO与SOcket编程技术指南
  • Java多线程编程核心技术
  • Redis开发与运维
  • Spring Cloud Alibaba 微服务原理与实践
  • DevOps
  • Docker
  • MySQL必知必会
  • AI自学路线
  • Spring Boot 编程思想(核心篇)
主页 第十三章 分组数据
文章

第十三章 分组数据

发表于 2021-06-29 更新于 2026-06- 10
作者 Administrator
10~13 分钟 阅读

分组数据,以便于汇总表内容的子集 GROUP BY 和HAVING

  • 数据分组
  • 创建分组GROUP BY
    • 注意
  • 过滤分组HAVING
    • HAVING和WHERE的区别
  • 分组和排序
    • 区别
    • 注意
  • SELECT子句顺序

数据分组

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

创建分组GROUP BY

通过GROUP BY创建分组,GROUP BY指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。

SELECT
	vend_id,
	COUNT(*) AS num_prods 
FROM
	products 
GROUP BY
	vend_id;

上述SQL的意思是通过vend_id进行升序排序分组,计算每个不同的vend_id的行数,并当作产品供应商的现有产品字段。
image.png

注意

  • BROUP BY可以包含任意数目的列
  • GROUP BY嵌套了分组,数据将在最后规定的分组上进行汇总。即在建立分组时,指定的所有列都一起计算(不能从个别的列取回数据)
  • GROUP BY列出的每个列都必须是检索列或有效的表达式(聚集函数除外),不能使用别名
  • SELECT语句中的每个列都必须在GROUP BY子句中给出(聚集函数除外)
  • 如果分组中有NULL值,则将NULL作为一个分组返回,如果有多行NULL,其将分为一组
  • GROUP BY必须出现在WHERE之后和ORDER BY子句之前

过滤分组HAVING

除了分组数据外,MySQL可以过滤分组,规定包括哪些分组,派出哪些分组
WHERE过滤行,HAVING过滤分组。
所有类型的WHERE子句都可以用HVING来替代

SELECT
	cust_id,
	COUNT(*) AS orders 
FROM
	orders 
GROUP BY
	cust_id 
HAVING
	COUNT(*)>= 2;

上述SQL意为在orders表中查找订单数大于等于2个的cust_id过滤
image.png

HAVING和WHERE的区别

  • HAVING支持所有WHERE操作符
  • WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤
SELECT
	vend_id,
	COUNT(*) AS num_prods 
FROM
	products 
WHERE
	prod_price >= 10 
GROUP BY
	vend_id 
HAVING
	COUNT(*)>= 2;

同时使用WHERE和HAVING,返回具有2个及以上,价格为10及以上的产品的供应商
image.png

分组和排序

虽然GROUP BY和ORDER BY经常完成相同的工作,但是他们是非常不同的。

区别

  • ORDER BY
    排序产生的输出、任意列都可以使用
  • GROUP BY
    分组行、输出可能不是分组的数据、智能使用选择列或表达式列,而且必须使用每个选择列表达式

注意

在使用GROUP BY时,也要给出ORDER BY子句。这是保证数据正确排序的唯一方法。不要仅仅依赖GROUP BY排序数据

  • 例
SELECT
	order_num,
	SUM( quantity * item_price ) AS ordertotal 
FROM
	orderitems 
GROUP BY
	order_num 
HAVING
	SUM( quantity * item_price )>= 50

查找订单总额大于等于50的订单,并根据订单号分组
image.png
如果要按照总金额大小进行排序可以如下

SELECT
	order_num,
	SUM( quantity * item_price ) AS ordertotal 
FROM
	orderitems 
GROUP BY
	order_num 
HAVING
	SUM( quantity * item_price )>= 50 
ORDER BY
	ordertotal;

image.png

SELECT子句顺序

SELECT子句顺序如下

  • SELECT
    需要检索返回的列、表达式
  • FROM
    检索数据的表
  • WHERE
    行级别过滤
  • GROUP BY
    分组说明
  • HAVING
    组级过滤
  • ORDER BY
    输出排序顺序
  • LIMIT
    要检索的行
MySQL必知必会
SQL
许可协议: 
分享

相关文章

7月 6, 2021

第二十九章 数据库维护

7月 6, 2021

第二十八章 安全管理

确保数据的安全和完整需要利用访问控制访问控制root账户不要使用root管理用户创建用户账号简单创建一个新用户账号使用GRANT或INSERT创建重命名用户账号删除用户账号设置访问权限访问控制用户需要对其数据具有适当的访问权,既不能过多,也不能过少,例如多数用户需要对表进行读写,少数用户需要创建和删

7月 6, 2021

第二十七章 全球化和本地化

MySQL处理不同字符集和语言的基础知识字符集和校对顺序校对的重要性使用字符集和校对顺序字符集和校对顺序数据库表被用来存储和检索数据。不同的语言和字符集需要以不同的方式存储和检索MySQL需要适应不同的字符集(字母和字符),应应不同的排序和检索数据的方法字符集:字母和符号的集合编码:某个字符集成员的

下一篇

第十四章 使用子查询

上一篇

第十二章 汇总数据

最近更新

  • 55 异常兜底:工具失败、非法输出、空检索与超时
  • 54 Agent Memory:短期记忆、用户上下文与摘要
  • 53 Human-in-the-loop:让关键动作暂停、确认与恢复
  • 52 工单 Tool:字段校验、创建结果与失败补偿
  • 51 订单 Tool:Mock、鉴权、状态解析与脱敏

热门标签

java基础 微服务 maven Spring Tomcat DDD Linux Linux基础 SQL基础 数据结构算法

目录

©2026 一条在知识海洋的咸鱼. 保留部分权利。

使用 Halo 主题 Chirpy