本篇內(nèi)容主要講解“SQL分組函數(shù)group by和聚合函數(shù)COUNT、MAX、MIN、AVG、SUM是什么/用法是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“SQL分組函數(shù)group by和聚合函數(shù)COUNT、MAX、MIN、AVG、SUM是什么/用法是什么”吧!
10年積累的做網(wǎng)站、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先制作網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有謝家集免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
1 分組聚合的原因
SQL中分組函數(shù)和聚合函數(shù)之前的文章已經(jīng)介紹過(guò),單說(shuō)這兩個(gè)函數(shù)有可能比較好理解,分組函數(shù)就是group by,聚合函數(shù)就是COUNT、MAX、MIN、AVG、SUM。
拿上圖中的數(shù)據(jù)進(jìn)行解釋?zhuān)僭O(shè)按照product_type這個(gè)字段進(jìn)行分組,分組之后結(jié)果如下圖。
SELECT product_type from productgroup by product_type
從圖中可以看出被分為了三組,分別為廚房用具、衣服和辦公用品,就相當(dāng)于對(duì)product_type這個(gè)字段進(jìn)行了去重,確實(shí)group by函數(shù)有去重的作用。
SELECT DISTINCT product_type from product
假設(shè)分組之后,我想看一下價(jià)格,也就是sale_price這個(gè)字段的值,按照如下這個(gè)寫(xiě)法,會(huì)報(bào)如下錯(cuò)誤。
SELECT product_type,sale_price from productgroup by product_type
這是為什么呢?原表按照product_type分組之后,廚房用具對(duì)應(yīng)4個(gè)值,衣服對(duì)應(yīng)2個(gè)值,辦公用品對(duì)應(yīng)2個(gè)值,這就是在取sale_price這個(gè)字段的時(shí)候?yàn)槭裁磮?bào)錯(cuò)了,一個(gè)空格中不能填入多個(gè)值,這時(shí)候就可以用聚合函數(shù)了,比如求和,求平均,求最大最小值,求行數(shù)。聚合之后的值就只有一個(gè)值了。
SELECT product_type,sum(sale_price),avg(sale_price),count(sale_price),max(sale_price) from productgroup by product_type
對(duì)于多個(gè)字段的分組,其原理是一樣的。從上述中記住兩點(diǎn):分組去重和分組聚合。
2 distinct和group by去重的區(qū)別 Distinct 和group by 設(shè)計(jì)時(shí)側(cè)重點(diǎn)不一樣
distinct只是為了去重,而group by是為了聚合統(tǒng)計(jì)的。
兩者都有去重的效果,但是執(zhí)行的效率不一樣
單個(gè)字段去重
--DISTINCTSELECT distinct product_type from product--GROUP BYselect product_type from productGROUP BY product_type
多個(gè)字段去重
--DISTINCTSELECT distinct product_name, product_type from product--GROUP BYselect product_name, product_type from productGROUP BY product_name, product_type
執(zhí)行效率
select <列名1>,<列名2>from<表名>where 查詢條件group by 分組類(lèi)別having 對(duì)分組結(jié)果指定條件order by <列名> (desc)limit 數(shù)字
SQL語(yǔ)言的運(yùn)行順序,先執(zhí)行上圖中的第一步,然后再執(zhí)行select子句,最后對(duì)結(jié)果進(jìn)行篩選。distinct是在select子句中,而group by在第一步中,所以group by去重比distinct去重在效率上要高。
sql中聚合函數(shù)和分組函數(shù)
The COUNT operator is usually used in combination with a GROUP BY clause. It is one of the SQL “aggregate” functions, which include AVG (average) and SUM.
COUNT運(yùn)算符通常與GROUP BY子句結(jié)合使用。 它是SQL“聚合”功能之一,其中包括AVG(平均)和SUM。
This function will count the number of rows and return that count as a column in the result set.
此函數(shù)將對(duì)行數(shù)進(jìn)行計(jì)數(shù),并將該計(jì)數(shù)作為列返回到結(jié)果集中。
Here are examples of what you would use COUNT for:
以下是將COUNT用于以下用途的示例:
Counting all rows in a table (no group by required)
計(jì)算表中的所有行(不需要按組)
Counting the totals of subsets of data (requires a Group By section of the statement)
計(jì)算數(shù)據(jù)子集的總數(shù)(需要語(yǔ)句的“分組依據(jù)”部分)
For reference, here is the current data for all the rows in our example student database.
作為參考,這是示例學(xué)生數(shù)據(jù)庫(kù)中所有行的當(dāng)前數(shù)據(jù)。
select studentID, FullName, programOfStudy, sat_score from student; -- all records with fields of interest
This SQL statement provides a count of all rows. Note that you can give the resulting COUNT column a name using “AS”.
該SQL語(yǔ)句提供所有行的計(jì)數(shù)。 請(qǐng)注意,您可以使用“ AS”為所得的COUNT列命名。
select count(*) AS studentCount from student; -- count of all records
Here we get a count of students in each field of study.
在這里,我們得到了每個(gè)學(xué)習(xí)領(lǐng)域的學(xué)生人數(shù)。
select studentID, FullName, count(*) AS studentCount from the student table with a group by programOfStudy;
Here we get a count of students with the same SAT scores.
在這里,我們得到了具有相同SAT分?jǐn)?shù)的學(xué)生人數(shù)。
select studentID, FullName, count(*) AS studentCount from the student table with a group by sat_score;
Here is an example using the campaign funds table. This is a sum total of the dollars in each transaction and the number of contributions for each political party during the 2016 US Presidential Campaign.
這是使用廣告系列資金表的示例。 這是2016年美國(guó)總統(tǒng)大選期間每筆交易的總金額和每個(gè)政黨的捐款額。
select Specific_Party, Election_Year, format(sum(Total_$),2) AS contribution$Total, count(*) AS numberOfContributions from combined_party_data group by Specific_Party,Election_Year having Election_Year = 2021;
As with all of these things there is much more to it, so please see the manual for your database manager and have fun trying different tests yourself.
關(guān)于所有這些事情,還有很多事情要做,所以請(qǐng)參閱數(shù)據(jù)庫(kù)管理員手冊(cè),并嘗試自己進(jìn)行不同的測(cè)試,這很有趣。
group by可以根據(jù)給定數(shù)據(jù)列的每個(gè)成員對(duì)查詢結(jié)果進(jìn)行分組統(tǒng)計(jì),最終得到一個(gè)匯總表。
group by幾個(gè)比較重要的約束:
(1)select字句中的列名和having或where中的列名必須為分組列或列函數(shù).列函數(shù)對(duì)于group by字句定義的每個(gè)組返回一個(gè)結(jié)果
(2)group by一般和聚合函數(shù)一使用才有意義,比如count,sum,avg等,使用group by 的兩個(gè)要素:
(3)出現(xiàn)在select后面的字段,要么是聚合函數(shù)中的,要么是group by中的.
(4)要篩選結(jié)果,可以先使用where再用group by或者先用group by再用having
第(4)項(xiàng)根據(jù)各個(gè)數(shù)據(jù)庫(kù)不同不一定都能適用,因此最好不要這樣用,老老實(shí)實(shí)用having
(一)聚合函數(shù)是指對(duì)列上的數(shù)據(jù)進(jìn)行操作,起到統(tǒng)計(jì)的作用。前面的函數(shù)都是最一行記錄進(jìn)行操作得到的數(shù)據(jù),包括前面的日期函數(shù)、數(shù)學(xué)函數(shù)、字符函數(shù)、轉(zhuǎn)換函數(shù)以及條件判斷函數(shù)。
常用的聚合函數(shù)有:count、sum、avg、max、min。這5個(gè)函數(shù)個(gè)起到統(tǒng)計(jì)記錄數(shù)、求和、求平均值、求最大值、最小值的作用。
Count:count函數(shù)對(duì)查詢的數(shù)據(jù)統(tǒng)計(jì)記錄數(shù)量,這個(gè)函數(shù)不對(duì)字段值為NULL的值進(jìn)行統(tǒng)計(jì),也就是說(shuō)某個(gè)查詢的字段有NULL值,則NULL值的數(shù)量會(huì)被減除,這樣就可以不對(duì)NULL設(shè)置查詢條件了。
如果要對(duì)NULL值設(shè)置查詢,則可以用WHERE 字段 IS NULL來(lái)作為條件。
Sum:sum函數(shù)求和,只能對(duì)數(shù)值型數(shù)據(jù)操作,也會(huì)忽略NULL值。舉例:
Select sum(考試成績(jī)) as 計(jì)算機(jī)總成績(jī)
From score
Where 課號(hào) in (select 課號(hào) from course where 課名=”計(jì)算機(jī)”)
Avg:求平均值,參數(shù)也必須為數(shù)值型字段名或者結(jié)果為數(shù)值的表達(dá)式。
Max、min:這兩個(gè)函數(shù)求最大值和最小值,但是不能放到WHERER中以及SELECT子句的字段名位置上。
例:select max(x1) from y where max(x2) in(select…) 錯(cuò)誤的語(yǔ)法。
Select x1 from y where x2=max(x3) 錯(cuò)誤的語(yǔ)法。
select max(x1) from y where x2) in(select max(x2,)…) 正確。
注:5個(gè)函數(shù)都可以使用distinct統(tǒng)計(jì)不重復(fù)的值:
Select count(distinct(課程)) as 課程數(shù)量 from 課程表
Access和MySQL不能將distinct放置到參數(shù)中,解決方法:查詢distinct保存為新表INTO語(yǔ)句,然后再使用count。
(二)數(shù)據(jù)分組是指將數(shù)據(jù)表中的數(shù)據(jù)按照指定字段的不同值分為很多組,使用group by 子句進(jìn)行操作。
Group by通常不直接查詢所有字段并且分組,group by和select后分組字段和查詢字段通常一致。因?yàn)閟elect * from y group by x 會(huì)產(chǎn)生錯(cuò)誤,通常對(duì)某個(gè)字段分組并且利用聚合函數(shù)計(jì)算分組得到的值。
聚合函數(shù)和分組的組合并設(shè)置查詢條件:可以對(duì)一個(gè)字段分組并且設(shè)定條件,這樣得到的結(jié)果將會(huì)是計(jì)算分組并且滿足條件的值。例:
查詢各個(gè)所屬院系中所有男生的值:
Select 所屬院系,count(*) as 男生人數(shù)from student where 性別='男' group by 所屬院系
查詢直方圖:利用replicate()函數(shù),將分組得到的數(shù)據(jù)作為次數(shù),重復(fù)一個(gè)設(shè)置的符號(hào)。
排序查詢結(jié)果:order by語(yǔ)句,ASC、DESC 位于group by之后
Case表達(dá)式和group by的結(jié)合:
Select 所屬院系,count(case
When 性別='男' then 1
Else null
End ) as 男生人數(shù),
count(case
When 性別='女' then 1
Else null
End ) as 女生人數(shù)
From student group by 所屬院系
Hanving子句設(shè)置分組group by的分組查詢條件。
Having子句總是和group by子句結(jié)合使用,依賴于分組,可以在having中使用聚合函數(shù);where 也可以設(shè)定條件,但是不依賴于分組的字段,但是不能使用聚合函數(shù)。
Select 學(xué)號(hào),sum(考試成績(jī)) as 考試總成績(jī) from score group by 學(xué)號(hào) having sum(考試成績(jī))>400 order by 考試總成績(jī) desc
到此,相信大家對(duì)“SQL分組函數(shù)group by和聚合函數(shù)COUNT、MAX、MIN、AVG、SUM是什么/用法是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!