當前位置:首頁 » 編程語言 » sql的聚合操作函數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql的聚合操作函數

發布時間: 2023-01-05 02:36:20

『壹』 sql 語句中那些是聚合函數

常見聚合函數,max(最大)、min(最小)、sum(求和)、avg(平均)等,

示例如下,

1、創建測試表,

create table test_group(id number, value number);

『貳』 在SQL中的聚合函數

原則上,你要用group by,那麼前面抽取的欄位必須要作為分組依據,否則就需要sum,avg,max等函數的處理。

『叄』 第十三章 SQL聚合函數 XMLAGG

一個聚合函數,它創建一個串接的值字元串。

XMLAGG 聚合函數返回由 string-expr 中的所有值組成的串接字元串。
返回值的數據類型為 VARCHAR ,默認長度為 4096 。

以下兩個示例都返回相同的單個值,即 Sample.Person 表的 Home_State 列中列出的所有值的串聯字元串。

請注意,此連接字元串包含重復值。

返回值中將省略 string-expr 為NULL的行。如果至少返回一個非空字元串值,則從返回值中省略 string-expr 為空字元串( '' )的行。如果唯一非空的 string-expr 值是空字元串( '' ),則返回值是單個空字元串。

XMLAGG 不支持數據流欄位。為 string-expr 指定流欄位會導致 SQLCODE-37 。

XMLAGG 的一個常見用法是標記列中的每個數據項。這是通過組合 XMLAGG 和 XMLELEMENT 來實現的,如下例所示:

這將產生如下所示的輸出字元串:

XMLAGG 函數將來自多行的表列的值連接到單個字元串中。因為在計算所有聚合欄位之後,將逐個從句應用於查詢結果集,所以逐個不能直接影響該字元串中的值序列。在某些情況下, XMLAGG 結果可能會按順序顯示,但不應依賴此排序。給定聚合結果值中列出的值無法顯式排序。

下面的示例創建在 Sample.Person 表的 FavoriteColors 列中找到的所有不同值的串聯字元串。因此,對於 ALL_COLLES 列,每行都有相同的值。請注意,雖然有些行的 FavoriteColors 為空值,但該值不包括在連接的字元串中。數據值以內部格式返回。

下面的示例返回以 「A」 開頭的 Home_State 值的串聯字元串。它返回不同的 Home_State 值(不同的 Home_State );與不同的 Home_City 值對應的 Home_State 值(與( Home_City ) Home_State 不同),其中可能包括 Home_City 的一個唯一NULL;以及所有 Home_State 值:

下面的示例為每個州創建在 Home_City 列中找到的所有不同值的串聯字元串。同一州的每一行都包含該州所有不同城市值的列表:

以下示例使用 %AFTERHAVING 關鍵字。它為每個包含至少一個滿足 HAVING 子句條件(以 「C」 或 「K」 開頭的名稱)的 Name 值的 Home_State 返回一行。第一個 XMLAGG 函數返回由該州的所有名稱組成的連接字元串。第二個 XMLAGG 函數返回僅由滿足 HAVING 子句條件的名稱組成的連接字元串:

對於以下示例,假設我們有下表 AutoClub :

『肆』 SQL——聚集函數

聚集函數 是以值是一個集合(集或者多重集)為輸入、返回單個值得函數。SQL提供了五個固有聚集函數。
平均值 :avg
最小值 :min
最大值 :max
總和 :sum
計數 :count

以上五個固有聚集函數都是屬於基本聚集
示例:

其他基本聚集使用形式差不多。

如果希望將聚集函數作用在單個元組集上,也希望作用到一組元組集上,此時可以利用group by子句來實現。

group by 子句作用: 對給出的一個或多個屬性來構造分組,將屬性上取值相同的元組分到同一組中。

示例

值得注意的是, 當SQL查詢使用分組的時候,需要保證出現在select語句中但沒有被聚集的屬性只能是出現在group by 子句中的那些屬性。換句話說,任何 沒有出現 在group by子句中的屬性如果出現在select子句中的話,它 只能出現在聚集函數的內部 ,否則這樣的查詢就是錯誤的,例如:

不過令我哭笑不得是,呃……,竟然運行沒有報錯[捂臉.jpg],然後仔細觀察了以下,原因是id是沒有被聚集,所以是屬於查詢錯誤,
看下面的結果,類別biology的id只有10211,其實還有另外一個。在分組計算中只輸出一個元組,這樣是無法確定選擇哪一個id作為輸出,下一次運行結果id值可能為其他值。[如果你有什麼新發現,望告知]

有時候限定分組條件比對元組限定條件更有用。比如我們只對工資超過15000某一個系感興趣。該條件並不針對某個元組,而是針對group by子句構成的分組。即是說,having子句是在分組之後才生效的,可以使用聚集函數。例如:

注意: 與select子句的情況類似,任何出現在having子句中,但沒有被聚集的屬性必須出現在group by子句中,否則查詢就被當成是錯誤的。

包含聚集、group by 或者having子句的查詢的含義可通過下述操作序列定義:

1、根據from子句計算出一個關系

2、如果出現where子句,where子句的謂詞將應用到from子句的結果上

3、如果出現group by子句,滿足where子句的元組通過group by子句形成分組。如果沒有
group by子句,滿足where謂詞的整個元組集被當做一個分組

4、如果出現having子句,他將應用到每個分組上;不滿足having子句謂詞的分組將被拋棄。

5、select子句利用剩下的分組產生出查詢結果中的元組,即每個分組上應用聚集函數來得到單個關系元組

空值的出現對聚集運算帶來了麻煩,例如下列句子:

當instructor關系有些元組在salary屬性的值為空,則在查詢待求和的值中就包含了空值。SQL標准並不認為總和本身為null,而是認為sum運算符應 忽略 輸入中的null值(因為算術表達式如果有null,那麼結果為null)。

所以,聚集函數根據以下原則處理空值:
除了count(*)外,所有的聚集函數都忽略輸入集合中的空值。由於空值被忽略,可能會造成參加聚集函數的輸入值集合為空集。規定空集的count運算值為0,其他所有聚集運算在輸入為空集的情況下返回一個空值。

處理布爾值的聚集函數:some 和every。
從字面意義上就可以知道,some是只要滿足其中任意一個條件即可,而every則是所有條件都要滿足,比如說1=some(集合A),若A={1,2,3},則為真,若A={0,2,3}則為假,又如1>some(集合A),結果分別為假、真。
例如:

『伍』 sql中常用的聚合函數有哪些

聚合函數是對一組值執行計算並返回單一的值的函數,它經常與SELECT語句的GROUP BY子句一同使用,SQL SERVER 中具體有哪些聚合函數呢?我們來一一看一下:
1. AVG 返回指定組中的平均值,空值被忽略。
例:select prd_no,avg(qty) from sales group by prd_no

2. COUNT 返回指定組中項目的數量。
例:select count(prd_no) from sales

3. MAX 返回指定數據的最大值。
例:select prd_no,max(qty) from sales group by prd_no

4. MIN 返回指定數據的最小值。
例:select prd_no,min(qty) from sales group by prd_no

5. SUM 返回指定數據的和,只能用於數字列,空值被忽略。
例:select prd_no,sum(qty) from sales group by prd_no

6. COUNT_BIG 返回指定組中的項目數量,與COUNT函數不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。
例:select count_big(prd_no) from sales

7. GROUPING 產生一個附加的列,當用CUBE或ROLLUP運算符添加行時,輸出值為1.當所添加的行不是由CUBE或ROLLUP產生時,輸出值為0.
例:select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup

8. BINARY_CHECKSUM 返回對表中的行或表達式列表計算的二進制校驗值,用於檢測表中行的更改。
例:select prd_no,binary_checksum(qty) from sales group by prd_no

9. CHECKSUM_AGG 返回指定數據的校驗值,空值被忽略。
例:select prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no

10. CHECKSUM 返回在表的行上或在表達式列表上計算的校驗值,用於生成哈希索引。

11. STDEV 返回給定表達式中所有值的統計標准偏差。
例:select stdev(prd_no) from sales

12. STDEVP 返回給定表達式中的所有值的填充統計標准偏差。
例:select stdevp(prd_no) from sales

13. VAR 返回給定表達式中所有值的統計方差。
例:select var(prd_no) from sales

14. VARP 返回給定表達式中所有值的填充的統計方差。
例:select varp(prd_no) from sales

『陸』 SQL Server中的聚合函數有哪些

SQL Server中的聚合函數有:

1.count() 所有記錄數

2.count(*)所有非null記錄數

3.avg() 某一列平均值

4.min() 某一列最小值

5.max() 某一列最大值

6.sum() 某一列總和

使用方法:

1. SELECT COUNT(欄位1) FROM 表A 統計欄位1在表A中出現的次數

2. SELECT 學號,SUM(各科成績) FROM student GROUP BY 學號 用來根據統計學生的總成績

『柒』 sql聚合函數有哪些

聚集函數
和大多數其它關系資料庫產品一樣,PostgreSQL
支持聚集函數。一個聚集函數從多個輸入行中計算出一個結果。比如,我們有在一個行集合上計算
count(數目),
sum(總和),
avg(均值),
max(最大值),
min(最小值)的函數。
比如,我們可以用下面的語句找出所有低溫中的最高溫度:
SELECT
max(temp_lo)
FROM
weather;
max
-----
46
(1
row)如果我們想知道該讀數發生在哪個城市,可能會用:
SELECT
city
FROM
weather
WHERE
temp_lo
=
max(temp_lo);
--
錯!不過這個方法不能運轉,因為聚集函數
max
不能用於
WHERE
子句中。存在這個限制是因為
WHERE
子句決定哪些行可以進入聚集階段;因此它必需在聚集函數之前計算。不過,我們可以用其它方法實現這個目的;這里我們使用子查詢:
SELECT
city
FROM
weather
WHERE
temp_lo
=
(SELECT
max(temp_lo)
FROM
weather);
city
---------------
San
Francisco
(1
row)這樣做是可以的,因為子查詢是一次獨立的計算,它獨立於外層查詢計算自己的聚集。
聚集同樣也常用於
GROUP
BY
子句。比如,我們可以獲取每個城市低溫的最高值:
SELECT
city,
max(temp_lo)
FROM
weather
GROUP
BY
city;
city
|
max
---------------+-----
Hayward
|
37
San
Francisco
|
46
(2
rows)這樣每個城市一個輸出。每個聚集結果都是在匹配該城市的行上面計算的。我們可以用
HAVING
過濾這些分組:
SELECT
city,
max(temp_lo)
FROM
weather
GROUP
BY
city
HAVING
max(temp_lo)
<
40;
city
|
max
---------+-----
Hayward
|
37
(1
row)這樣就只給出那些
temp_lo
值曾經有低於
40
度的城市。最後,如果我們只關心那些名字以"S"開頭的城市,我們可以用:
SELECT
city,
max(temp_lo)
FROM
weather
WHERE
city
LIKE
'S%'
GROUP
BY
city
HAVING
max(temp_lo)
<
40;語句中的
LIKE
執行模式匹配,在節9.7里有解釋。
理解聚集和
SQL

WHERE

HAVING
子句之間的關系非常重要。WHERE

HAVING
的基本區別如下:WHERE
在分組和聚集計算之前選取輸入行(它控制哪些行進入聚集計算),而
HAVING
在分組和聚集之後選取輸出行。因此,WHERE
子句不能包含聚集函數;因為試圖用聚集函數判斷那些行將要輸入給聚集運算是沒有意義的。相反,HAVING
子句總是包含聚集函數。當然,你可以寫不使用聚集的
HAVING
子句,但這樣做沒什麼好處,因為同樣的條件可以更有效地用於
WHERE
階段。
在前面的例子里,我們可以在
WHERE
里應用城市名稱限制,因為它不需要聚集。這樣比在
HAVING
里增加限制更加高效,因為我們避免了為那些未通過
WHERE
檢查的行進行分組和聚集計算。

『捌』 第十二章 SQL聚合函數 VARIANCE, VAR_SAMP, VAR_POP

返回數據集統計方差的聚合函數。

這些函數返回 NUMERIC 數據類型,除非表達式是數據類型 DOUBLE 。
如果 expression 為 DOUBLE ,則返回 DOUBLE 。

這三個方差聚合函數在丟棄 NULL 值後返回表達式值的統計方差。
也就是說,從數據集的平均值變化的量,表示為一個正數。
返回值越大,值的數據集的變化就越大。
SQL還提供聚合函數來返回對應於每個方差函數的標准偏差。

在這種統計差異的推導過程中有一些細微的差異:

方差計算為:

VAR_POP 的計算是:

這些方差聚合函數可以在引用表或視圖的 SELECT 查詢或子查詢中使用。
它們可以在 SELECT 列表或 HAVING 子句中與普通欄位值一起出現。

這些方差聚合函數不能在WHERE子句中使用。
它們不能在 JOIN 的 ON 子句中使用,除非 SELECT 是子查詢。

這些方差聚合函數返回數據類型NUMERIC的值,精度為 36 ,刻度為 17 ,除非表達式是數據類型 DOUBLE ,在這種情況下,函數返回數據類型 DOUBLE 。

這些方差聚合函數通常應用於具有數值的欄位或表達式。
它們將非數值值(包括空字元串( " ))計算為零( 0 )。

這些方差聚合函數忽略數據欄位中的 NULL 值。
如果查詢沒有返回行,或者返回的所有行的數據欄位值為 NULL ,則返回 NULL 。

與所有聚合函數一樣,統計方差函數可以採用一個可選的 DISTINCT 子句。
方差( DISTINCT col1 )返回那些不同(唯一)的 col1 欄位值的方差。
方差( DISTINCT BY(col2) col1 )返回記錄中col1欄位值的方差,其中col2值是不同的(唯一的)。
但是請注意,不同的col2值可能包含一個單獨的NULL值。

與所有聚合函數一樣,方差函數總是返回數據的當前狀態,包括未提交的更改,而不管當前事務的隔離級別如何。

下面的示例使用方差返回 sample.employee 中雇員年齡的方差,以及由一個或多個雇員表示的不同年齡的方差:

下面的示例使用 VAR_POP 返回 sample.employee 中雇員年齡的總體差異,以及由一個或多個雇員表示的不同年齡的差異:

『玖』 sql server中什麼是聚合函數

count() 所有記錄數
count(*)所有非null記錄數
avg() 某一列平均值

min() 某一列最小值
max() 某一列最大值
sum() 某一列總和

『拾』 sql聚合函數的應用

我們知道資料庫通常包含大量數據,要從海量的數據中找到我們需要的某條記錄無異於大海撈針,不過通過SQL語言我們可以找到很多方法從資料庫中提取我們要查找的特定數據,就是通過這些方法我們才能找到「列舉出七八兩個月中購買了西伯利亞羊毛的所有顧客的姓名」這類問題的答案。很多時候,我們還希望能夠通過對數據進行分析,總結出規律和趨勢或生成高水平的報表。例如,對於采購經理來說,他可能對所有銷售出去的產品清單不感興趣,而只是想要知道這個月產品的銷售量。SQL提供了聚合函數(aggregate functions)功能來支持對大量數據進行總結的操作。本文我們將具體來看看這些函數的功能和用法,包括添加數據和計算平均值的函數、對符合特定標準的記錄進行計數的函數,以及找出表中最大值和最小值的函數。我們將使用下文所示的ProctOrder表來執行我們所有的查詢。注意,這個表並沒有標准化,而是將幾個數據實體聯合到一個表中,這樣做是為了簡化條件方便說明。如果要設計較好的關系資料庫,應當把這些內容至少分成三個關聯表Procts、Orders和Customers。訂單號 客戶名 客戶姓 數量 單價 所在地 122 John Jacob 21 4.52 北美洲 923 Ralph Wiggum 192 3.99 北美洲 238 Ryan Johnson 87 4.49 非洲 829 Mary Smith 842 2.99 北美洲 824 Elizabeth Marks 48 3.48 非洲 753 James Linea 9 7.85 北美洲 942 Alan Jonas 638 3.29 歐洲 我們先從SUM函數開始。這個函數通常在SELECT語句中使用,返回系列值的總數。假設產品項目經理想了解目前為止商品的總銷售額,那麼我們可以使用以下的查詢腳本:SELECT SUM(數量) AS 總數 FROM ProctOrders 執行語句將返回以下結果: Total ----------- 1837 AVG函數(平均函數)使用方法和SUM類似,它給我們提供系列值的算術平均數。這次我們可以嘗試稍微復雜點的任務:找出北美洲大陸所有訂單的金額平均值。注意,我們需要將「數量」列和「單價」列相乘計算出每張訂單的金額總數。查詢腳本如下: http://database.ctocio.com.cn/tips/116/8051116.shtml