欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL學習之分組查詢的用法詳解

 更新時間:2022年07月28日 08:39:41   作者:不渴望力量的哈士奇  
這篇文章主要為大家詳細介紹一下MySQL中分組查詢的使用,文中的示例代碼講解詳細,對我們學習MySQL有一定幫助,需要的可以參考一下

該章節(jié)來開始學習分組查詢,上一章節(jié)我們學習了聚合函數(shù),默認統(tǒng)計的是全表范圍內(nèi)的數(shù)據(jù),配合上 WHERE 就能夠縮小統(tǒng)計的范圍了。但是這并不能滿足我們的要求,比如說我們按照之前的數(shù)據(jù)表查詢每個部門的平均底薪是多少?這樣的記錄就需要針對部門編號進行分組了。根據(jù)分組的情況統(tǒng)計分組內(nèi)的最大值、最小值、平均值等等。如此就能夠滿足剛剛提到的 “查詢每個部門的平均底薪” 這樣的需求了,另外,“分組查詢” 是 SQL 中很重要的一個語法,大家一定要好好掌握它。

為什么要分組

上面也提到,聚合函數(shù)默認是對全表范圍內(nèi)的數(shù)據(jù)做統(tǒng)計,在一些特定的場景下不太適用,就比如 對數(shù)據(jù)分別進行統(tǒng)計的 場景。

由于聚合函數(shù)的這樣的局限性,也就產(chǎn)生了分組的概念,于是就有了分組的語法。

分組的語法是通過 “GROUP BY” 來實現(xiàn)的。

"GROUP BY" 子句的作用是通過一定的規(guī)則將一個數(shù)據(jù)集劃分成若干個小的區(qū)域,然后再針對每個小區(qū)域分別進行數(shù)據(jù)匯總處理

分組語句演示案例:(計算每一個部門的平均底薪)

SELECT deptno, AVG(sal) 
FROM t_emp
GROUP BY deptno;

-- 利用 GROUP BY 子句將 deptno 進行分組,在利用 AVG() 聚合函數(shù)計算各個 deptno(部門) 的平均月薪 

這里的小數(shù),可能看著不太舒服,我們可以使用 ROUND() 函數(shù)將 平均工資四舍五入變成整數(shù)。

SELECT deptno, ROUND(AVG(sal))
FROM t_emp
GROUP BY deptno;

逐級分組

有的時候僅有大的分組還不夠,還需要在大的分組里面劃分出曉得分組,然后再執(zhí)行統(tǒng)計計算,于是就有了逐級分組。

什么是逐級分組? MySQL 數(shù)據(jù)庫支持多列分組條件,執(zhí)行的時候按照多列去依次執(zhí)行,這就是逐級分組。

示例如下:(查詢每個部門里,每種職位的人員數(shù)量和平均工資。)

SELECT deptno, job, COUNT(*), AVG(sal)
FROM t_emp
GROUP BY deptno, job
ORDER BY deptno;

-- 首先要按照部門對員工進行分組,在部門里,還要按照職務去分組; 就是 "GROUP BY deptno, job"
-- 然后再用 聚合函數(shù)的 AVG 計算平均的月薪; 就是 "SELECT deptno, job, COUNT(*), AVG(sal)"
-- 最后按照 deptno(部門編號) 排序,使用 ORDER BY 進行升序排序。

逐級分組對 SELECT 子句的要求

查詢語句中如果包含有 “GROUP BY” 子句,那么 “SELECT” 子句中的內(nèi)容就必須要遵守以下規(guī)定
"SELECT" 子句中可以包含聚合函數(shù),或者 "GROUP BY" 子句的分組列,其余內(nèi)容均不可以出現(xiàn)在 "SELECT" 子句中
SQL 示例如下:(遵守規(guī)定示例)

SELECT deptno, COUNT(*), AVG(sal)
FROM t_emp
GROUP BY deptno;

SQL 示例如下:(不遵守規(guī)定示例)

SELECT deptno, COUNT(*), AVG(sal), sal
FROM t_emp
GROUP BY deptno;

-- 這條語句是無法執(zhí)行成功的,因為在 "SELECT" 子句中,有一個 "sal" 的字段
-- 這個 "sal" 字段 沒有在 GROUP BY 中去分組,本身也沒有聚合函數(shù),就是一個普通的字段

-- 造成無法執(zhí)行、報錯的原因是因為,"SELECT deptno, COUNT(*), AVG(sal), sal" 
-- 中的 "deptno、COUNT(*)、AVG(sal)" 返回的是 "GROUP BY" 一個結(jié)果集分組的同級信息;
-- 而 "sal" 字段又是多條匹配記錄,前后肯定是匹配不上的,所以這個 SQL 語句是無法執(zhí)行成功的。

-- 同時因為標準的 SQL 規(guī)定,對表進行聚合查詢的時候,只能在 SELECT 子句中寫下面 3 種內(nèi)容:
-- 通過 GROUP BY 子句指定的聚合鍵、聚合函數(shù)(SUM 、AVG 等)、常量。
-- 所以在使用 SQL 語句記性數(shù)據(jù)表查詢時,一定要嚴格遵守 SQL 的語法規(guī)定。

對分組結(jié)果集再次做匯總計算

來看一個示例:(查詢 員工表中各個部門的人數(shù),各個部門的平均月薪、最大月薪、最小月薪、按照員工號進行排序,并針對各個部門再次做一個匯總統(tǒng)計。)

SELECT deptno, COUNT(*), AVG(sal), MAX(sal), MIN(sal)
FROM t_emp
GROUP BY deptno
WITH ROLLUP;

-- 這里的 "WITH ROLLUP" 子句就是針對 "deptno"分組的結(jié)果集,再一次的進行匯總計算

PS:該 SQL 語句主要是為了體現(xiàn) "WITH ROLLUP" 關鍵字的效果,是對聚合函數(shù)的再次執(zhí)行匯總計算。

GROUP_CONCAT 函數(shù)

上文中的 "逐級分組對 SELECT 子句的要求" 部分的時候解釋了為什么會有這樣的要求,就是聚合函數(shù)返回一條記錄的結(jié)果與非分組字段的多條記錄的結(jié)果無法匹配。

如果想要想要匹配,那就要把非分組的字段的多條記錄轉(zhuǎn)換成一條記錄,MySQL 提供的 GROUP_CONCAT 函數(shù)就可以將分組查詢中的非分組字段中的多條記錄合并成一條記錄。

SQL 語句 "GROUP_CONCAT" 示例如下:(查詢每個部門內(nèi)底薪超過 2000元的人數(shù)和員工姓名,這里的員工姓名就是非分組的字段)

SELECT deptno, GROUP_CONCAT(ename), AVG(sal),COUNT(*)
FROM t_emp
WHERE sal >= 2000
GROUP BY deptno;

-- 查詢員工表,篩選條件為月薪大于等于 2000 ,以 "deptno" 為分組
-- "ename" 字段沒有分組,但是我們使用 "GROUP_CONCAT" 函數(shù)將 "ename" 的多條返回記錄轉(zhuǎn)換為一條記錄

GROUP BY 子句的執(zhí)行順序

截止到目前為止,我們所學習的所有子句,執(zhí)行順序如下:

FROM ---> WHERE ---> GROUP BY ---> SELECT ---> ORDER BY ---> LIMIT

到此這篇關于MySQL學習之分組查詢的用法詳解的文章就介紹到這了,更多相關MySQL分組查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論