1. 程式人生 > 資料庫 >SQL分組函式group by和聚合函式(COUNT、MAX、MIN、AVG、SUM)的幾點說明

SQL分組函式group by和聚合函式(COUNT、MAX、MIN、AVG、SUM)的幾點說明

1 分組聚合的原因

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

SQL分組函式和聚合函式的幾點說明_第1張圖片

拿上圖中的資料進行解釋,假設按照product_type這個欄位進行分組,分組之後結果如下圖。

SELECT product_type from productgroup by product_type

SQL分組函式和聚合函式的幾點說明_第2張圖片

從圖中可以看出被分為了三組,分別為廚房用具、衣服和辦公用品,就相當於對product_type這個欄位進行了去重,確實group by函式有去重的作用。

SELECT DISTINCT product_type from product

假設分組之後,我想看一下價格,也就是sale_price這個欄位的值,按照如下這個寫法,會報如下錯誤。

SELECT product_type,sale_price from productgroup by product_type

image-20201129164214376

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

SQL分組函式和聚合函式的幾點說明_第3張圖片

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

SQL分組函式和聚合函式的幾點說明_第4張圖片

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

2 distinct和group by去重的區別 Distinct 和group by 設計時側重點不一樣

distinct只是為了去重,而group by是為了聚合統計的。

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

單個欄位去重

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

SQL分組函式和聚合函式的幾點說明_第5張圖片

多個欄位去重

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

SQL分組函式和聚合函式的幾點說明_第6張圖片

執行效率

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

SQL分組函式和聚合函式的幾點說明_第7張圖片

SQL語言的執行順序,先執行上圖中的第一步,然後再執行select子句,最後對結果進行篩選。distinct是在select子句中,而group by在第一步中,所以group by去重比distinct去重在效率上要高。

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

sql中聚合函式和分組函式

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子句結合使用。 它是SQL“聚合”功能之一,其中包括AVG(平均)和SUM。

This function will count the number of rows and return that count as a column in the result set.

此函式將對行數進行計數,並將該計數作為列返回到結果集中。

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)
計算資料子集的總數(需要語句的“分組依據”部分)
For reference,here is the current data for all the rows in our example student database.

作為參考,這是示例學生資料庫中所有行的當前資料。

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語句提供所有行的計數。 請注意,您可以使用“ AS”為所得的COUNT列命名。

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

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

在這裡,我們得到了每個學習領域的學生人數。

select studentID,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分數的學生人數。

select studentID,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年美國總統大選期間每筆交易的總金額和每個政黨的捐款額。

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.

關於所有這些事情,還有很多事情要做,所以請參閱資料庫管理員手冊,並嘗試自己進行不同的測試,這很有趣。

sql語句聚合函式和分組操作的注意事項

group by可以根據給定資料列的每個成員對查詢結果進行分組統計,最終得到一個彙總表。

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

(1)select字句中的列名和having或where中的列名必須為分組列或列函式.列函式對於group by字句定義的每個組返回一個結果
(2)group by一般和聚合函式一使用才有意義,比如count,sum,avg等,使用group by 的兩個要素:
(3)出現在select後面的欄位,要麼是聚合函式中的,要麼是group by中的.
(4)要篩選結果,可以先使用where再用group by或者先用group by再用having

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

SQL聚合函式和分組資料語法及概述

(一)聚合函式是指對列上的資料進行操作,起到統計的作用。前面的函式都是最一行記錄進行操作得到的資料,包括前面的日期函式、數學函式、字元函式、轉換函式以及條件判斷函式。

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

Count:count函式對查詢的資料統計記錄數量,這個函式不對欄位值為NULL的值進行統計,也就是說某個查詢的欄位有NULL值,則NULL值的數量會被減除,這樣就可以不對NULL設定查詢條件了。
如果要對NULL值設定查詢,則可以用WHERE 欄位 IS NULL來作為條件。
Sum:sum函式求和,只能對數值型資料操作,也會忽略NULL值。舉例:
Select sum(考試成績) as 計算機總成績
From score
Where 課號 in (select 課號 from course where 課名=”計算機”)
Avg:求平均值,引數也必須為數值型欄位名或者結果為數值的表示式。
Max、min:這兩個函式求最大值和最小值,但是不能放到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個函式都可以使用distinct統計不重複的值:
Select count(distinct(課程)) as 課程數量 from 課程表
Access和mysql不能將distinct放置到引數中,解決方法:查詢distinct儲存為新表INTO語句,然後再使用count。

(二)資料分組是指將資料表中的資料按照指定欄位的不同值分為很多組,使用group by 子句進行操作。

Group by通常不直接查詢所有欄位並且分組,group by和select後分組欄位和查詢欄位通常一致。因為select * from y group by x 會產生錯誤,通常對某個欄位分組並且利用聚合函式計算分組得到的值。
聚合函式和分組的組合並設定查詢條件:可以對一個欄位分組並且設定條件,這樣得到的結果將會是計算分組並且滿足條件的值。例:
查詢各個所屬院系中所有男生的值:
Select 所屬院系,count(*) as 男生人數from student where 性別='男' group by 所屬院系
查詢直方圖:利用replicate()函式,將分組得到的資料作為次數,重複一個設定的符號。
排序查詢結果:order by語句,ASC、DESC 位於group by之後
Case表示式和group by的結合:
Select 所屬院系,count(case
When 性別='男' then 1
Else null
End ) as 男生人數,
count(case
When 性別='女' then 1
Else null
End ) as 女生人數
From student group by 所屬院系
Hanving子句設定分組group by的分組查詢條件。
Having子句總是和group by子句結合使用,依賴於分組,可以在having中使用聚合函式;where 也可以設定條件,但是不依賴於分組的欄位,但是不能使用聚合函式。
Select 學號,sum(考試成績) as 考試總成績 from score group by 學號 having sum(考試成績)>400 order by 考試總成績 desc

到此這篇關於SQL分組函式group by和聚合函式(COUNT、MAX、MIN、AVG、SUM)的幾點說明的文章就介紹到這了,更多相關SQL分組函式和聚合函式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!