Summarizing和群組資料
聚集(aggregate)函式、或集合(set)函式,這會在一個群組的值上執行,產生單一、總結的值。

沒有聚集的查詢會一個一個處理列,每一列會個別處理然後放到結果中,聚集查詢將表格視為一個整體,並且從它建立新的列。
聚集函式
  • SumAvg 只能作用於 數值資料
  • MinMax 能作用於 字元 , 數值 , 日期時間
  • Count 可以作用於所有資料型態
  • Count ( * ) 會忽略空值 , 傳回正整數或 0 ,它永遠都不會傳回空值 , 而是傳回正整數或零。
  •  聚集運算式不能出現在Where子句中。
範例:
SELECT type , SUM(sales)
  FROM titles
    GROUP BY type
在 Select 中 , 聚集函數與 非聚集函數不能混合使用 , 除非使用 Group By 群組列
SELECT MIN(sales) , MAX(sales)
  FROM titles
使用超過一個的聚集函數 Select Min(sales) , Max(sales)
不合法的
不可以巢狀化聚集函式
SELECT SUM(AVG(sales))
聚集函數不能出現在 Where 子句中 Select type From tables Where sales = Max(sales) : ---->不合法的
建立聚集運算式
 4. 無法巢狀化聚集函式 Select Sum(Avg(sales)) From tables
 5. 可在子查詢使用聚集函式 Select name From tables Where sales = (Select Max(sales) from tables)
 6. 聚集函數中無法使用子查詢
Min ( ) 最小值
 Select Min ( Number ) As 最小數值
 Select Min ( DateTime ) As 最早的日期或時間
 Select Min ( String ) As 排序中最低的值
Max ( ) 最大值
 Select Max ( Number ) As 最 大數值
 Select Max ( DateTime ) As 最 後的日期或時間
 Select Max ( String ) As 照字母排序中最後的值
  • Max 與 Min 都能作用於字元、數值及日期時間資料型態
Sum ( ) 計算和
  • Sum只能作用於數值資料型態
Avg() 計算平均
  • Avg只能作用於數值資料型態
  • 沒有列 (也就是沒有符合條件的列) 的avg( )為 Null--而不是 0
  • 用SQL去做統計是不好的 , 應該善用DBMS的Analysis Services來做會比較恰當
Counter 計算列
Counter ( expr ) 求出所有沒有 null 值的列的數目
Counter ( * ) 傳回所有列的數目 , 包含 null 和重覆的
Count( * ) - Count( expr ) 求出所有 null 的數目
  • count( expr ) 及 count( * ) 做用於所有的資料型態 , 而且不會傳回 null
Distinct 聚集不同的值 (消除重覆的值)
  • 跟sum( ) , avg( ) , count ( ) 一起使用時 , distinct 會在處理之前消除重覆的值。
    select Sum( distinct sales )
  • Select   Sum( Distinct price) ....取得不同值的和   ...這個在ACCESS中是不合法的 ,Access不支援distinct聚集函式如左例
    但是可以改成以下的方法
    select Sum(price) From table where (Select distinct price from table)
  • Select   Avg ( Distinct price) .....取得不同值的平均
  • count ( distinct ) / count( ). ... 計算重覆率的東西
Group By 群組列
Select au_id , Count(*) As "Au_IDNum" from tables
          Group By au_id
  •  au_id稱為群組欄位 , 群組欄位可以是欄位名稱或衍生欄位
  • 如果Select包含多個欄位查詢則Group by也必須精確地符合Select欄位, 如例二
  • 如果群組欄位包含空值 , 那一個空值會查詢出單一群組 , 如果包含多個空值則會依空值的數目而產生出相等數目的群結 ,因為空值彼此不相等。
  • Where子句使用在Group By子句前 ,以先行過濾掉其他不要的列
  • 無法在Group By 中使用欄位別名
  • 如果陳述式中包含Order By 欄位 ,則其排序的欄位名稱必須在 Select 後的欄位名稱也有
  • 注意:Count(*)是連空值都計算進去的 , 所以 Group By時會與Count(exp)不同
  • 如果使用時沒有聚集函數 , 則Group By的作用與Distinct是一樣的
Select au_id, type ,publish , Count(*) As "Au_IDN" from tables  Group By au_id,type,publish
select type from table Group by type
                        ||
select distinct type from table

用distinct較好
Having 過濾群組
Select type , Count(price) As "ToPrice",
                     Avg(price)   As "AvgPrice"  from tables
 Group By type     Having Avg(Price) > 10000
Having 子句在 Group By子句中設定條件 ,類似Where與Select互動的方式

就像Where限制Select顯示的數量 , Having限制Group By群組的數目
**Where過濾From和Join所產生的列
**Group By 群組 Where的輸出
**Having過濾Group By 群組的結果

一般來說左方第二個範例比第三個好 ,雖然它們的輸出結果是相同的

Select pub_id , Sum(sales) From Titles ----->較好
    Where pub_id In('p03','p04')
       Group By pub_id
       Having Sum(sales) > 10000
Select pub_id , Sum(sales) From Titles

       Group By pub_id
Having Sum(sales) > 10000 And pub_id In('p03','p04')