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
英文地址,請注明出處:http://en.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…