下面的句子哪些是組合,哪些是聚合
組合關(guān)系:如:枯藤、小橋、流水、人家、昏鴉……是一個個語言符號,而不是“語言藝術(shù)符號”。
如果將上述詞語,按照語言符號的曲性特點,根據(jù)一定語法規(guī)則,同時融合人們對客觀現(xiàn)實生活的審美情感意識,組成一個語言鏈,就變成一個“語言藝術(shù)符號”系統(tǒng)。
這就是元代散曲家馬致遠(yuǎn)的《天凈沙·秋思》:“枯藤老樹昏鴉,小橋流水人家,古道西風(fēng)瘦馬。
夕陽西下,斷腸人在天涯。
”
常用的聚合函數(shù)有哪些
聚合函對一組值執(zhí)行計算并返回單一的值的函數(shù)經(jīng)常與SELECT語句的GROUP BY子句使用,SQL SERVER 中具體有哪些聚合函數(shù)呢
我們來一一看一下:1. AVG 返回指定組中的平均值,空值被忽略。
例:select prd_no,avg(qty) from sales group by prd_no2. COUNT 返回指定組中項目的數(shù)量。
例:select count(prd_no) from sales 3. MAX 返回指定數(shù)據(jù)的最大值。
例:select prd_no,max(qty) from sales group by prd_no 4. MIN 返回指定數(shù)據(jù)的最小值。
例:select prd_no,min(qty) from sales group by prd_no5. SUM 返回指定數(shù)據(jù)的和,只能用于數(shù)字列,空值被忽略。
例:select prd_no,sum(qty) from sales group by prd_no6. COUNT_BIG 返回指定組中的項目數(shù)量,與COUNT函數(shù)不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。
例:select count_big(prd_no) from sales7. GROUPING 產(chǎn)生一個附加的列,當(dāng)用CUBE或ROLLUP運算符添加行時,輸出值為1.當(dāng)所添加的行不是由CUBE或ROLLUP產(chǎn)生時,輸出值為0. 例:select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup8. BINARY_CHECKSUM 返回對表中的行或表達(dá)式列表計算的二進(jìn)制校驗值,用于檢測表中行的更改。
例:select prd_no,binary_checksum(qty) from sales group by prd_no9. CHECKSUM_AGG 返回指定數(shù)據(jù)的校驗值,空值被忽略。
例:select prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no10. CHECKSUM 返回在表的行上或在表達(dá)式列表上計算的校驗值,用于生成哈希索引。
11. STDEV 返回給定表達(dá)式中所有值的統(tǒng)計標(biāo)準(zhǔn)偏差。
例:select stdev(prd_no) from sales12. STDEVP 返回給定表達(dá)式中的所有值的填充統(tǒng)計標(biāo)準(zhǔn)偏差。
例:select stdevp(prd_no) from sales13. VAR 返回給定表達(dá)式中所有值的統(tǒng)計方差。
例:select var(prd_no) from sales14. VARP 返回給定表達(dá)式中所有值的填充的統(tǒng)計方差。
例:select varp(prd_no) from sales
十萬火急:SQL語句的聚合問題,請看詳細(xì)說明
select * , (收入-支出) as 差額 from (select convert(varchar(7),AT_Date,23) as 月份,sum(case when AT_IOrP = '收入' then AT_Amount else 0 end) as 收入,sum(case when AT_IOrP = '支出' then AT_Amount else 0 end) as 支出from TB_AccountTablegroup by convert(varchar(7),AT_Date,23)) torder by 月份
sql 語句中那些是聚合函數(shù)
一下內(nèi)容純屬抄襲~,希望有點用~8.2 聚合函數(shù)的應(yīng)用聚合函數(shù)在數(shù)據(jù)庫數(shù)據(jù)的查詢分析中,應(yīng)用十分廣泛。
本節(jié)將分別對各聚合函數(shù)的應(yīng)用進(jìn)行說明。
8.2.1 求和函數(shù)——SUM()求和函數(shù)SUM( )用于對數(shù)據(jù)求和,返回選取結(jié)果集中所有值的總和。
語法如下。
SELECT SUM(column_name)FROM table_name說明:SUM()函數(shù)只能作用于數(shù)值型數(shù)據(jù),即列column_name中的數(shù)據(jù)必須是數(shù)值型的。
實例1 SUM函數(shù)的使用從TEACHER表中查詢所有男教師的工資總數(shù)。
TEACHER表的結(jié)構(gòu)和數(shù)據(jù)可參見5.2.1節(jié)的表5-1,下同。
實例代碼:SELECT SUM(SAL) AS BOYSALFROM TEACHERWHERE TSEX='男'運行結(jié)果如圖8.1所示。
圖8.1 TEACHER表中所有男教師的工資總數(shù)實例2 SUM函數(shù)對NULL值的處理從TEACHER表中查詢年齡大于40歲的教師的工資總數(shù)。
實例代碼:SELECT SUM(SAL) AS OLDSALFROM TEACHERWHERE AGE>=40運行結(jié)果如圖8.2所示。
圖8.2 TEACHER表中所有年齡大于40歲的教師的工資總數(shù)當(dāng)對某列數(shù)據(jù)進(jìn)行求和時,如果該列存在NULL值,則SUM函數(shù)會忽略該值。
8.2.2 計數(shù)函數(shù)——COUNT()COUNT()函數(shù)用來計算表中記錄的個數(shù)或者列中值的個數(shù),計算內(nèi)容由SELECT語句指定。
使用COUNT函數(shù)時,必須指定一個列的名稱或者使用星號,星號表示計算一個表中的所有記錄。
兩種使用形式如下。
* COUNT(*),計算表中行的總數(shù),即使表中行的數(shù)據(jù)為NULL,也被計入在內(nèi)。
* COUNT(column),計算column列包含的行的數(shù)目,如果該列中某行數(shù)據(jù)為NULL,則該行不計入統(tǒng)計總數(shù)。
1.使用COUNT(*)函數(shù)對表中的行數(shù)計數(shù)COUNT(*)函數(shù)將返回滿足SELECT語句的WHERE子句中的搜索條件的函數(shù)。
實例3 COUNT(*)函數(shù)的使用查詢TEACHER表中的所有記錄的行數(shù)。
實例代碼:SELECT COUNT(*) AS TOTALITEMFROM TEACHER運行結(jié)果如圖8.3所示。
圖8.3 使用COUNT(*)函數(shù)對表中的行數(shù)計數(shù)在該例中,SELECT語句中沒有WHERE子句,那么認(rèn)為表中的所有行都滿足SELECT語句,所以SELECT語句將返回表中所有行的計數(shù),結(jié)果與5.2.1節(jié)的表5-1列出的TEACHER表的數(shù)據(jù)相吻合。
如果DBMS在其系統(tǒng)表中存儲了表的行數(shù),COUNT(*)將很快地返回表的行數(shù),因為這時,DBMS不必從頭到尾讀取表,并對物理表中的行計數(shù),而直接從系統(tǒng)表中提取行的計數(shù)。
而如果DBMS沒有在系統(tǒng)表存儲表的行數(shù),將具有NOT NULL約束的列作為參數(shù),使用COUNT( )函數(shù),則可能更快地對表行計數(shù)。
注意COUNT(*)函數(shù)將準(zhǔn)確地返回表中的總行數(shù),而僅當(dāng)COUNT()函數(shù)的參數(shù)列沒有NULL值時,才返回表中正確的行計數(shù),所以僅當(dāng)受NOT NULL限制的列作為參數(shù)時,才可使用COUNT( )函數(shù)代替COUNT(*)函數(shù)。
2.使用COUNT( )函數(shù)對一列中的數(shù)據(jù)計數(shù)COUNT( )函數(shù)可用于對一列中的數(shù)據(jù)值計數(shù)。
與忽略了所有列的COUNT(*)函數(shù)不同,COUNT( )函數(shù)逐一檢查一列(或多列)中的值,并對那些值不是NULL的行計數(shù)。
實例4 查詢多列中所有記錄的行數(shù)查詢TEACHER表中的TNO列、TNAME列以及SAL列中包含的所有數(shù)據(jù)行數(shù)。
實例代碼:SELECT COUNT(TNO) AS TOTAL_TNO, COUNT(TNAME) AS TOTAL_TNAME, COUNT(SAL) AS TOTAL_SALFROM TEACHER運行結(jié)果如圖8.4所示。
圖8.4 使用COUNT( )函數(shù)對一列中的數(shù)據(jù)計數(shù)可見,TNO列與TNAME列由于其中不含有NULL值,所以其計數(shù)與使用COUNT(*)函數(shù)對TEACHER表中的記錄計數(shù)結(jié)果相一致,而SAL列由于其中有兩行數(shù)據(jù)為NULL,所以這兩列沒有被計入在內(nèi),計數(shù)結(jié)果也就是8。
3.使用COUNT( )函數(shù)對多列中的數(shù)據(jù)計數(shù)COUNT( )函數(shù)不僅可用于對一列中的數(shù)據(jù)值計數(shù),也可以對多列中的數(shù)據(jù)值計數(shù)。
如果對多列計數(shù),則需要將要計數(shù)的多列通過連接符連接后,作為COUNT( )函數(shù)的參數(shù)。
下面將結(jié)合具體的多列計數(shù)的實例,說明其使用過程。
*說明關(guān)于如何使用連接符連接多列可參見本書的7.2節(jié)。
實例5 使用COUNT( )函數(shù)對多列中的數(shù)據(jù)計數(shù)統(tǒng)計TEACHER表中的TNO列、TNAME列和SAL列中分別包含的數(shù)據(jù)行數(shù),以及TNO列和TNAME列、TNAME列和SAL列一起包含的數(shù)據(jù)行數(shù)。
實例代碼:SELECT COUNT(TNO) AS TOTAL_TNO, COUNT(TNAME) AS TOTAL_TNAME, COUNT(SAL) AS TOTAL_SAL, COUNT(CAST(TNO AS VARCHAR(5)) + TNAME) AS T_NONAME, COUNT(TNAME + CAST(SAL AS VARCHAR(5))) AS T_NAMESALFROM TEACHER運行結(jié)果如圖8.5所示。
圖8.5 使用COUNT( )函數(shù)對多列中的數(shù)據(jù)計數(shù)在進(jìn)行兩列的連接時,由于它們的數(shù)據(jù)類型不一致,因此要使用CAST表達(dá)式將它們轉(zhuǎn)換成相同的數(shù)據(jù)類型。
在7.2.1節(jié)已經(jīng)講過,如果在被連接的列中的任何一列有NULL值時,那么連接的結(jié)果為NULL,則該列不會被COUNT( )函數(shù)計數(shù)。
注意COUNT( )函數(shù)只對那些傳遞到函數(shù)中的參數(shù)不是NULL的行計數(shù)。
4.使用COUNT函數(shù)對滿足某種條件的記錄計數(shù)也可以在SELECT語句中添加一些子句約束來指定返回記錄的個數(shù)。
實例6 使用COUNT函數(shù)對滿足某種條件的記錄計數(shù)查詢TEACHER表中女教師記錄的數(shù)目。
實例代碼:SELECT COUNT(*) AS TOTALWOMENFROM TEACHERWHERE TSEX='女'運行結(jié)果如圖8.6所示。
圖8.6 使用COUNT函數(shù)對滿足某種條件的記錄計數(shù)這時結(jié)果為6而不是前面的所有記錄10。
之所以可以通過WHERE子句定義COUNT()函數(shù)的計數(shù)條件,這與SELECT語句各個子句的執(zhí)行順序是分不開的。
前面已經(jīng)講過,DBMS首先執(zhí)行FROM子句,而后是WHERE子句,最后是SELECT子句。
所以COUNT()函數(shù)只能用于滿足WHERE子句定義的查詢條件的記錄。
沒有包括在WHERE子句的查詢結(jié)果中的記錄,都不符合COUNT()函數(shù)。
8.2.3 最大\\\/最小值函數(shù)—MAX()\\\/MIN()當(dāng)需要了解一列中的最大值時,可以使用MAX()函數(shù);同樣,當(dāng)需要了解一列中的最小值時,可以使用MIN()函數(shù)。
語法如下。
SELECT MAX (column_name) \\\/ MIN (column_name)FROM table_name說明:列column_name中的數(shù)據(jù)可以是數(shù)值、字符串或是日期時間數(shù)據(jù)類型。
MAX()\\\/MIN()函數(shù)將返回與被傳遞的列同一數(shù)據(jù)類型的單一值。
實例7 MAX()函數(shù)的使用查詢TEACHER表中教師的最大年齡。
實例代碼:SELECT MAX (AGE) AS MAXAGEFROM TEACHER運行結(jié)果如圖8.7所示。
圖8.7 TEACHER表中教師的最大年齡然而,在實際應(yīng)用中得到這個結(jié)果并不是特別有用,因為經(jīng)常想要獲得的信息是具有最大年齡的教師的教工號、姓名、性別等信息。
然而SQL不支持如下的SELECT語句。
SELECT TNAME, DNAME, TSEX, MAX (AGE)FROM TEACHER因為聚合函數(shù)處理的是數(shù)據(jù)組,在本例中,MAX函數(shù)將整個TEACHER表看成一組,而TNAME、DNAME和TSEX的數(shù)據(jù)都沒有進(jìn)行任何分組,因此SELECT語句沒有邏輯意義。
同樣的道理,下面的代碼也是無效的。
SELECT TNAME, DNAME, TSEX,SAL ,AGEFROM TEACHERWHERE AGE=MAX (AGE)解決這個問題的方法,就是在WHERE子句中使用子查詢來返回最大值,然后再基于這個返回的最大值,查詢相關(guān)信息。
實例8 在WHERE子句中使用子查詢返回最大值查詢TEACHER表中年紀(jì)最大的教師的教工號、姓名、性別等信息。
實例代碼:SELECT TNAME, DNAME, TSEX, SAL, AGEFROM TEACHERWHERE AGE=(SELECT MAX (AGE) FROM TEACHER)運行結(jié)果如圖8.8所示。
圖8.8 在WHERE子句中使用子查詢返回最大值MAX()和MIN()函數(shù)不僅可以作用于數(shù)值型數(shù)據(jù),也可以作用于字符串或是日期時間數(shù)據(jù)類型的數(shù)據(jù)。
實例9 MAX()函數(shù)用于字符型數(shù)據(jù)如下面代碼:SELECT MAX (TNAME) AS MAXNAMEFROM TEACHER運行結(jié)果如圖8.9所示。
圖8.9 在字符串?dāng)?shù)據(jù)類型中使用MAX的結(jié)果可見,對于字符串也可以求其最大值。
*說明對字符型數(shù)據(jù)的最大值,是按照首字母由A~Z的順序排列,越往后,其值越大。
當(dāng)然,對于漢字則是按照其全拼拼音排列的,若首字符相同,則比較下一個字符,以此類推。
當(dāng)然,對與日期時間類型的數(shù)據(jù)也可以求其最大\\\/最小值,其大小排列就是日期時間的早晚,越早認(rèn)為其值越小,如下面的實例。
實例10 MAX()、MIN()函數(shù)用于時間型數(shù)據(jù)從COURSE表中查詢最早和最晚考試課程的考試時間。
其中COURSE表的結(jié)構(gòu)和數(shù)據(jù)可參見本書6.1節(jié)的表6-1。
實例代碼:SELECT MIN (CTEST) AS EARLY_DATE, MAX (CTEST) AS LATE_DATEFROM COURSE運行結(jié)果如圖8.10所示。
圖8.10 COURSE表中最早和最晚考試課程的考試時間可見,返回結(jié)果的數(shù)據(jù)類型與該列定義的數(shù)據(jù)類型相同。
注意確定列中的最大值(最小值)時,MAX( )(MIN( ))函數(shù)忽略NULL值。
但是,如果在該列中,所有行的值都是NULL,則MAX( )\\\/MIN( )函數(shù)將返回NULL值。
8.2.4 均值函數(shù)——AVG()函數(shù)AVG()用于計算一列中數(shù)據(jù)值的平均值。
語法如下。
SELECT AVG (column_name)FROM table_name說明:AVG()函數(shù)的執(zhí)行過程實際上是將一列中的值加起來,再將其和除以非NULL值的數(shù)目。
所以,與SUM( )函數(shù)一樣,AVG()函數(shù)只能作用于數(shù)值型數(shù)據(jù),即列column_name中的數(shù)據(jù)必須是數(shù)值型的。
實例11 AVG()函數(shù)的應(yīng)用從TEACHER表中查詢所有教師的平均年齡。
實例代碼:SELECT AVG (AGE) AS AVG_AGEFROM TEACHER運行結(jié)果如圖8.11所示。
圖8.11 TEACHER表中所有教師的平均年齡在計算平均值時,AVG()函數(shù)將忽略NULL值。
因此,如果要計算平均值的列中有NULL值,計算均值時,要特別注意。
實例12 AVG()函數(shù)對NULL值的處理從TEACHER表中查詢所有教師的平均工資。
實例代碼:SELECT AVG (SAL) AS AVG_AGE1,SUM(SAL)\\\/COUNT(*) AS AVG_AGE2, SUM(SAL)\\\/COUNT(SAL) AS AVG_AGE3FROM TEACHER運行結(jié)果如圖8.12所示。
圖8.12 TEACHER表中所有教師的平均工資可以發(fā)現(xiàn)得到了不同的結(jié)果。
實際上,“AVG (SAL)”與“SUM(SAL)\\\/COUNT(SAL)”語句是等價的。
因為AVG(SAL)語句的執(zhí)行過程實際上是將SAL列中的值加起來,再將其和(也就等價于SUM(SAL))除以非NULL值的數(shù)目(也就等價于COUNT(SAL))。
而語句“SUM(SAL)\\\/COUNT(*)”則不然,因為COUNT(*)返回的是表中所有記錄的個數(shù),而不管SAL列中的數(shù)值是否為NULL。
注意AVG()函數(shù)在計算一列的平均值時,忽略NULL值。
但是,如果在該列中,所有行的值都是NULL,則AVG()函數(shù)將返回NULL值。
如果不想對列中的所有值求平均,則可在WHERE子句中使用搜索條件來限制用于計算均值的行。
實例13 在WHERE子句中使用搜索條件來限制用于計算均值的行從TEACHER表中查詢所有計算機(jī)系教師的平均年齡。
實例代碼:SELECT AVG (AGE) AS AVGCOMPUTER_AGEFROM TEACHERWHERE DNAME = '計算機(jī)'運行結(jié)果如圖8.13所示。
圖8.13 TEACHER表中所有計算機(jī)系教師的平均年齡當(dāng)執(zhí)行SELECT語句時,DBMS將表中的每行對WHERE子句中的搜索條件“DNAME = '計算機(jī)'”求值。
只有那些搜索條件為True時,行中的AGE值才傳到均值函數(shù)AVG (AGE)中。
當(dāng)然,除了顯示表中某列的平均值,還可用AVG()函數(shù)作為WHERE子句的一部分。
與前面介紹的MAX()函數(shù)一樣,不能直接用于WHERE子句,必須以子查詢的形式。
實例14 AVG()函數(shù)作為WHERE子句中搜索條件的一部分從TEACHER表中查詢所有年齡高于平均年齡的教師的信息。
實例代碼:SELECT *FROM TEACHERWHERE AGE >= (SELECT AVG (AGE) FROM TEACHER)ORDER BY AGE運行結(jié)果如圖8.14所示。
圖8.14 TEACHER表中所有年齡高于平均年齡的教師的信息8.2.5 聚合分析的重值處理前面介紹的5種聚合函數(shù),可以作用于所選列中的所有數(shù)據(jù)(不管列中的數(shù)據(jù)是否有重置),也可以只對列中的非重值進(jìn)行處理,即把重復(fù)的值只取一次進(jìn)行聚合分析。
當(dāng)然,對于MAX()\\\/MIN()函數(shù)來講,重值處理意義不大。
可以使用ALL關(guān)鍵字指明對所選列中的所有數(shù)據(jù)進(jìn)行處理,使用DISTINCT關(guān)鍵字指明對所選列中的非重值數(shù)據(jù)進(jìn)行處理。
以AVG()函數(shù)為例,語法如下。
SELECT AVG ([ALL\\\/DISTINCT] column_name)FROM table_name說明:[ALL\\\/DISTINCT]在缺省狀態(tài)下,默認(rèn)是ALL關(guān)鍵字,即不管是否有重值,處理所有數(shù)據(jù)。
其他聚合函數(shù)的用法與此相同。
注意Microsoft Access數(shù)據(jù)庫不支持在聚合函數(shù)中使用DISTINCT關(guān)鍵字。
實例15 聚合分析的重值處理從TEACHER表中查詢工資SAL列中存在的所有記錄數(shù)。
實例代碼:SELECT COUNT(ALL SAL) AS ALLSAL_COUNTFROM TEACHER運行結(jié)果如圖8.15所示。
圖8.15 TEACHER表中工資SAL列中存在的所有記錄數(shù)當(dāng)然,在代碼中去除ALL關(guān)鍵字,也可以得到相同的結(jié)果。
而如果從TEACHER表中,查詢工資SAL列中存在的不同記錄的數(shù)目,可采用如下代碼。
SELECT COUNT(DISTINCT SAL) AS DISTINCTSAL_COUNTFROM TEACHER運行結(jié)果如圖8.16所示。
圖8.16 TEACHER表中SAL列存在的不同記錄的數(shù)目對比兩個結(jié)果,使用DISTINCT關(guān)鍵字后,工資SAL列中的重值并沒有列入統(tǒng)計的范圍之內(nèi)。
另外還要強(qiáng)調(diào)一點,在所有5種聚合函數(shù)中,除了COUNT(*)函數(shù)外,其他的函數(shù)在計算過程中都忽略NULL值,即把NULL值的行排除在外,不進(jìn)行分析。
8.2.6 聚合函數(shù)的組合使用前面介紹的實例中,聚合函數(shù)都是單獨使用的。
聚合函數(shù)也可以組合使用,即在一條SELECT語句中,可以使用多個聚合函數(shù)。
實例16 使用多個聚合函數(shù)如下面的代碼:SELECT COUNT(*) AS num_items, MAX(SAL) AS max_sal, Min(AGE) AS min_age, SUM(SAL)\\\/COUNT(SAL) AS avg_sal, AVG(DISTINCT SAL) AS disavg_salFROM TEACHER運行結(jié)果如圖8.17所示。
圖8.17 聚合函數(shù)的組合應(yīng)用該例在一條SELECT語句中,幾乎用到了所有的聚合函數(shù)。
其中num_items為TEACHER表所有記錄的條目,max_sal為TEACHER表中記錄的最高工資,min_age為TEACHER表中記錄的最小年齡,avg_sal為所有TEACHER表中的工資記錄的平均值,disavg_sal為TEACHER表中所有不同的工資記錄的平均值。
聚合不應(yīng)出現(xiàn)在 UPDATE 語句的集合列表中。
count()本來就不包含空值啊,兄弟