詳解SQL中不能輕視的 HAVING 子句
在本文中,我們將深入解析 HAVING 的功能,了解它的用法,以及它和 WHERE 子句的區(qū)別。通過許多實(shí)際案例,我們將完整地分析 HAVING 在 SQL 中的實(shí)際應(yīng)用。
HAVING 子句概述
HAVING 子句專門用于 對(duì)聚合數(shù)據(jù)進(jìn)行過濾,即它用于 GROUP BY 語(yǔ)句的結(jié)果集。在執(zhí)行 SQL 查詢時(shí),我們通常先用 WHERE 過濾原始數(shù)據(jù),然后用 HAVING 對(duì)分組后的數(shù)據(jù)進(jìn)行進(jìn)一步篩選。
1. HAVING 的基本語(yǔ)法
SELECT 列名, 聚合函數(shù) FROM 表名 GROUP BY 列名 HAVING 條件;
2. WHERE 和 HAVING 的區(qū)別
| 對(duì)比項(xiàng) | WHERE 子句 | HAVING 子句 |
|---|---|---|
| 作用范圍 | 作用于 單行數(shù)據(jù) | 作用于 聚合后的數(shù)據(jù) |
| 作用對(duì)象 | 普通列 | 聚合函數(shù) (SUM、AVG、COUNT 等) |
| 使用場(chǎng)景 | 過濾原始數(shù)據(jù) | 過濾聚合后的數(shù)據(jù) |
| 語(yǔ)法位置 | 在 GROUP BY 之前 | 在 GROUP BY 之后 |
| 計(jì)算影響 | 影響分組前的數(shù)據(jù)集大小 | 影響分組后的數(shù)據(jù)集大小 |
在 SQL 查詢優(yōu)化中,推薦 盡可能使用 WHERE 進(jìn)行初步篩選,以減少 GROUP BY 需要處理的數(shù)據(jù)量,從而提升查詢效率。
HAVING 子句的應(yīng)用實(shí)例
案例 1:計(jì)算每個(gè)部門的員工數(shù),并篩選員工數(shù)大于 3 的部門
SELECT department, COUNT(*) AS emp_count FROM employees GROUP BY department HAVING COUNT(*) > 3;
?? 解析:
GROUP BY department按部門分組。COUNT(*)計(jì)算每個(gè)部門的員工數(shù)量。HAVING COUNT(*) > 3只保留 員工數(shù)量大于 3 的部門。
案例 2:篩選平均薪資高于 5000 的部門
SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 5000;
?? 解析:
計(jì)算
department組內(nèi)的平均薪資。HAVING過濾掉 平均薪資低于 5000 的部門。
案例 3:同時(shí)使用 WHERE 和 HAVING
SELECT department, SUM(salary) AS total_salary FROM employees WHERE salary > 3000 GROUP BY department HAVING SUM(salary) > 20000;
?? 解析:
WHERE salary > 3000先篩選 工資高于 3000 的員工。GROUP BY department按部門分組。HAVING SUM(salary) > 20000只保留 薪資總和大于 20000 的部門。
HAVING 子句的高級(jí)用法
1. 使用多重條件篩選
SELECT department, COUNT(*) AS emp_count, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING COUNT(*) > 5 AND AVG(salary) > 6000;
?? 解析:
HAVING支持邏輯運(yùn)算符AND、OR組合多個(gè)條件。過濾掉 員工數(shù)少于 5 或者平均薪資低于 6000 的部門。
2. 使用 HAVING 進(jìn)行范圍篩選
SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department HAVING SUM(salary) BETWEEN 10000 AND 50000;
?? 解析:
HAVING SUM(salary) BETWEEN 10000 AND 50000過濾 薪資總和在 10000 到 50000 之間的部門。
3. 結(jié)合 ORDER BY 進(jìn)行排序
SELECT department, COUNT(*) AS emp_count FROM employees GROUP BY department HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC;
?? 解析:
ORDER BY COUNT(*) DESC按 員工數(shù)降序排列,以便快速查看最大部門。
HAVING 子句的優(yōu)化策略
盡量使用 WHERE 進(jìn)行初步篩選,減少數(shù)據(jù)規(guī)模,提高
GROUP BY計(jì)算效率。避免在 HAVING 語(yǔ)句中進(jìn)行復(fù)雜計(jì)算,可以將計(jì)算結(jié)果存入臨時(shí)表,提高查詢性能。
使用索引優(yōu)化分組字段,如果
GROUP BY作用在大表的字段上,可以考慮創(chuàng)建索引,以提升查詢速度。
總結(jié)
HAVING主要用于 對(duì)聚合結(jié)果進(jìn)行篩選,而WHERE用于 單行數(shù)據(jù)的篩選。在 SQL 查詢優(yōu)化時(shí),推薦 優(yōu)先使用
WHERE過濾原始數(shù)據(jù),然后在HAVING里進(jìn)行聚合數(shù)據(jù)篩選。HAVING適用于 COUNT、SUM、AVG、MAX、MIN 等聚合函數(shù)的篩選,配合ORDER BY可以更方便地分析數(shù)據(jù)。
通過合理使用 HAVING,可以有效優(yōu)化 SQL 查詢,提高數(shù)據(jù)庫(kù)操作的效率。
到此這篇關(guān)于詳解SQL中不能輕視的 HAVING 子句的文章就介紹到這了,更多相關(guān)SQL HAVING 子句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL server查看各表的索引(sql語(yǔ)句大全)
使用Sql語(yǔ)句查看 SQL Server 數(shù)據(jù)庫(kù)中的索引,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
淺談SQL Server交叉聯(lián)接 內(nèi)部聯(lián)接
本文主要講了SQL Server的交叉聯(lián)接和內(nèi)部聯(lián)接,同時(shí)也給出了使用需要注意的地方。有需要的朋友可以看下2016-12-12
SQL查詢語(yǔ)句行轉(zhuǎn)列橫向顯示實(shí)例解析
這篇文章主要為大家詳細(xì)介紹了兩個(gè)關(guān)于SQL查詢語(yǔ)句行轉(zhuǎn)列橫向顯示的實(shí)例解析,感興趣的小伙伴們可以參考一下2016-05-05
idea連接SQL?Server數(shù)據(jù)庫(kù)的詳細(xì)圖文教程
Idea的還有個(gè)強(qiáng)大之處就是連接數(shù)據(jù)庫(kù),就可以少開一個(gè)數(shù)據(jù)庫(kù)工具了,下面這篇文章主要給大家介紹了關(guān)于idea連接SQL?Server數(shù)據(jù)庫(kù)的詳細(xì)圖文教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
MyBatis MapperProvider MessageFormat拼接批量SQL語(yǔ)句執(zhí)行報(bào)錯(cuò)的原因分析及解決辦法
這篇文章主要介紹了MyBatis MapperProvider MessageFormat拼接批量SQL語(yǔ)句執(zhí)行報(bào)錯(cuò)的原因分析及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-01-01
SQL Server日志恢復(fù)還原數(shù)據(jù)的操作流程
有時(shí)開發(fā)過程中由于不小心或者程序出現(xiàn)錯(cuò)誤導(dǎo)致錯(cuò)誤刪除數(shù)據(jù),或者由于計(jì)算機(jī)以外引起數(shù)據(jù)遭到破壞,這時(shí)候可以采用日志進(jìn)行恢復(fù),所以本文給大家介紹了SQL Server日志恢復(fù)還原數(shù)據(jù)的操作流程,需要的朋友可以參考下2024-09-09
Win10下安裝Sql Server 2014反復(fù)提示需安裝.NET Framework 3.5 SP1的解決方案
這篇文章主要介紹了Win10下安裝Sql Server 2014反復(fù)提示需安裝.NET Framework 3.5 SP1的解決方案,需要的朋友可以參考下2016-05-05

