深入解析MySQL中的HAVING關鍵字:從入門到實戰

引言

在SQL查詢中,數據過濾是核心操作之一。我們常用WHERE子句進行行級過濾,但當需要對分組后的結果進行條件篩選時,HAVING關鍵字便成為不可或缺的工具。本文將深入探討HAVING的作用、使用場景及其與WHERE的區別,并通過實際案例幫助開發者掌握這一關鍵語法。

1. HAVING是什么?

HAVING是SQL中用于對GROUP BY分組后的結果進行條件過濾的關鍵字。它允許我們基于聚合函數(如SUMAVGCOUNT)或分組后的列值,篩選出符合條件的數據組。

核心特點
  • 分組后過濾:作用于GROUP BY之后,處理的是“組”而非“行”。

  • 支持聚合函數:可直接在條件中使用SUM()AVG()等。

  • 靈活性:可引用SELECT中的列別名。

2. 為什么需要HAVING?

假設你需要回答以下業務問題:

  • “哪些客戶的訂單總數超過100件?”

  • “哪個部門的平均工資高于公司整體平均?”

這些問題無法通過WHERE直接實現,因為過濾條件依賴于分組后的計算結果。
此時,HAVING是唯一的選擇

3. HAVING與WHERE的區別

執行順序

SQL查詢的執行順序為:
WHERE?→?GROUP BY?→?HAVING?→?ORDER BY?→?LIMIT

這意味著:

  • WHERE在分組前過濾原始數據,減少進入分組的數據量。

  • HAVING在分組后過濾,決定哪些組保留在結果中。

功能對比
特性WHEREHAVING
過濾對象原始表的行分組后的組
聚合函數不可使用必須使用
性能影響優先使用,減少計算開銷在分組后處理,可能更耗時
別名支持不支持SELECT中的別名支持

?

4. HAVING的經典使用場景

場景1:篩選聚合結果

統計銷售額超過1萬元的商品類別:

SELECT category, SUM(price) AS total_sales
FROM products
GROUP BY category
HAVING total_sales > 10000;  -- 直接使用別名
場景2:多層條件組合

查詢平均分高于80且不及格次數少于3次的學生:

SELECT student_id, AVG(score) AS avg_score,COUNT(CASE WHEN score < 60 THEN 1 END) AS fail_count
FROM exam_results
GROUP BY student_id
HAVING avg_score >= 80 AND fail_count < 3;
場景3:無GROUP BY的HAVING

將整個表視為一個組,篩選總記錄數:

SELECT COUNT(*) AS total_users
FROM users
HAVING total_users > 1000;  -- 類似于WHERE,但允許使用聚合

5. 實戰案例:電商數據分析

需求:找出2023年訂單金額超過5萬元且退貨率低于5%的客戶。

SELECT customer_id,SUM(order_amount) AS total_spent,COUNT(order_id) AS total_orders,SUM(CASE WHEN is_returned = 1 THEN 1 ELSE 0 END) AS return_count,(return_count / total_orders) * 100 AS return_rate
FROM orders
WHERE YEAR(order_date) = 2023  -- 先過濾2023年數據
GROUP BY customer_id
HAVING total_spent > 50000 AND return_rate < 5;

解析

  1. WHERE先過濾掉非2023年的訂單,減少后續計算量。

  2. GROUP BY按客戶分組,計算總消費、訂單數、退貨數。

  3. HAVING篩選出高消費、低退貨率的優質客戶。

6. 常見錯誤與避坑指南

錯誤1:在WHERE中使用聚合函數
-- 錯誤!WHERE不能處理聚合函數
SELECT department, AVG(salary)
FROM employees
WHERE AVG(salary) > 10000  

報錯信息Invalid use of group function

錯誤2:混淆過濾順序

-- 錯誤邏輯:先按部門分組,再篩選工資>10000的人,導致結果不準確
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING salary > 10000;  -- 這里salary已不表示原始行數據!

修正:應在WHERE中提前過濾個體數據,再分組計算。

7. 性能優化建議

  1. 優先使用WHERE:盡可能在分組前用WHERE減少數據量。

?

-- 優化前(性能差)
SELECT user_id, COUNT(*)
FROM logs
GROUP BY user_id
HAVING COUNT(*) > 100 AND created_at > '2023-01-01';-- 優化后(先過濾時間)
SELECT user_id, COUNT(*)
FROM logs
WHERE created_at > '2023-01-01'
GROUP BY user_id
HAVING COUNT(*) > 100;

2.避免復雜HAVING條件:復雜的計算盡量在SELECT中預先定義。

-- 不推薦
HAVING (SUM(income) - SUM(cost)) > 1000;-- 推薦
SELECT ..., (SUM(income) - SUM(cost)) AS profit
GROUP BY ...
HAVING profit > 1000;

8. 高級技巧

技巧1:HAVING與CASE結合

動態標記數據組:

SELECT product_category,AVG(price) AS avg_price,CASE WHEN AVG(price) > 100 THEN 'High'ELSE 'Low'END AS price_level
FROM products
GROUP BY product_category
HAVING price_level = 'High';  -- 使用CASE生成的別名
技巧2:與窗口函數結合(MySQL 8.0+)

篩選排名前3的銷售員:

SELECT *
FROM (SELECT salesperson_id,SUM(amount) AS total_sales,RANK() OVER (ORDER BY SUM(amount) DESC) AS sales_rankFROM salesGROUP BY salesperson_id
) AS ranked_sales
WHERE sales_rank <= 3;  -- 注意:此處仍可用WHERE,因為窗口函數在HAVING后執行

9. 總結

HAVING是處理分組后過濾的終極武器,尤其在數據分析場景中不可或缺。記住以下關鍵點:

  1. 執行順序WHERE?→?GROUP BY?→?HAVING

  2. 聚合依賴:條件涉及SUMAVG等時必用HAVING

  3. 性能優先:盡量用WHERE提前過濾,減少分組計算量。

掌握HAVING的使用,將顯著提升你處理復雜分組查詢的能力。現在,嘗試在你的下一個SQL查詢中實踐它吧!

動手練習
在熟悉的數據庫中創建一個銷售表,嘗試用HAVING解決以下問題:

  • 找出月度銷售額連續3個月超過10萬的店鋪。

  • 統計活躍用戶(過去30天登錄≥5次)。

歡迎在評論區分享你的解決方案! 🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84228.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

根據YOLO數據集標簽計算檢測框內目標面積占比(YOLO7-10都適用)

程序&#xff1a; 路徑改成自己的&#xff0c;閾值可以修改也可以默認 #zhouzhichao #25年5月17日 #計算時頻圖中信號面積占檢測框面積的比值import os import numpy as np import pandas as pd from PIL import Image# Define the path to the directory containing the lab…

AI神經網絡降噪 vs 傳統單/雙麥克風降噪的核心優勢對比

1. 降噪原理的本質差異 對比維度傳統單/雙麥克風降噪AI神經網絡降噪技術基礎基于固定規則的信號處理&#xff08;如譜減法、維納濾波&#xff09;基于深度學習的動態建模&#xff08;DNN/CNN/Transformer&#xff09;噪聲樣本依賴預設有限噪聲類型訓練數據覆蓋數十萬種真實環境…

了解Android studio 初學者零基礎推薦(3)

kotlin中的數據類及對象 使用泛型創建可重復使用的類 我們將常在線答題考試&#xff0c;有的考試題型包括判斷&#xff0c;或者填空&#xff0c;以及數學題&#xff0c;此外試題內容還包括難易程度&#xff1a;"easy”,"medium"&#xff0c;"hard",…

【占融數科-注冊/登錄安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

記錄一次請求數據很慢的災難

起因&#xff1a; 因公司業務需要&#xff0c;對接了一個平臺的 api。對接完成之后&#xff0c;發現只要打開開關&#xff0c;就別的接口就訪問很慢&#xff0c;出現 gatway time out。 排查&#xff1a; 先看下主服務器和 slave 服務器的狀態&#xff1a; 主服務&#xff…

力扣-將x減到0的最小操作數

1.題目描述 2.題目鏈接 1658. 將 x 減到 0 的最小操作數 - 力扣&#xff08;LeetCode&#xff09; 3.題目分析 1&#xff09;正面求解困難 題目要求我們每次都從最左邊或者最右邊取一個數&#xff0c;使x-元素的值&#xff0c;并在數組中移除該元素。最后返回的最小操作數…

排序復習/上(C語言版)

目錄 1.排序概念 2.冒泡排序 效率性能測試代碼&#xff1a; 性能分析&#xff1a; 3.直接插入排序 單趟&#xff1a; 整體&#xff1a; 性能分析&#xff1a; 4.希爾排序&#xff08;基于插入排序的優化&#xff09; 單趟單組&#xff1a; 單趟多組&#xff1a; 降低…

程序編輯器快捷鍵總結

程序編輯器快捷鍵總結 函數跳轉 函數跳轉 Creator : F2VSCode : F12visual Studio : F12

【LUT技術專題】極小尺寸LUT算法:TinyLUT

TinyLUT: Tiny Look-Up Table for Efficient Image Restoration at the Edge&#xff08;2024 NeurIPS&#xff09; 專題介紹一、研究背景二、TinyLUT方法2.1 Separable Mapping Strategy2.2 Dynamic Discretization Mechanism 三、實驗結果四、總結 本文將從頭開始對TinyLUT: …

解決:VMware 虛擬機 Ubuntu 系統共享文件夾無法訪問問題

以下是解決 VMware 虛擬機 Ubuntu 系統共享文件夾無法訪問 問題的完整過程總結&#xff0c;按關鍵步驟和邏輯順序梳理&#xff1a; 系統版本&#xff1a;Ubuntu 22.04.5 1. 確認 VMware Tools 已安裝 驗證方法&#xff1a;通過 ps -ef | grep vmtoolsd 檢查是否存在 vmtools…

YOLOv8 的雙 Backbone 架構:解鎖目標檢測新性能

一、開篇&#xff1a;為何踏上雙 Backbone 探索之路 在目標檢測的領域中&#xff0c;YOLOv8 憑借其高效與精準脫穎而出&#xff0c;成為眾多開發者和研究者的得力工具。然而&#xff0c;傳統的單 Backbone 架構&#xff0c;盡管已經在諸多場景中表現出色&#xff0c;但仍存在一…

k8s網絡架構

Kubernetes 網絡架構的設計目標是為 Pod 提供一個高效、靈活且可擴展的網絡環境&#xff0c;同時確保 Pod 之間的通信簡單直接&#xff0c;類似于在同一個物理網絡中。以下是 Kubernetes 網絡架構的原理和核心組件的詳細解析&#xff1a; 一、Kubernetes 網絡模型的基本原則 Ku…

C++高頻面試考點 -- 智能指針

C高頻面試考點 – 智能指針 C11中引入智能指針的概念&#xff0c;方便堆內存管理。這是因為使用普通指針&#xff0c;容易造成堆內存泄漏&#xff0c;二次釋放&#xff0c;程序發生異常時內存泄漏等問題。 智能指針在C11版本之后提供&#xff0c;包含在頭文件<memory>中…

JavaScript關鍵字完全解析:從入門到精通

前言 JavaScript作為目前最流行的編程語言之一&#xff0c;擁有豐富的關鍵字體系。這些關鍵字是語言的基礎組成部分&#xff0c;理解它們的含義和用法對于掌握JavaScript至關重要。本文將詳細介紹JavaScript中的所有關鍵字&#xff0c;包括ES6的新增關鍵字&#xff0c;幫助開發…

#6 百日計劃第六天 java全棧學習

今天學的啥 上午 算法byd圖論 圖遍歷dfs bfs 沒學懂呵呵 找到兩個良心up 圖碼 labuladong 看算法還好 尚硅谷講的太淺了 那你問我 下午呢 下午 java 看了會廖雪峰的教程 回顧基礎 小林coding Java基礎八股文 還有集合的八股文 有的不是很懂 今天把Java基礎算是完…

(4)ModalAI VOXL

文章目錄 前言 4.1 購買什么 4.2 硬件設置 4.3 VOXL 攝像機配置 4.4 自動駕駛儀配置 4.4.1 使用 OpticalFlow 進行 EKF3 光源轉換 4.5 視頻 前言 本文介紹了如何將 ModalAI VOXL-CAM 與 ArduPilot 配合使用&#xff0c;以替代 GPS&#xff0c;從而實現 Loiter、PosHold…

大模型高效微調方法綜述:P-Tuning軟提示與lora低秩微調附案例代碼詳解

Prompt Tuning 和 P-Tuning 都屬于“軟提示”&#xff08;soft prompt&#xff09;范式&#xff0c;但 P-Tuning 首次提出用小型 LSTM/MLP 對提示嵌入進行編碼生成&#xff0c;而 Prompt Tuning&#xff08;又稱 Soft Prompt Tuning&#xff09;則直接對一段可訓練的嵌入序列做…

圖解深度學習 - 深度學習的工作原理

上一篇&#xff0c;我們已經知道機器學習是將輸入&#xff08;比如圖像&#xff09;映射到目標&#xff08;比如數字“4”&#xff09;的過程。這一過程是通過觀察許多輸入和目標的示例來完成的。 我們還知道&#xff0c;深度神經網絡通過一系列簡單的數據變換&#xff08;層&…

實現圖片自動壓縮算法,canvas壓縮圖片方法

背景&#xff1a; 在使用某些支持webgl的圖形庫&#xff08;eg&#xff1a;PIXI.js&#xff0c;fabric.js&#xff09;場景中&#xff0c;如果加載的紋理超過webgl可處理的最大紋理限制&#xff0c;會導致渲染的紋理缺失&#xff0c;甚至無法顯示。 方案 實現圖片自動壓縮算…

周界安全防護新突破:AI智能分析網關V4周界入侵檢測算法的技術應用

一、方案概述 在安防周界防護領域&#xff0c;傳統紅外對射、電子圍欄等防護系統弊端顯著&#xff0c;其誤報率高&#xff0c;易受飛鳥、樹枝等干擾&#xff0c;且在惡劣天氣、復雜光照下難以精準識別入侵。隨著安全需求升級&#xff0c;基于AI智能分析網關V4的周界翻越入侵檢…