group by的使用


group  by的使用

環境:win8.1  mysql5.7

“group  by”就是根據“by”指定的規則對數據進行分組,所謂的分組就是將一個“數據集”划分成若干個“小區域”,然后針對若干個“小區域”進行數據處理。

原始表:

eeaede6b-2e68-46a5-9a6b-5d2c28aba03c

簡單的group  by

示例1

select  *  from t_student  group  by  stu_subject;  

結果

e2a7acc7-87a9-4fb4-a470-b8735ba77a0e

可以看出,單獨地使用group  by的實際意義並不大,它只能顯示出沒組記錄的第一條記錄

group  by和order  by

示例2

select  * from t_student  group  by  stu_subject  order  by  stu_id;

結果

a957fd40-54b2-463d-ab86-94f03762d860

group  by + group_concat()

group_concat(字段名)可作為一個輸出字段使用,表示分組后,根據分組結果,使用group_concat()來放置每一組的某字段的值的集合

a555e460-3907-41bd-b1f1-702ef54e5421

group  by + 集合函數

比如假設我們要計算出表中每人的平均分

203d13e6-83f0-44b9-8476-b43a362cee40

假設我們要計算出表中單科每人超過80分的數量

a57aa5a9-880d-4cdc-affd-83695da80211

group + having

having:用來分組查詢后指定一些條件來輸出查詢結果,having作用和where類似,但是having只能用在group  by場合,並且必須位於group  by之后order  by之前

比如我們要查找表中平均分超過82分的人:

e839fd03-a1d4-4981-9d04-990f77bd5a68

順便也對比一下having和where的區別

舉個例子說明:

SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10;

SELECT user, MAX(salary) FROM users GROUP BY user WHERE MAX(salary)>10;

第一個sql語句可以執行,但是第二個會報錯

二者作用的對象不同,where子句作用於表和視圖,having作用於組。

where在分組和聚集計算之前選取輸入行(因而可以控制哪些行進入聚集計算),而having用於過濾group by的聚合,在分組和聚集之后選取分組的行。因為用聚集函數判斷那些行輸入給聚集運算是沒有意義的,所以where不能包含聚集函數,不能使用分組項目

HAVING子句可以引用總計函數,而WHERE子句不能引用

where就不能用在sum之類的函數上,比如這樣的錯誤,模仿前面吧having換成where

a83c903b-60f8-4758-93a2-f8cac17f8864

不要將HAVING用於應被用於WHERE子句的條目,盡管不出錯,但是mysql不推薦

stackoverflow上的一個例子:

https://stackoverflow.com/questions/2905292/where-vs-having

首先創建一個數據表:

CREATE TABLE `wherehaving` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `value` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `value` (`value`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

數據增加:

INSERT INTO `wherehaving`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);

5572396a-ec17-40e2-a575-e10f3fe2f8be

我們通過下面兩句來對比一下:

SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
上面這兩句都是可以運行的
SELECT `value` v FROM `table` WHERE `v`>5;

Error #1054 - Unknown column 'v' in 'where clause'

SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows

805375dc-c34a-4e97-9a40-91804d5e2dd4

where子句要求條件是表中的列,單having子句可以使用列或者別名。這是因為where子句在選擇之前過濾數據,但having子句在選擇之后過濾數據

詳細地看一下

d1835377-3d2c-4b20-87cb-583af9945641

db34ea3d-9249-4783-b3b9-6b31c1fa63a6

前面提到了having用於過濾group  by的聚合,也介紹了一些聚合函數,現在我們來看一下group by上常用的一些聚合函數

group和聚合函數

函數  作用   支持性
sum(列名) 求和  
max(列名) 最大值  
min(列名) 最小值  
avg(列名) 平均值  
first(列名) 第一條記錄 僅Access支持
last(列名) 最后一條記錄 僅Access支持
count(列名) 統計記錄數 注意和count(*)的區別

group by + with rollup

在最后新增一行,來記錄當前列里所有記錄的總和

01f30650-089c-409c-a2a1-f04a896d92bf

199f4bb7-b24b-4a12-b4e5-760c9fda8b59

 

Technorati Tags: mysql


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM