当前位置: 首页 > news >正文

【MySQL 从 0 讲解系列】深入理解 GROUP BY 的本质与应用(含SQL示例+面试题)


🔍【MySQL 从 0 讲解系列】深入理解 GROUP BY 的本质与应用(含SQL示例+面试题)

GROUP BY 是 SQL 查询中最常见也最核心的语法之一,尤其在进行数据统计分析时不可或缺。然而,很多初学者对它理解不深,经常和 DISTINCTHAVING 混淆,或者搞不懂“分组后到底还能选哪些字段”。

本篇将从 0 到 1 全面讲解 GROUP BY原理、语法、实际案例、注意事项和面试回答,让你真正掌握它的应用场景!


🧠 一、什么是 GROUP BY?

GROUP BY 是一个分组语句,用于将结果集按照一个或多个字段进行分组,并常与聚合函数(如 COUNT()SUM()AVG()MAX()MIN())一起使用,对每个组分别进行统计。


🧱 二、GROUP BY 的基本语法

SELECT column1, AGG_FUNC(column2)
FROM table_name
GROUP BY column1;
  • column1:分组依据;
  • AGG_FUNC(column2):对分组后的每组数据应用聚合函数。

🧪 三、实战案例讲解

示例表:sales

idproductquantityprice
1A210
2B115
3A310
4B215
5C520

1. 按产品统计销售总量

SELECT product, SUM(quantity) AS total_sold
FROM sales
GROUP BY product;

🔍 结果:

producttotal_sold
A5
B3
C5

2. 按产品统计总销售额(单价 × 数量)

SELECT product, SUM(quantity * price) AS total_income
FROM sales
GROUP BY product;

🔍 结果:

producttotal_income
A50
B45
C100

❗ 四、使用 GROUP BY 的注意事项

1. SELECT 中出现的字段要么在 GROUP BY 中,要么是聚合函数

错误写法:

SELECT id, product, SUM(quantity) FROM sales GROUP BY product;
-- ❌ 错误:id 不是分组字段,也没有聚合,SQL 报错

正确做法是:只保留 GROUP BY 字段或聚合结果。


2. 支持多字段分组(组合分组)

SELECT product, price, SUM(quantity)
FROM sales
GROUP BY product, price;

这会对 (product, price)组合进行分组,比如同一产品不同价格也会被拆开统计。


3. 可搭配 HAVING 对分组结果进行过滤

SELECT product, SUM(quantity) AS total
FROM sales
GROUP BY product
HAVING total > 4;

只显示销量大于 4 的产品。


🎯 五、GROUP BY 和 DISTINCT 的区别

功能GROUP BYDISTINCT
去重作用✅(间接去重)
是否支持聚合函数❌ 不能直接聚合
使用目的分组统计/聚合分析去除重复值
可读性稍复杂简单

举例:

-- 查询所有不同产品名称
SELECT DISTINCT product FROM sales;-- 查询每种产品的销售总量
SELECT product, SUM(quantity) FROM sales GROUP BY product;

🔧 六、经典进阶用法

1. 子查询中使用 GROUP BY

查询销售额最高的产品:

SELECT product, SUM(quantity * price) AS income
FROM sales
GROUP BY product
ORDER BY income DESC
LIMIT 1;

2. 使用 COUNT(DISTINCT xxx)

-- 查询每个产品有多少个不同订单ID
SELECT product, COUNT(DISTINCT id) AS order_count
FROM sales
GROUP BY product;

🧑‍💼 七、面试问答必备总结

❓Q1:GROUP BY 和 HAVING 有什么区别?

A:

  • GROUP BY 是分组;
  • HAVING 是对分组后的结果进行筛选;
  • HAVING 一般与聚合函数一起使用,而 WHERE 是分组之前的筛选条件。

❓Q2:GROUP BY 一定要配合聚合函数吗?

A:

  • 不一定。但如果不使用聚合函数,它的作用类似于 DISTINCT
SELECT product FROM sales GROUP BY product;
-- 相当于 SELECT DISTINCT product FROM sales;

❓Q3:GROUP BY 后 SELECT 中的字段必须出现在 GROUP BY 中吗?

A:

  • 是的(除非是聚合函数),否则 SQL 报错;
  • 某些数据库可能“宽容”允许不完全匹配,但不推荐这么写。

✅ 八、总结:GROUP BY 是数据统计的核心工具

能力是否支持
按字段组合分组
配合聚合函数统计
配合 HAVING 筛选
多字段组合分组
替代 DISTINCT 去重✅(功能上)

练习:点击进入
力扣上这道题目可以很好的锻炼到group by的用法
非聚合列一定包含在group by子句之中


📘 后续推荐学习:

  • ✔️ HAVING 详解 + 实战应用(上一篇)
  • ✔️ JOIN 多表查询详解
  • ✔️ 子查询与派生表的使用方式
  • ✔️ 窗口函数 OVER() 详解:分组与不分组的完美结合

如果你喜欢这样的 SQL 系列讲解,我可以继续推出《JOIN 的核心原理与实战》、《窗口函数 OVER() 的全解析》 等内容。欢迎点赞、评论或继续提问你感兴趣的 SQL 技术点!

http://www.xdnf.cn/news/983701.html

相关文章:

  • 无刷直流电机控制系统仿真建模
  • 修仙处于平凡
  • 用Python撬动量化交易:深入探索开源利器vnpy
  • 彻底禁用Windows Defender通知和图标
  • Python基础数据类型与运算符全面解析
  • FaceFusion 技术深度剖析:核心算法与实现机制揭秘
  • 代码随想录算法训练营第60期第六十五天打卡
  • qt初识--01
  • OCR(光学字符识别)算法
  • IAR开发平台升级Arm和RISC-V开发工具链,加速现代嵌入式系统开发
  • 电机专用32位MCU PY32MD310,QFN32封装,内置多功能栅极驱动器
  • EtherCAT至TCP/IP异构网络互联:施耐德M580 PLC对接倍福CX5140解决方案
  • Vulkan学习笔记1—环境搭建
  • Spring Data MongoDB 提供了哪些核心组件?
  • AI服务代码说明文档
  • 计算机网络 : 应用层协议HTTP
  • 【C++特殊工具与技术】优化内存分配(五):显式析构函数的调用
  • 紫光展锐T8300以创新音频技术重塑感知世界
  • 【MySQL数据库 | 第三篇】DDL数据库操作
  • OpenGL ES绘制3D图形以及设置视口
  • 【排错】ubuntu挂载硬盘mount报错 unknown filesystem type ‘LVM2_member‘.
  • 基于STM32音频频谱分析设计
  • [HarmonyOSNext鸿蒙开发]11.ArkUI框架:Swiper、Grid布局与代码复用实战指南
  • GIS局部放电在线监测系统的设计与应用
  • LinkedHashMap
  • Mac电脑 SSH客户端 - Termius
  • Flutter Container 组件详解
  • ROS2加持,SU17实现全控制链路再进化
  • 虚拟机新增硬盘,与数据挂载
  • 【云原生】阿里云SLS日志自定义字段标签实现日志告警