A. 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),結果分別為假、真。
例如:
B. 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
檢查的行進行分組和聚集計算。
C. sql聚合函數的應用
聚合函數對一組值執行計算,並返回單個值。除了
COUNT
以外,聚合函數都會忽略空值。聚合函數經常與
SELECT
語句的
GROUP
BY
子句一起使用。
所有聚合函數均為確定性函數。也就是說,只要使用一組特定輸入值調用聚合函數,該函數總是返回相同的值。有關函數確定性的詳細信息,請參閱確定性函數和不確定性函數。
聚合函數只能在以下位置作為表達式使用:
SELECT
語句的選擇列表(子查詢或外部查詢)。
COMPUTE
或
COMPUTE
BY
子句。
HAVING
子句。
Transact-SQL
提供下列聚合函數:
AVG
MIN
CHECKSUM
SUM
CHECKSUM_AGG
STDEV
COUNT
STDEVP
COUNT_BIG
VAR
GROUPING
VARP
D. sql 語句中那些是聚合函數
常見聚合函數,max(最大)、min(最小)、sum(求和)、avg(平均)等,
示例如下,
1、創建測試表,
create table test_group(id number, value number);
E. 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
F. SQL中只要用到聚合函數就一定要用到group by 嗎
SQL中只要用到聚合函數就不一定要用到group by。聚合函數是對一組值執行計算,並返回單個值,也被稱為組函數。 聚合函數可以應用於SELECT 查詢語句的 GROUP BY 子句的HAVING子句中,但不可用於WHERE語句中,因為WHERE是對逐條的行記錄進行篩選。
(6)聚合sql擴展閱讀:
Transact-SQL編程語言提供的聚合函數有:
1、AVG:返回指定組中的平均值,空值被忽略。例:select prd_no,avg(qty) from sales group by prd_no.
2、COUNT:返回指定組中項目的數量。例:select count(prd_no) from sales.
3、COUNT_BIG:返回指定組中的項目數量,與COUNT函數不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。例:select count_big(prd_no) from sales.
4、MIN:返回指定數據的最小值。例:select prd_no,min(qty) from sales group by prd_no.
5、MAX:返回指定數據的最大值。例:select prd_no,max(qty) from sales group by prd_no.
G. sql聚合函數
Max 返回表達式中的最大值項
Min 返回表達式中的最小值項
Sum 計算並返回表達式中各項的和
Avg 計算並返回表達式中各項的平均值
Count 返回一個集合中的項數,返回值為整型
Sum() 對數值型列或計算列求總和
Avg() 對數值型列或計算列求平均值
Min() 返回一個數值列或數值表達式的最小值
Max() 返回一個數值列或數值表達式的最大值
Count() 返回滿足select語句中指定的條件的記錄的個數
Count(*) 返回找到的行數
H. sql語句中如何將聚合函數值和另一個值相乘
sql中提供的聚合函數,通常包括sum,count,avg,max,min,但不包括乘法;
比如有這樣一個數據集:
id x
1 1
1 2
1 3
2 4
2 5
2 6
;
想實現成如下形式
id prob_x
1 6
2 120
即讓第一組中1*2*3=6
第二組中4*5*6=120
用data步中first+retain可以實現,但data需要先排序;
而sql的聚合函數中也沒有相乘這一函數,於是有些牛人想到通過數學轉化,將乘法轉為加法,而sql中可以
用sum實現加法聚合。
說來也簡單,主要想法就是A*B=exp(lnA*B)=exp(lnA+lnB);
select id,exp(sum(log(x))) as prob_x from data_set group by id;
=============================================
但我覺得也需要補充一點東西:
首先有0的情況下,log函數的定義域為{x>0},有0出現的時候,改組最後結果肯定為0;
其次是有負數的情況,需要對絕對值進行計算,計算每組負數的個數,如果負數是偶數個,那麼結果為正,
如果為奇數個,則需要在結果上添上負號。
最後可以寫成這樣
select id,(case when sum(case when x=0 then 1 else 0 end) >0 then 0
when mod(sum(case when x<0 then 1 else 0 end),2)=0 then exp(sum(log(x)))
else -1*exp(sum(log(abs(x)))) end) as prod_x from data_set group by id;
I. 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