news 2026/1/1 19:00:14

SQL必会必知整理-11-分组数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL必会必知整理-11-分组数据
11.1 数据分组
  • SQL聚集函数可用来汇总数据。这使我们能够对行进行计数,计算和与平均数,获得最大和最小值而不用检索所有数据。
  • 但如果要返回每个供应商提供的产品数,或者返回只提供单项产品的供应商所提供的产品,或返回提供10个以上产品的供应商,这就是分组显身手的时候了。分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
11.2 创建分组
  • 分组是在SELECT语句的GROUP BY子句中建立的。
SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;
  • 上面的SELECT语句指定了两个列,vend_id包含产品供应商的IDnum_prods为计算字段(用COUNT(*)函数建立)。GROUP BY子句指示MySQL按vend_id排序并分组数据。这导致对每个vend_id而不是整个表计算num_prods一次。
  • GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。
  • GROUP BY子句规定:
    • GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
    • 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
    • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
    • 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY句中给出。
    • 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
    • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
  • 使用WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值。
SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id WITH ROLLUP;
11.3 过滤分组
  • 除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。
  • MySQL为此目的提供了另外的子句,那就是HAVING子句。HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。
SELECT cust_id,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
  • 最后一行增加了HAVING子句,它筛选出COUNT(*) >=2(两个以上的订单)的那些分组。
  • 这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
SELECT vend_id,COUNT(*) AS num_prod FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;
  • WHERE子句过滤所有prod_price至少为10行。然后按vend_id分组数据,HAVING子句过滤计数为2或2以上的分组。
11.4 分组和排序
  • 虽然GROUP BYORDER BY经常完成相同的工作,但它们是非常不同的。
ORDER BY
GROUP BY
排序产生的输出
分组行。但输出可能不是分组的顺序
任意列都可以使用(甚至非选择的列也可以使用)
只可能使用选择列或表达式列,而且必须使用每个选择列表达式
不一定需要
如果与聚集函数一起使用列(或表达式),则必须使用
  • 我们经常发现用GROUP BY组的数据确实是以分组顺序输出的。但情况并不总是这样,它并不是SQL规范所要求的。
  • 因为你以某种方式分组数据(获得特定的分组聚集值),并不表示你需要以相同的方式排序输出。应该提供明确的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 ORDER BY ordertotal;
  • 在这个例子中,GROUP BY子句用来按订单号(order_num列)分组数据,以便SUM(*)函数能够返回总计订单价格。HAVING子句过滤数据,使得只返回总计订单价格大于等于50的订单。最后,用ORDERBY子句排序输出。
11.5 SELECT子句顺序
子句
说明
是否必须使用
SELECT
要返回的列或表达式
FROM
从中检索数据的表
仅在从表选择数据时使用
WHERE
行级过滤
GROUP BY
分组说明
仅在按组计算聚集时使用
HAVING
组级过滤
ORDER BY
输出排序顺序
LIMIT
要检索的行数
  • SELECT语句执行顺序 :开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->SELECT子句->ORDER BY子句->LIMIT子句->最终结果
  • 每个子句执行后都会产生一个中间结果,供接下来的子句使用,如果不存在某个子句,就跳过
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/27 23:14:57

如何在 Spring Boot 中接入 Amazon ElastiCache

缓存在服务端是一个非常重要的东西,今天我们来聊聊怎么把 Amazon ElastiCache应用整合到 Spring Boot 上,让服务响应提速、系统整体轻盈起来。一、为什么你迟早要上缓存你有多少次在日志里看着那几百毫秒的 SQL 延迟叹气?尤其当系统访问量上去…

作者头像 李华
网站建设 2025/12/31 22:47:04

基于51单片机的血糖步数测量仪

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能: (1)按键控制启动或停止,按下按键后电机转动,表示开始步行,再次按键按下,电机停止转动,表示停…

作者头像 李华
网站建设 2026/1/1 6:14:46

Linux C/C++ 学习日记(51):内存池

注:该文用于个人学习记录和知识交流,如有不足,欢迎指点。 一、指针和内存大小对齐是什么? 1. 内存分配时的指针对齐(必须):也称为内存对齐 结论:malloc/posix_memalign 等分配函数…

作者头像 李华
网站建设 2025/12/30 7:37:08

AAAI25|基于神经共形控制的时间序列预测模型

论文标题:Neural Conformal Control for Time Series Forecasting论文链接:https://arxiv.org/abs/2412.18144什么是共形预测?01 概念与内涵读本文之前,我也没有了解过“共形”预测的概念,所以特意查了资料。共形预测&…

作者头像 李华
网站建设 2026/1/1 14:15:06

CATCH:ICLR 2025 最值得关注的时间序列异常检测新框架

论文标题:CATCH: Channel-Aware multivariate Time Series Anomaly Detection via Frequency Patching论文链接:https://arxiv.org/abs/2410.12261研究背景:当多维时间序列“出问题”时在工业设备、网络安全、金融风控、医疗监测等场景中&…

作者头像 李华
网站建设 2025/12/31 3:11:01

开发到生产全链路:Docker containerd Kubernetes 运行时全景指南

容器核心技术全景解析:Docker、containerd、runc 与 Kubernetes 的演进与关系 本文为您全景式解析容器核心技术的生态体系,让您彻底理解 Docker、containerd 和容器运行时之间的关系与演进,以及 Kubernetes 的调度与生产实践建议。 一、从“一艘巨轮”的比喻开始 要理解整…

作者头像 李华