程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

〖Python 數據庫開發實戰 - MySQL篇⑲〗- Having子句的使用

編輯:Python
萬葉集 隱約雷鳴,陰霾天空。 但盼風雨來,能留你在此。


前言
作者簡介:渴望力量的哈士奇 ,大家可以叫我 哈士奇 ,一位致力於 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 子句的特殊用法

該章節我們來學習 “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 子句的用途


“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 去掉。


HAVING 子句的特殊用法


在使用 "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" 子句的好。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved