久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    8.2 聚合函數的應用 - 《精通SQL——結構化查詢語言詳解》 - 免費試讀 - boo...

     昵稱310935 2009-09-17

    8.2  聚合函數的應用

    聚合函數在數據庫數據的查詢分析中,應用十分廣泛。本節將分別對各聚合函數的應用進行說明。

    8.2.1  求和函數——SUM()

    求和函數SUM( )用于對數據求和,返回選取結果集中所有值的總和。語法如下。

    SELECT          SUM(column_name)

    FROM            table_name

    說明:SUM()函數只能作用于數值型數據,即列column_name中的數據必須是數值型的。

    實例1  SUM函數的使用

    從TEACHER表中查詢所有男教師的工資總數。TEACHER表的結構和數據可參見5.2.1節的表5-1,下同。實例代碼:

    SELECT SUM(SAL) AS BOYSAL

    FROM    TEACHER

    WHERE   TSEX='男'

    運行結果如圖8.1所示。

    圖8.1  TEACHER表中所有男教師的工資總數

    實例2  SUM函數對NULL值的處理

    從TEACHER表中查詢年齡大于40歲的教師的工資總數。實例代碼:

    SELECT SUM(SAL) AS OLDSAL

    FROM    TEACHER

    WHERE   AGE>=40

    運行結果如圖8.2所示。

    圖8.2  TEACHER表中所有年齡大于40歲的教師的工資總數

    當對某列數據進行求和時,如果該列存在NULL值,則SUM函數會忽略該值。

    8.2.2  計數函數——COUNT()

    COUNT()函數用來計算表中記錄的個數或者列中值的個數,計算內容由SELECT語句指定。使用COUNT函數時,必須指定一個列的名稱或者使用星號,星號表示計算一個表中的所有記錄。兩種使用形式如下。

    *     COUNT(*),計算表中行的總數,即使表中行的數據為NULL,也被計入在內。

    *     COUNT(column),計算column列包含的行的數目,如果該列中某行數據為NULL,則該行不計入統計總數。

    1.使用COUNT(*)函數對表中的行數計數

    COUNT(*)函數將返回滿足SELECT語句的WHERE子句中的搜索條件的函數。

    實例3  COUNT(*)函數的使用

    查詢TEACHER表中的所有記錄的行數。實例代碼:

    SELECT COUNT(*) AS TOTALITEM

    FROM    TEACHER

    運行結果如圖8.3所示。

    圖8.3  使用COUNT(*)函數對表中的行數計數

    在該例中,SELECT語句中沒有WHERE子句,那么認為表中的所有行都滿足SELECT語句,所以SELECT語句將返回表中所有行的計數,結果與5.2.1節的表5-1列出的TEACHER表的數據相吻合。

    如果DBMS在其系統表中存儲了表的行數,COUNT(*)將很快地返回表的行數,因為這時,DBMS不必從頭到尾讀取表,并對物理表中的行計數,而直接從系統表中提取行的計數。而如果DBMS沒有在系統表存儲表的行數,將具有NOT NULL約束的列作為參數,使用COUNT( )函數,則可能更快地對表行計數。

    注意

    COUNT(*)函數將準確地返回表中的總行數,而僅當COUNT()函數的參數列沒有NULL值時,才返回表中正確的行計數,所以僅當受NOT NULL限制的列作為參數時,才可使用COUNT( )函數代替COUNT(*)函數。

    2.使用COUNT( )函數對一列中的數據計數

    COUNT( )函數可用于對一列中的數據值計數。與忽略了所有列的COUNT(*)函數不同,COUNT( )函數逐一檢查一列(或多列)中的值,并對那些值不是NULL的行計數。

    實例4  查詢多列中所有記錄的行數

    查詢TEACHER表中的TNO列、TNAME列以及SAL列中包含的所有數據行數。實例代碼:

    SELECT                              COUNT(TNO) AS TOTAL_TNO, COUNT(TNAME) AS TOTAL_TNAME,

                                                            COUNT(SAL) AS TOTAL_SAL

    FROM                                 TEACHER

    運行結果如圖8.4所示。

    圖8.4  使用COUNT( )函數對一列中的數據計數

    可見,TNO列與TNAME列由于其中不含有NULL值,所以其計數與使用COUNT(*)函數對TEACHER表中的記錄計數結果相一致,而SAL列由于其中有兩行數據為NULL,所以這兩列沒有被計入在內,計數結果也就是8。

    3.使用COUNT( )函數對多列中的數據計數

    COUNT( )函數不僅可用于對一列中的數據值計數,也可以對多列中的數據值計數。如果對多列計數,則需要將要計數的多列通過連接符連接后,作為COUNT( )函數的參數。下面將結合具體的多列計數的實例,說明其使用過程。

    *說明

    關于如何使用連接符連接多列可參見本書的7.2節。

    實例5  使用COUNT( )函數對多列中的數據計數

    統計TEACHER表中的TNO列、TNAME列和SAL列中分別包含的數據行數,以及TNO列和TNAME列、TNAME列和SAL列一起包含的數據行數。實例代碼:

    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_NAMESAL

    FROM                                 TEACHER

    運行結果如圖8.5所示。

    圖8.5  使用COUNT( )函數對多列中的數據計數

    在進行兩列的連接時,由于它們的數據類型不一致,因此要使用CAST表達式將它們轉換成相同的數據類型。

    在7.2.1節已經講過,如果在被連接的列中的任何一列有NULL值時,那么連接的結果為NULL,則該列不會被COUNT( )函數計數。

    注意

    COUNT( )函數只對那些傳遞到函數中的參數不是NULL的行計數。

    4.使用COUNT函數對滿足某種條件的記錄計數

    也可以在SELECT語句中添加一些子句約束來指定返回記錄的個數。

    實例6  使用COUNT函數對滿足某種條件的記錄計數

    查詢TEACHER表中女教師記錄的數目。實例代碼:

    SELECT COUNT(*) AS TOTALWOMEN

    FROM    TEACHER

    WHERE           TSEX='女'

    運行結果如圖8.6所示。

    圖8.6  使用COUNT函數對滿足某種條件的記錄計數

    這時結果為6而不是前面的所有記錄10。之所以可以通過WHERE子句定義COUNT()函數的計數條件,這與SELECT語句各個子句的執行順序是分不開的。前面已經講過,DBMS首先執行FROM子句,而后是WHERE子句,最后是SELECT子句。所以COUNT()函數只能用于滿足WHERE子句定義的查詢條件的記錄。沒有包括在WHERE子句的查詢結果中的記錄,都不符合COUNT()函數。

    8.2.3  最大/最小值函數—MAX()/MIN()

    當需要了解一列中的最大值時,可以使用MAX()函數;同樣,當需要了解一列中的最小值時,可以使用MIN()函數。語法如下。

    SELECT          MAX (column_name) / MIN (column_name)

    FROM            table_name

    說明:列column_name中的數據可以是數值、字符串或是日期時間數據類型。MAX()/MIN()函數將返回與被傳遞的列同一數據類型的單一值。

    實例7  MAX()函數的使用

    查詢TEACHER表中教師的最大年齡。實例代碼:

    SELECT MAX (AGE) AS MAXAGE

    FROM    TEACHER

    運行結果如圖8.7所示。

    圖8.7  TEACHER表中教師的最大年齡

    然而,在實際應用中得到這個結果并不是特別有用,因為經常想要獲得的信息是具有最大年齡的教師的教工號、姓名、性別等信息。

    然而SQL不支持如下的SELECT語句。

    SELECT TNAME, DNAME, TSEX, MAX (AGE)

    FROM    TEACHER

    因為聚合函數處理的是數據組,在本例中,MAX函數將整個TEACHER表看成一組,而TNAME、DNAME和TSEX的數據都沒有進行任何分組,因此SELECT語句沒有邏輯意義。同樣的道理,下面的代碼也是無效的。

    SELECT TNAME, DNAME, TSEX,SAL ,AGE

    FROM    TEACHER

    WHERE   AGE=MAX (AGE)

    解決這個問題的方法,就是在WHERE子句中使用子查詢來返回最大值,然后再基于這個返回的最大值,查詢相關信息。

    實例8  在WHERE子句中使用子查詢返回最大值

    查詢TEACHER表中年紀最大的教師的教工號、姓名、性別等信息。

    實例代碼:

    SELECT TNAME, DNAME, TSEX, SAL, AGE

    FROM    TEACHER

    WHERE   AGE=(SELECT MAX (AGE) FROM   TEACHER)

    運行結果如圖8.8所示。

    圖8.8  在WHERE子句中使用子查詢返回最大值

    MAX()和MIN()函數不僅可以作用于數值型數據,也可以作用于字符串或是日期時間數據類型的數據。

    實例9  MAX()函數用于字符型數據

    如下面代碼:

    SELECT MAX (TNAME) AS MAXNAME

    FROM    TEACHER

    運行結果如圖8.9所示。

    圖8.9  在字符串數據類型中使用MAX的結果

    可見,對于字符串也可以求其最大值。

    *說明

    對字符型數據的最大值,是按照首字母由A~Z的順序排列,越往后,其值越大。當然,對于漢字則是按照其全拼拼音排列的,若首字符相同,則比較下一個字符,以此類推。

    當然,對與日期時間類型的數據也可以求其最大/最小值,其大小排列就是日期時間的早晚,越早認為其值越小,如下面的實例。

    實例10  MAX()、MIN()函數用于時間型數據

    從COURSE表中查詢最早和最晚考試課程的考試時間。其中COURSE表的結構和數據可參見本書6.1節的表6-1。實例代碼:

    SELECT MIN (CTEST) AS EARLY_DATE,

                        MAX (CTEST) AS LATE_DATE

    FROM    COURSE

    運行結果如圖8.10所示。

    圖8.10  COURSE表中最早和最晚考試課程的考試時間

    可見,返回結果的數據類型與該列定義的數據類型相同。

    注意

    確定列中的最大值(最小值)時,MAX( )(MIN( ))函數忽略NULL值。但是,如果在該列中,所有行的值都是NULL,則MAX( )/MIN( )函數將返回NULL值。

    8.2.4  均值函數——AVG()

    函數AVG()用于計算一列中數據值的平均值。語法如下。

    SELECT  AVG (column_name)

    FROM    table_name

    說明:AVG()函數的執行過程實際上是將一列中的值加起來,再將其和除以非NULL值的數目。所以,與SUM( )函數一樣,AVG()函數只能作用于數值型數據,即列column_name中的數據必須是數值型的。

    實例11  AVG()函數的應用

    從TEACHER表中查詢所有教師的平均年齡。實例代碼:

    SELECT AVG (AGE) AS AVG_AGE

    FROM    TEACHER

    運行結果如圖8.11所示。

    圖8.11  TEACHER表中所有教師的平均年齡

    在計算平均值時,AVG()函數將忽略NULL值。因此,如果要計算平均值的列中有NULL值,計算均值時,要特別注意。

    實例12  AVG()函數對NULL值的處理

    從TEACHER表中查詢所有教師的平均工資。實例代碼:

    SELECT                              AVG (SAL) AS AVG_AGE1,SUM(SAL)/COUNT(*) AS AVG_AGE2,

                                                             SUM(SAL)/COUNT(SAL) AS AVG_AGE3

    FROM                                 TEACHER

    運行結果如圖8.12所示。

    圖8.12  TEACHER表中所有教師的平均工資

    可以發現得到了不同的結果。實際上,“AVG (SAL)”與“SUM(SAL)/COUNT(SAL)”語句是等價的。因為AVG(SAL)語句的執行過程實際上是將SAL列中的值加起來,再將其和(也就等價于SUM(SAL))除以非NULL值的數目(也就等價于COUNT(SAL))。而語句“SUM(SAL)/COUNT(*)”則不然,因為COUNT(*)返回的是表中所有記錄的個數,而不管SAL列中的數值是否為NULL。

    注意

    AVG()函數在計算一列的平均值時,忽略NULL值。但是,如果在該列中,所有行的值都是NULL,則AVG()函數將返回NULL值。

    如果不想對列中的所有值求平均,則可在WHERE子句中使用搜索條件來限制用于計算均值的行。

    實例13  在WHERE子句中使用搜索條件來限制用于計算均值的行

    從TEACHER表中查詢所有計算機系教師的平均年齡。實例代碼:

    SELECT AVG (AGE) AS AVGCOMPUTER_AGE

    FROM    TEACHER

    WHERE   DNAME = '計算機'

    運行結果如圖8.13所示。

    圖8.13  TEACHER表中所有計算機系教師的平均年齡

    當執行SELECT語句時,DBMS將表中的每行對WHERE子句中的搜索條件“DNAME = '計算機'”求值。只有那些搜索條件為True時,行中的AGE值才傳到均值函數AVG (AGE)中。

    當然,除了顯示表中某列的平均值,還可用AVG()函數作為WHERE子句的一部分。與前面介紹的MAX()函數一樣,不能直接用于WHERE子句,必須以子查詢的形式。

    實例14  AVG()函數作為WHERE子句中搜索條件的一部分

    從TEACHER表中查詢所有年齡高于平均年齡的教師的信息。實例代碼:

    SELECT                              *

    FROM                                 TEACHER

    WHERE                               AGE >= (SELECT AVG (AGE) FROM    TEACHER)

    ORDER BY        AGE

    運行結果如圖8.14所示。

    圖8.14  TEACHER表中所有年齡高于平均年齡的教師的信息

    8.2.5  聚合分析的重值處理

    前面介紹的5種聚合函數,可以作用于所選列中的所有數據(不管列中的數據是否有重置),也可以只對列中的非重值進行處理,即把重復的值只取一次進行聚合分析。當然,對于MAX()/MIN()函數來講,重值處理意義不大。

    可以使用ALL關鍵字指明對所選列中的所有數據進行處理,使用DISTINCT關鍵字指明對所選列中的非重值數據進行處理。以AVG()函數為例,語法如下。

    SELECT  AVG ([ALL/DISTINCT] column_name)

    FROM    table_name

    說明:[ALL/DISTINCT]在缺省狀態下,默認是ALL關鍵字,即不管是否有重值,處理所有數據。其他聚合函數的用法與此相同。

    注意

    Microsoft Access數據庫不支持在聚合函數中使用DISTINCT關鍵字。

    實例15  聚合分析的重值處理

    從TEACHER表中查詢工資SAL列中存在的所有記錄數。實例代碼:

    SELECT COUNT(ALL SAL) AS ALLSAL_COUNT

    FROM    TEACHER

    運行結果如圖8.15所示。

    圖8.15  TEACHER表中工資SAL列中存在的所有記錄數

    當然,在代碼中去除ALL關鍵字,也可以得到相同的結果。而如果從TEACHER表中,查詢工資SAL列中存在的不同記錄的數目,可采用如下代碼。

    SELECT COUNT(DISTINCT SAL) AS DISTINCTSAL_COUNT

    FROM    TEACHER

    運行結果如圖8.16所示。

    圖8.16  TEACHER表中SAL列存在的不同記錄的數目

    對比兩個結果,使用DISTINCT關鍵字后,工資SAL列中的重值并沒有列入統計的范圍之內。另外還要強調一點,在所有5種聚合函數中,除了COUNT(*)函數外,其他的函數在計算過程中都忽略NULL值,即把NULL值的行排除在外,不進行分析。

    8.2.6  聚合函數的組合使用

    前面介紹的實例中,聚合函數都是單獨使用的。聚合函數也可以組合使用,即在一條SELECT語句中,可以使用多個聚合函數。

    實例16  使用多個聚合函數

    如下面的代碼:

    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_sal

    FROM    TEACHER

    運行結果如圖8.17所示。

    圖8.17  聚合函數的組合應用

    該例在一條SELECT語句中,幾乎用到了所有的聚合函數。其中num_items為TEACHER表所有記錄的條目,max_sal為TEACHER表中記錄的最高工資,min_age為TEACHER表中記錄的最小年齡,avg_sal為所有TEACHER表中的工資記錄的平均值,disavg_sal為TEACHER表中所有不同的工資記錄的平均值。


      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 精品无码国产自产拍在线观看| AV区无码字幕中文色| 強壮公弄得我次次高潮A片| 亚洲精品无码你懂的| 欧美人与动人物牲交免费观看久久| 99国精品午夜福利视频不卡99| 冲田杏梨AV一区二区三区| 午夜无码大尺度福利视频| 国产线播放免费人成视频播放| 国产萌白酱喷水视频在线观看| 自拍偷自拍亚洲精品播放| 欧美成本人视频免费播放| 精品无码三级在线观看视频| 国产成人一区二区三区免费| 成在线人永久免费视频播放| 中文字幕国产精品av| 人妻丰满熟妇AV无码区动漫| 午夜福利国产精品视频| 无码一区二区三区AV免费| 白嫩少妇无套内谢视频| 亚洲AV综合色区无码一区| 色爱综合激情五月激情| 久久丫精品国产亚洲AV不卡| 久久精品第九区免费观看| 婷婷综合久久狠狠色成人网| 亚洲A综合一区二区三区| 亚洲AV无码专区国产乱码电影| 国产AV无码专区亚洲AV紧身裤| 亚洲欧美成人久久一区| 久久精品人妻无码专区| 亚洲天堂av日韩精品| 国产精品情侣呻吟对白视频| 国产边摸边吃奶边叫做激情视频| 国产国拍亚洲精品永久软件| 男人添女人下部高潮视频| 丁香五月婷激情综合第九色 | 老熟妇高潮一区二区三区| 亚洲制服丝袜中文字幕在线| 亚洲av午夜成人片| 美女黄18以下禁止观看| 久久一日本道色综合久久|