SQL 中 WHERE 与 HAVING 的用法详解:分组聚合场景下的混用指南

SQL中WHERE与HAVING的用法详解:分组聚合场景下的混用指南

1. WHERE与HAVING的基本区别

在SQL查询中,WHERE和HAVING都是用于过滤数据的子句,但它们的应用时机和作用对象有本质区别:

  • WHERE子句:在分组前对原始数据进行过滤,作用于单行记录
  • HAVING子句:在分组后对聚合结果进行过滤,作用于分组结果
-- WHERE示例:筛选单价大于100的产品
SELECT product_id, product_name 
FROM products 
WHERE price > 100;-- HAVING示例:筛选平均分大于80的班级
SELECT class_id, AVG(score) as avg_score
FROM students
GROUP BY class_id
HAVING AVG(score) > 80;

2. 分组聚合场景下的混用原则

在分组查询中,WHERE和HAVING可以协同工作,遵循以下处理流程:

  1. WHERE条件先执行,过滤掉不符合条件的原始记录
  2. 对过滤后的数据进行分组(GROUP BY)
  3. 计算各组的聚合值
  4. HAVING条件最后执行,过滤掉不符合条件的分组

3. 典型混用场景示例

-- 查询2023年销售额超过10万的销售员及其销售额
SELECT salesperson_id,SUM(amount) as total_sales
FROM sales
WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY salesperson_id
HAVING total_sales > 100000;

执行顺序:

  1. 先通过WHERE筛选2023年的销售记录
  2. 按销售员分组
  3. 计算每个销售员的总销售额
  4. 最后用HAVING筛选总销售额>10万的分组

4. 常见误区与注意事项

  1. WHERE中不能使用聚合函数

    -- 错误写法
    SELECT department, AVG(salary)
    FROM employees
    WHERE AVG(salary) > 5000  -- 错误!WHERE不能包含聚合函数
    GROUP BY department;-- 正确写法应使用HAVING
    SELECT department, AVG(salary)
    FROM employees
    GROUP BY department
    HAVING AVG(salary) > 5000;
    
  2. HAVING中可以使用非聚合列,但必须出现在GROUP BY中

    -- 合法写法
    SELECT department, AVG(salary)
    FROM employees
    GROUP BY department
    HAVING department LIKE 'A%';  -- department在GROUP BY中-- 不推荐写法(虽然语法可能允许)
    SELECT department, AVG(salary)
    FROM employees
    GROUP BY department
    HAVING employee_id = 100;  -- employee_id不在GROUP BY中,结果不可预测
    

5. 分不清莫不如不用HAVING?

HAVING可以理解为对分组结果的临时表做WHERE过滤。

HAVING本质上是GROUP BY操作的一部分,专门为分组后过滤设计的语法糖​​。

上面的例子也可以写成:

-- 查询2023年销售额超过10万的销售员及其销售额
SELECT t.salesperson_id, t.total_sales 
FROM (SELECT salesperson_id,SUM(amount) as total_salesFROM salesWHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31'GROUP BY salesperson_id
) t 
WHERE t.total_sales > 100000;

两者的共同点​​:

  1. 都先过滤2023年的销售记录
  2. 都按销售员分组计算总销售额
  3. 都筛选出总销售额>10万的结果
  4. 返回的列和数据类型完全相同

6. 总结

WHERE和HAVING在分组聚合查询中的混用是SQL中强大的功能,掌握它们的区别和配合使用可以:

  1. 先通过WHERE高效过滤原始数据,减少处理量
  2. 再通过GROUP BY进行分组计算
  3. 最后用HAVING筛选有意义的分组结果
  4. HAVING等价于子查询+WHERE

合理运用这两个子句,可以编写出既高效又精确的聚合查询,满足复杂的数据分析需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93976.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14 - 大语言模型 — 抽取式问答系统 “成长记”:靠 BERT 学本事,从文本里精准 “揪” 答案的全过程(呆瓜版-1号)

目录 1、什么是问答系统? 2、问答系统的核心工作流程 2.1、理解问题:把问题 “翻译” 成机器能懂的形式 2.2、 寻找答案:从信息中定位答案 2.3、生成答案:整理并输出结果 2.4、优化迭代:让系统更 “聪明” 3、主…

Docker一键部署轻量级Gitea仓库

1、安装docker 1、安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm22、配置docker yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3、安装docker yum install -y docker-ce4、修改docker配置文…

2025年渗透测试面试题总结-2025年HW(护网面试) 81(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年HW(护网面试) 81 一、Webshell获取路径规划 二、变形注入突破技巧 三、MySQL写入Webshell条件矩阵 …

8.1IO进程线程——文件IO函数

文章目录一、思维导图二、使用文件IO函数,实现文件的拷贝myhead.h代码现象三、使用标准IO函数,实现图片的拷贝代码现象四、使用文件IO函数,计算文件的大小代码现象五、牛客网刷题一、思维导图 二、使用文件IO函数,实现文件的拷贝 …

xerces-c-src_2_8_0 arm_linux编译

xerces-c-src_2_8_0 ARM LINUX 编译 文章借鉴:https://bbs.csdn.net/topics/250017321 export XERCESCROOT/xxxx/xerces-c-src_2_8_0 1 下载地址https://archive.apache.org/dist/xerces/c/sources/xerces-c-src_2_8_0.tar.gz:xerces-c-src_2_8_0.tar…

20250729使用WPS打开xlsx格式的电子表格时候隐藏显示fx的编辑栏的方法

20250729使用WPS打开xlsx格式的电子表格时候隐藏显示fx的编辑栏的方法 2025/7/29 9:44缘起:视图→编辑栏 截屏的时候,显示fx的编辑栏 占用空间了,很讨厌。 想办法拿掉!

springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别

在Spring Boot中,ConfigurationProperties注解用于将外部配置文件(如application.properties或application.yml)中的属性映射到Java对象中。这种方式使得配置管理更加灵活和集中。而将配置信息存入数据库则是另一种管理应用程序配置的方式。这…

JVM指针压缩的那些事

什么是指针压缩?指针压缩(Compressed Ordinary Object Pointers,简称Compressed OOPs)是JVM在64位平台上的一种内存优化技术,它将64位的对象引用压缩为32位,从而减少内存占用并提升性能。为什么需要指针压缩…

【数据结构初阶】--排序(一):直接插入排序,希尔排序

🔥个人主页:草莓熊Lotso 🎬作者简介:C研发方向学习者 📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言:生活是默默的坚持,毅力是永久的…

Hive SQL (HQL) 编辑指南

Hive SQL(HQL)是基于Hive的数据仓库查询语言,语法类似标准SQL,但因Hive的离线大数据处理特性,存在一些特有规则和最佳实践。以下是Hive SQL的编辑指南,涵盖核心语法、注意事项和优化技巧: 一、H…

力扣热题100--------240.搜索二维矩阵

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1:输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24…

【pytest高阶】-2- 内置hook插件扩展机制和定制开发

一、可爱版 pytest 插件 & hook 知识大礼包 🎁准备好和 pytest 插件来一场可爱约会了吗~ 咱们用超甜的 emoji 把知识串成棉花糖🍡 一口一个知识点!一、 pytest 插件:框架的 “魔法百宝箱” 🧙‍♀️1. …

博创软件数智通OA平台:高效协同,安全办公新选择

在数字化转型浪潮下,企业对于办公自动化系统的需求日益迫切。博创软件,作为协同办公领域的佼佼者,凭借其卓越的技术实力和丰富的行业经验,推出了数智通OA平台,为企业提供了一个高效、安全、便捷的办公解决方案。博创软…

AI coding汇总持续更新

代码编辑器 当然了,用代码编辑器这个概念太泛了,更多的是指AI代码编辑器,有自动补全,ai写代码功能的产品。 cursor WindSurf Trae jetbrains全家桶 比如:IntelliJ IDEA虽然很优秀,但是有种感觉,…

Yolo底层原理学习--(第二篇)

一,IOU置信度与非极大值抑制NMS在第一篇文章中我们讲到,对于一张图片,在前向传播的过程后(也就是卷积,池化,全连接等等),会生成许许多多个预测框,那么怎么从这么多预测框…

国内短剧CSP系统开发:技术架构与合规实践全解析

一、行业背景与政策驱动2025年,中国网络微短剧行业迎来法治化转型的关键期。国家广播电视总局《关于进一步统筹发展和安全促进网络微短剧行业健康繁荣发展的通知》明确实施"分类分层审核"制度,将微短剧划分为重点微短剧(投资≥100万…

http请求访问响应慢问题解决的基本思路

一、明确问题现象:先确定 “慢” 的特征在排查前,需先收集基础信息,缩小问题范围:是否所有请求都慢? 还是仅特定接口(如带数据库操作的接口)、特定时间段(如高峰期)、特定…

Vue.js的核心概念

Vue.js的核心概念可归纳为以下关键点,结合最新技术演进与实践场景:一、响应式数据绑定‌双向绑定机制‌:通过Object.defineProperty(Vue 2)或Proxy(Vue 3)实现数据劫持,自动追踪依赖…

新手小白做一个简单的微服务

我不太懂微服务框架,自己跟了个视频尝试做一套简单的微服务框架,跟着做的时候,发现这个视频很适合初学者 https://www.bilibili.com/video/BV1684y1T7oW/?spm_id_from333.337.search-card.all.click&vd_source61882010e50d6b158eb87c148…

C语言笔记4:错题整理

#1.1 编程题 判断101-500之间有多少个素数&#xff0c;放入数组中&#xff0c;遍历数组输出所有素数&#xff0c; 素数&#xff1a; 除了1和它本身以外不再有其他的因数。 具体实现 就用DeepSeek了 以下是AI生成代码&#xff1a; #include <stdio.h> #include <math.h…