溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

發(fā)布時間:2020-12-01 16:19:08 來源:億速云 閱讀:939 作者:Leah 欄目:開發(fā)技術(shù)

SQL語句中分組函數(shù)與聚合函數(shù)有哪些?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

1 分組聚合的原因

SQL中分組函數(shù)和聚合函數(shù)之前的文章已經(jīng)介紹過,單說這兩個函數(shù)有可能比較好理解,分組函數(shù)就是group by,聚合函數(shù)就是COUNT、MAX、MIN、AVG、SUM。

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

拿上圖中的數(shù)據(jù)進(jìn)行解釋,假設(shè)按照product_type這個字段進(jìn)行分組,分組之后結(jié)果如下圖。

SELECT product_type from productgroup by product_type

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

從圖中可以看出被分為了三組,分別為廚房用具、衣服和辦公用品,就相當(dāng)于對product_type這個字段進(jìn)行了去重,確實group by函數(shù)有去重的作用。

SELECT DISTINCT product_type from product

假設(shè)分組之后,我想看一下價格,也就是sale_price這個字段的值,按照如下這個寫法,會報如下錯誤。

SELECT product_type,sale_price from productgroup by product_type

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

這是為什么呢?原表按照product_type分組之后,廚房用具對應(yīng)4個值,衣服對應(yīng)2個值,辦公用品對應(yīng)2個值,這就是在取sale_price這個字段的時候為什么報錯了,一個空格中不能填入多個值,這時候就可以用聚合函數(shù)了,比如求和,求平均,求最大最小值,求行數(shù)。聚合之后的值就只有一個值了。

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

SELECT product_type,sum(sale_price),avg(sale_price),count(sale_price),max(sale_price) from productgroup by product_type

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

對于多個字段的分組,其原理是一樣的。從上述中記住兩點:分組去重和分組聚合。

2 distinct和group by去重的區(qū)別 Distinct 和group by 設(shè)計時側(cè)重點不一樣

distinct只是為了去重,而group by是為了聚合統(tǒng)計的。

兩者都有去重的效果,但是執(zhí)行的效率不一樣

單個字段去重

--DISTINCTSELECT distinct product_type from product--GROUP BYselect product_type from productGROUP BY product_type

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

多個字段去重

--DISTINCTSELECT distinct product_name, product_type from product--GROUP BYselect product_name, product_type from productGROUP BY product_name, product_type

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

執(zhí)行效率

select <列名1>,<列名2>from<表名>where 查詢條件group by 分組類別having 對分組結(jié)果指定條件order by <列名> (desc)limit 數(shù)字

SQL語句中分組函數(shù)與聚合函數(shù)有哪些

SQL語言的運行順序,先執(zhí)行上圖中的第一步,然后再執(zhí)行select子句,最后對結(jié)果進(jìn)行篩選。distinct是在select子句中,而group by在第一步中,所以group by去重比distinct去重在效率上要高。

sql中聚合函數(shù)和分組函數(shù)_SQL選擇計數(shù)聚合函數(shù)-語法示例解釋

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運算符通常與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ù)將對行數(shù)進(jìn)行計數(shù),并將該計數(shù)作為列返回到結(jié)果集中。

Here are examples of what you would use COUNT for:

以下是將COUNT用于以下用途的示例:

Counting all rows in a table (no group by required)
計算表中的所有行(不需要按組)
Counting the totals of subsets of data (requires a Group By section of the statement)
計算數(shù)據(jù)子集的總數(shù)(需要語句的“分組依據(jù)”部分)
For reference, here is the current data for all the rows in our example student database.

作為參考,這是示例學(xué)生數(shù)據(jù)庫中所有行的當(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語句提供所有行的計數(shù)。 請注意,您可以使用“ AS”為所得的COUNT列命名。

select count(*) AS studentCount from student; -- count of all records

Here we get a count of students in each field of study.

在這里,我們得到了每個學(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年美國總統(tǒng)大選期間每筆交易的總金額和每個政黨的捐款額。

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)于所有這些事情,還有很多事情要做,所以請參閱數(shù)據(jù)庫管理員手冊,并嘗試自己進(jìn)行不同的測試,這很有趣。

sql語句聚合函數(shù)和分組操作的注意事項

group by可以根據(jù)給定數(shù)據(jù)列的每個成員對查詢結(jié)果進(jìn)行分組統(tǒng)計,最終得到一個匯總表。

group by幾個比較重要的約束:

(1)select字句中的列名和having或where中的列名必須為分組列或列函數(shù).列函數(shù)對于group by字句定義的每個組返回一個結(jié)果
(2)group by一般和聚合函數(shù)一使用才有意義,比如count,sum,avg等,使用group by 的兩個要素:
(3)出現(xiàn)在select后面的字段,要么是聚合函數(shù)中的,要么是group by中的.
(4)要篩選結(jié)果,可以先使用where再用group by或者先用group by再用having

第(4)項根據(jù)各個數(shù)據(jù)庫不同不一定都能適用,因此最好不要這樣用,老老實實用having

SQL聚合函數(shù)和分組數(shù)據(jù)語法及概述

(一)聚合函數(shù)是指對列上的數(shù)據(jù)進(jìn)行操作,起到統(tǒng)計的作用。前面的函數(shù)都是最一行記錄進(jìn)行操作得到的數(shù)據(jù),包括前面的日期函數(shù)、數(shù)學(xué)函數(shù)、字符函數(shù)、轉(zhuǎn)換函數(shù)以及條件判斷函數(shù)。

常用的聚合函數(shù)有:count、sum、avg、max、min。這5個函數(shù)個起到統(tǒng)計記錄數(shù)、求和、求平均值、求最大值、最小值的作用。

Count:count函數(shù)對查詢的數(shù)據(jù)統(tǒng)計記錄數(shù)量,這個函數(shù)不對字段值為NULL的值進(jìn)行統(tǒng)計,也就是說某個查詢的字段有NULL值,則NULL值的數(shù)量會被減除,這樣就可以不對NULL設(shè)置查詢條件了。
如果要對NULL值設(shè)置查詢,則可以用WHERE 字段 IS NULL來作為條件。
Sum:sum函數(shù)求和,只能對數(shù)值型數(shù)據(jù)操作,也會忽略NULL值。舉例:
Select sum(考試成績) as 計算機(jī)總成績
From score
Where 課號 in (select 課號 from course where 課名=”計算機(jī)”)
Avg:求平均值,參數(shù)也必須為數(shù)值型字段名或者結(jié)果為數(shù)值的表達(dá)式。
Max、min:這兩個函數(shù)求最大值和最小值,但是不能放到WHERER中以及SELECT子句的字段名位置上。
例:select max(x1) from y where max(x2) in(select…) 錯誤的語法。
Select x1 from y where x2=max(x3) 錯誤的語法。
select max(x1) from y where x2) in(select max(x2,)…) 正確。
注:5個函數(shù)都可以使用distinct統(tǒng)計不重復(fù)的值:
Select count(distinct(課程)) as 課程數(shù)量 from 課程表
Access和mysql不能將distinct放置到參數(shù)中,解決方法:查詢distinct保存為新表INTO語句,然后再使用count。

(二)數(shù)據(jù)分組是指將數(shù)據(jù)表中的數(shù)據(jù)按照指定字段的不同值分為很多組,使用group by 子句進(jìn)行操作。

Group by通常不直接查詢所有字段并且分組,group by和select后分組字段和查詢字段通常一致。因為select * from y group by x 會產(chǎn)生錯誤,通常對某個字段分組并且利用聚合函數(shù)計算分組得到的值。
聚合函數(shù)和分組的組合并設(shè)置查詢條件:可以對一個字段分組并且設(shè)定條件,這樣得到的結(jié)果將會是計算分組并且滿足條件的值。例:
查詢各個所屬院系中所有男生的值:
Select 所屬院系,count(*) as 男生人數(shù)from student where 性別='男' group by 所屬院系
查詢直方圖:利用replicate()函數(shù),將分組得到的數(shù)據(jù)作為次數(shù),重復(fù)一個設(shè)置的符號。
排序查詢結(jié)果:order by語句,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é)號,sum(考試成績) as 考試總成績 from score group by 學(xué)號 having sum(考試成績)>400 order by 考試總成績 desc

關(guān)于SQL語句中分組函數(shù)與聚合函數(shù)有哪些問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI