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

SQL中的group by和having区别详解

理解 SQL 中的 GROUP BYHAVING 是掌握数据分析的关键。

🧩 核心概念:分组与过滤

  1. GROUP BY:将数据分组(类似 Excel 的数据透视表)
  2. HAVING:对分组后的结果进行过滤(类似 WHERE,但作用于分组)

📊 类比现实场景

想象你是一家超市的经理,有一张销售记录表(sales):

商品类别销售额日期
水果1002023-01-01
蔬菜802023-01-01
水果1202023-01-02
饮料1502023-01-02
蔬菜902023-01-03

1️⃣ 只用 GROUP BY(分组统计)

SELECT 商品类别, SUM(销售额) AS 总销售额  -- 聚合函数
FROM sales
GROUP BY 商品类别;          -- 按类别分组

结果:

商品类别总销售额
水果220
蔬菜170
饮料150

💡 关键点:GROUP BY 把相同类别的行"折叠"成一行,配合聚合函数(SUM/AVG/COUNT等)计算


2️⃣ GROUP BY + HAVING(分组后过滤)

SELECT 商品类别,SUM(销售额) AS 总销售额
FROM sales
GROUP BY 商品类别
HAVING SUM(销售额) > 200;  -- 只保留总销售额>200的分组

结果:

商品类别总销售额
水果220

🚨 注意:HAVING 在分组执行,用于过滤分组结果


🔍 WHERE vs HAVING 关键区别

-- WHERE: 分组前过滤原始数据(单行级别)
SELECT 类别, SUM(销售额)
FROM sales
WHERE 日期 = '2023-01-02'  -- 先过滤日期
GROUP BY 类别-- HAVING: 分组后过滤聚合结果(分组级别)
SELECT 类别, SUM(销售额)
FROM sales
GROUP BY 类别
HAVING SUM(销售额) > 200   -- 后过滤聚合值

🌰 实际应用场景

需求: 找出平均订单额超过 $50 的客户

SELECT customer_id,AVG(order_amount) AS avg_order
FROM orders
GROUP BY customer_id
HAVING AVG(order_amount) > 50;  -- 对分组结果过滤

⚠️ 常见错误与避坑指南

  1. SELECT 非聚合字段

    -- 错误!product_name未在GROUP BY中声明
    SELECT category, product_name, COUNT(*)
    FROM products
    GROUP BY category;
    
  2. 混淆 WHEREHAVING

    -- 错误!WHERE不能使用聚合函数
    SELECT category, AVG(price)
    FROM products
    WHERE AVG(price) > 100  -- 应改用HAVING
    GROUP BY category;
    
  3. 分组后排序

    SELECT category, COUNT(*) AS product_count
    FROM products
    GROUP BY category
    HAVING COUNT(*) > 5
    ORDER BY product_count DESC;  -- 正确用法
    

💡 记忆口诀

“GROUP BY 先分组,HAVING 后过滤”
“WHERE 管单行,HAVING 管分组”

🛠 执行顺序图解

FROM 原始数据
WHERE 行过滤
GROUP BY 分组
聚合计算 SUM/AVG等
HAVING 分组过滤
SELECT 选择字段
ORDER BY 排序

在这里插入图片描述

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

相关文章:

  • 【C语言网络编程】HTTP 客户端请求(基于 Socket 的完整实现)
  • 神经网络知识讨论
  • 网易大模型算法岗面经80道
  • 【学习笔记】MimicGen: 基于人类演示的可扩展机器人学习数据生成系统
  • 批量重命名带编号工具,附免费地址
  • idea打开后project窗口未显示项目名称的解决方案
  • k8s的权限
  • tlias智能学习辅助系统--Filter(过滤器)
  • Ansible列出常见操作系统的发行版,Ansible中使用facts变量的两种方式
  • CH341 Linux驱动 没有 /dev/ttyCH341USB0
  • Linux文件系统管理——NFS服务端的安装配置与NFS客户端的安装与挂载实操教程
  • 【AI】联网模式
  • Scrapy分布式爬虫数据统计全栈方案:构建企业级监控分析系统
  • GPU运维常见问题处理
  • 【C++】stack和queue的模拟实现
  • Java基础day17-LinkedHashMap类,TreeMap类和集合工具类
  • 基于POD和DMD方法的压气机叶片瞬态流场分析与神经网络预测
  • 基于遗传算法的多无人车协同侦察与安全保护策略优化
  • CUDA杂记--FP16与FP32用途
  • Redis面试精讲 Day 5:Redis内存管理与过期策略
  • 汇编语言中的通用寄存器及其在逆向工程中的应用
  • 计划任务(at和cron命令介绍及操作)
  • MySQL事务原理
  • 应用程序 I/O 接口
  • 【MySQL 数据库】MySQL基本查询(第二节)
  • 系统性学习C语言-第二十三讲-文件操作
  • 谷歌无法安装扩展程序解决方法(也许成功)
  • Kubernetes 与 Docker的爱恨情仇
  • STM32-定时器的基本定时/计数功能实现配置教程(寄存器版)
  • 【工具】好用的浏览器AI助手