MySQL初學(xué)者可以告別分組聚合查詢的困擾了
1.分組查詢的原理圖
對(duì)上述原始數(shù)據(jù),按照DEPARTMENT_ID
(員工id)分組統(tǒng)計(jì)SALARY
(薪水)的平均值。
上述原理寫成代碼,應(yīng)該怎么寫呢?
select department_id,avg(salary) from test group by department_id;
可以清楚地看到,使用department_id
進(jìn)行分組后,系統(tǒng)默認(rèn)將department_id
相同的號(hào)所在的行,分配在一起,你有幾個(gè)不同的department_id
,就會(huì)分為幾組,每個(gè)組中的數(shù)據(jù)行數(shù),不一定都要相同。
當(dāng)自動(dòng)分配完成后,會(huì)根據(jù)你所寫的分組函數(shù),進(jìn)行組內(nèi)運(yùn)算。
也就是說,你使用的是sum()
函數(shù),就會(huì)組內(nèi)求和;當(dāng)你使用的是avg()
函數(shù),就會(huì)組內(nèi)求平均值;當(dāng)你使用的是count()
函數(shù),就會(huì)進(jìn)行組內(nèi)計(jì)數(shù);當(dāng)你使用的是max()
函數(shù),就會(huì)進(jìn)行組內(nèi)求最大值;你使用的是min()
函數(shù),就會(huì)進(jìn)行組內(nèi)求最小值。
2.group by關(guān)鍵字語法詳解
有些小白在學(xué)習(xí)MySQL的過程中,很多都是在group by
關(guān)鍵字這個(gè)地方卡殼。于是我希望自己能夠用白話圖文的方式,讓你真正搞明白這個(gè)關(guān)鍵字的含義。
group by
是用于分組查詢的關(guān)鍵字,一般是配合sum(),avg(),count(),max(),min()
聚合函數(shù)使用的。也就是說SQL語句中只要有group by
,那么在select后面的展示字段中一般會(huì)有聚合函數(shù)(5個(gè)聚合函數(shù))中的一個(gè)或多個(gè)函數(shù)出現(xiàn)。觀察上圖,有一點(diǎn)你需要記住,你用表中的字段A進(jìn)行分組后,一般就需要對(duì)表中的其它字段,使用聚合函數(shù),這樣意義更大,而不是還對(duì)字段A使用聚合函數(shù),沒啥太大意義。
我們?cè)偎伎枷旅孢@個(gè)問題!
當(dāng)SQL語句中使用了group by后,在select后面一定有一個(gè)字段使用了聚合函數(shù)(5個(gè)聚合函數(shù))。但是除了這個(gè)聚合函數(shù),select后面還可以添加其他什么字段嗎?
答案肯定是可以的!但是該字段有一定的限制,并不是什么字段都可以。也就是說,當(dāng)SQL語句中使用了group by
關(guān)鍵字后,select后面除了聚合函數(shù),就只能是group by
后面出現(xiàn)的字段。也就是圖中的字段A,select后面只能存在group by
后面的字段。
3.一個(gè)簡單的分組查詢的案例
案例 :按照部門編號(hào)deptno分組,統(tǒng)計(jì)每個(gè)部門的平均工資。
select deptno,avg(sal) avgs from emp group by deptno
結(jié)果如下:
4.分組前篩選和分組后篩選
這個(gè)知識(shí)點(diǎn)就是要帶著大家理解一下,什么使用該用where篩選?什么時(shí)候該用having篩選?這個(gè)知識(shí)點(diǎn)對(duì)于學(xué)習(xí)MySQL的小白來說,也是一個(gè)棘手的事兒。不用擔(dān)心,跟著黃同學(xué)學(xué)MySQL,沒有學(xué)不會(huì)的。
1)原始表和結(jié)果集的概念
原始表指的是數(shù)據(jù)庫中真正存在的那個(gè)表,使用【select * from 表名】查詢出來的就是原始表信息。結(jié)果集指的是在SQL語句中,添加其它任何一個(gè)限制條件,最終展示給我們表,都是結(jié)果集。添加不同的限制條件,查詢出來的結(jié)果集也是不同的。原始表只有一個(gè),結(jié)果集卻是各種各樣的。
2)黃同學(xué)支大招
只要是需求中,涉及到聚合函數(shù)做條件的情況,一定是分組后的篩選。能用分組前篩選的,就優(yōu)先考慮分組前的篩選。(考慮到性能問題)
3)案例講解
原始數(shù)據(jù)集如下:
① 分組前篩選
習(xí)題一:查詢姓名中包含S字符的,每個(gè)部門的工資之和。
習(xí)題二:查詢工資大于2000的,不同部門的平均工資。
② 分組后篩選
習(xí)題一:查詢部門員工個(gè)數(shù)大于3的部門編號(hào)和員工個(gè)數(shù)。
習(xí)題二:查詢每個(gè)部門最高工資大于3000的部門編號(hào)和最高工資。
③ 分組前篩選和分組后篩選合用
習(xí)題:查詢1981年入職的,不同部門間工資的平均值大于2000的部門編號(hào)和平均值。
5.分組查詢(按函數(shù)分組)
習(xí)題:按員工姓名的長度分組,查詢每一組的員工個(gè)數(shù),篩選員工個(gè)數(shù)>3的有哪些?
select length(ename) len,count(*) counts from emp group by len having counts > 3;
結(jié)果如下:
6.分組查詢(按多個(gè)字段分組)
習(xí)題:查詢每個(gè)部門每個(gè)工種的員工的平均工資。
7.group by和order by,一對(duì)老搭檔
習(xí)題一:查詢每個(gè)部門的員工的平均工資,按照平均工資降序。
習(xí)題二:查詢每個(gè)部門的員工的平均工資,按照平均工資升序。
8.分組查詢的總結(jié)
1)分組函數(shù)做條件,肯定是放在having
子句中。
2)能用分組前篩選的,就優(yōu)先考慮使用分組前篩選。(where
篩選)
3)group by
子句支持單個(gè)字段分組,多個(gè)字段分組(多個(gè)字段之間用逗號(hào)隔開沒有順序要求),還支持函數(shù)分組(用的較少)。
以上就是MySQL初學(xué)者可以告別分組聚合查詢的困擾了的詳細(xì)內(nèi)容,更多關(guān)于MySQL分組聚合查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql installer web community 5.7.21.0.msi安裝圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql installer web community 5.7.21.0.msi,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09使用MySQL Workbench構(gòu)建ER圖的詳細(xì)教程
ER圖又稱實(shí)體-聯(lián)系圖(Entity Relationship Diagram),提供了表示實(shí)體類型、屬性和聯(lián)系的方法,用來描述現(xiàn)實(shí)世界的概念模型,MySQL?Workbench是一個(gè)強(qiáng)大的數(shù)據(jù)庫設(shè)計(jì)工具,提供了便捷的數(shù)據(jù)導(dǎo)入導(dǎo)出功能,本文介紹了使用MySQL Workbench構(gòu)建ER圖的詳細(xì)教程2024-06-06mysql數(shù)據(jù)庫視圖和執(zhí)行計(jì)劃實(shí)戰(zhàn)案例
這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫視圖和執(zhí)行計(jì)劃的相關(guān)資料,在使用MySQL過程中視圖和執(zhí)行計(jì)劃是一個(gè)很好的工具,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02mysql慢查詢優(yōu)化之從理論和實(shí)踐說明limit的優(yōu)點(diǎn)
今天小編就為大家分享一篇關(guān)于mysql慢查詢優(yōu)化之從理論和實(shí)踐說明limit的優(yōu)點(diǎn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04mysql出現(xiàn)Error performing load command的解決方法
一般就是數(shù)據(jù)庫表字段類型問題,大家參考下面的方法解決下2008-06-06