前言:
作者簡介:渴望力量的哈士奇 ,大家可以叫我 哈士奇 ,一位致力於 TFS - 全棧 賦能的博主
CSDN博客專家認證、新星計劃第三季全棧賽道 top_1 、華為雲享專家、阿裡雲專家博主
如果文章知識點有錯誤的地方,請指正!和大家一起學習,一起進步
人生格言:優於別人,並不高貴,真正的高貴應該是優於過去的自己。
如果感覺博主的文章還不錯的話,還請關注、點贊、收藏三連支持一下博主哦專欄系列(點擊解鎖) 學習路線(點擊解鎖) 知識定位 Python全棧白皮書 零基礎入門篇 以淺顯易懂的方式輕松入門,讓你徹底愛上Python的魅力。 語法進階篇 主要圍繞多線程編程、正則表達式學習、含貼近實戰的項目練習 。 自動化辦公篇 實現日常辦公軟件的自動化操作,節省時間、提高辦公效率。 自動化測試實戰篇 從實戰的角度出發,先人一步,快速轉型測試開發工程師。 數據庫開發實戰篇掌握關系型與非關系數據庫知識,提升數據庫實戰開發能力。 爬蟲入門與實戰更新中數據分析篇更新中前端入門+flask 全棧篇更新中django+vue全棧篇更新中拓展-人工智能入門更新中網絡安全之路 踩坑篇 記錄學習及演練過程中遇到的坑,便於後來居上者 網安知識掃盲篇 三天打魚,不深入了解原理,只會讓你成為腳本小子。 vulhub靶場漏洞復現 讓漏洞復現變得簡單,讓安全研究者更加專注於漏洞原理本身。 shell編程篇 不涉及linux基礎,最終案例會偏向於安全加固方向。 [待完結] WEB漏洞攻防篇2021年9月3日停止更新,轉戰先知社區等安全社區及小密圈 滲透工具使用集錦2021年9月3日停止更新,轉戰先知社區等安全社區及小密圈點點點工程師 測試神器 - Charles 軟件測試數據包抓包分析神器 測試神器 - Fiddler 一文學會 fiddle ,學不會倒立吃翔,稀得! 測試神器 - Jmeter 不僅是性能測試神器,更可用於搭建輕量級接口自動化測試框架。 RobotFrameWorkPython實現的自動化測試利器,該篇章僅介紹UI自動化部分。 Java實現UI自動化文檔寫於2016年,Java實現的UI自動化,仍有借鑒意義。 MonkeyRunner該工具目前的應用場景已不多,文檔已刪,為了排版好看才留著。
該章節我們來學習 “HAVING” 子句,這個 “HAVING” 子句要和 “GROUP BY” 聯合起來才能夠使用,不能單獨使用 “HAVING” 子句。接下來我們就看一看為什麼要在分組中引入 “HAVING” 的語法。
其實,引入 “HAVING” 子句也是出於一種無奈,因為有些條件查詢在使用 “GROUP BY” 的時候並不能滿足要求。就比如下面這個查詢語句。
查詢部門平均底薪超過2000的部門的編號,按照正常的邏輯應該這樣寫,見下方 SQL:
SELECT deptno FROM t_emp WHERE AVG(sal) >= 2000 GROUP BY deptno;
PS:從語法上來看,沒有什麼問題。但是執行的時候,一定會報錯語法是有錯誤的。這又是怎麼一回兒事兒呢?
PS:這是因為 "WHERE" 子句的執行順序優先級是高於 "GROUP BY" 的,一但 "WHERE" 子句中出現了聚合函數,那麼 MySQL 根本就不知道這個聚合函數按照什麼樣的范圍去統計匯總數值,所以說呢語法上就是有錯誤的。
PS:只有在 "GROUP BY" 執行完了之後,聚合函數才能確定下來范圍,然後統計出需要聚合計算的結果。所以上述的 SQL語句 錯就錯在了 WHERE 子句出現了聚合函數。
那麼如何解決這個問題呢?這個時候就該引入 “HAVING” 子句了。
SELECT deptno FROM t_emp GROUP BY deptno HAVING AVG(sal);
就是因為 WHERE 子句在 GROUP BY 子句之前,這時候 WHERE 子句的聚合函數不知道按照什麼范圍去統計數據,所以必須要將 WHERE 子句的聚合函數拿走,放在 GROUP BY 函數後面等待得出統計范圍之後,再來計算統計數據。
PS:"HAVING 子句是緊跟著 "GROUP BY" 使用的,它不能獨立使用。在使用 "HAVING" 進行聚合函數統計的時候,"GROUP BY" 已經確定好統計范圍了。
“HAVING” 子句與 “WHERE” 子句的用途差不多,也是用來做條件篩選的。只是 "HAVING 子句是寫在 “GROUP BY” 後面使用的,“GROUP BY” 執行完之後, “HAVING” 子句才會執行,所以 “HAVING” 子句中我們就可以使用
聚合函數
做條件判斷了。
SQL 語句 "GROUP_CONCAT" 示例如下:(查詢每個部門中,1982年以後入職的員工超過2個人的部門編號)
SELECT deptno FROM t_emp WHERE hiredate >= "1982-01-01" GROUP BY deptno HAVING COUNT(*) >= 2 ORDER BY deptno ASC; -- 結果集如果是無序的,可以使用 ORDER BY 進行排序,如果是有序的,也可以將 ORDER BY 去掉。
在使用 "GROUP BY" 子句的時候,按照數字 "1" 分組。MySQL 會依據 "SELECT" 子句中的第一個列的字段進行分組,這是的 "HAVING" 子句也可以正常使用。
SQL 語句演示案例如下:
SELECT deptno, COUNT(*) FROM t_emp GROUP BY 1 ;
SELECT deptno, COUNT(*) FROM t_emp GROUP BY 1 HAVING deptno IN(10, 20); -- 正常情況下,如果不用 "HAVING" 子句的時候,我們是可以使用 "WHERE" 子句的。 -- 雖然 "WHERE" 子句 與 "HAVING" 子句功能相近都是可以過濾篩選條件的,但是不推薦使用 "HAVING" 子句進行這樣的條件過濾。 -- 因為 "WHERE" 子句是先於 "GROUP BY" 子句去執行的,先篩選出一部分數據,然後再針對符合條件的數據去做分組、聚合的統計計算。 -- 如此一來,數據量就變少了很多。但是如果將篩選條件寫在 "HAVING" 子句裡面,這個數據量在很大的時候,使用 "HAVING" 篩選是很不值得的。
PS:所以說呢,"WHERE" 子句是不能夠被 "HAVING" 替代的,引入 "HAVING" 子句的目的就是使用聚合函數和普通的數據進行條件判斷的時候,必須使用 "HAVING" 子句,在其他情況下,該使用 "WHERE" 子句,還是使用 "WHERE" 子句的好。