今天要做一個查詢統計功能,一開始有點犯難,上午嘗試大半天才寫出統計sql語句,才發現自己sql分組查詢及聚集函數沒學好;其實就是group by子句和幾個聚集函數,熟練使用統計功能很簡單。在此總結下今天查詢統計是用到的幾個sql函數。
SQL聚集函數
sum函數 sum函數用於計算查詢表中指定字段中所有 記錄值的總和。 語法:sum(exp) 說明:該函數不計算包含Null 值的字段。
例:SELECT SUM(population) FROM bbc 這里的SUM作用在所有返回記錄的 population字段上,結果就是該查詢只返回 一個結果,即所有國家的總人口數。
avg函數 Avg函數是用來計算特定查詢字段中的一組數值的 算術平均值(將全部值的總和除以值的數目)。 語法:avg(exp) 說明:該函數只能對數值類型的字段進行計算。 例:求所有雇員薪水的平均值。 SELECT AVG(emp_salary) FROM employee;
count函數 count函數是用來計算查詢表中的記錄數。 語法:count(exp) 說明:count函數不計算具有Null字段的記錄,但如 果將exp設置為星號(*),則count函數將計算所有記 錄的總量,包括有Null的字段的記錄。Distinct短句可以取消指定列中的重復值 sql除了不允許對count(*)使用distinct,對其 余情況都能用distinct,但一般情況下是沒有 必要用的,除非你覺得的確是需要用distinct。
min函數 min函數是用來從查詢表中返回指定字段中 的最小值。 語法:min(exp)
max函數 max函數是用來從查詢表中返回指定字段中 的最大值。 語法:max(exp)
GROUP BY子句
對記錄的分組是通過關鍵字 GROUP BY 實現的, GROUP BY 后面跟着一個定義組的構成的屬性列 表。 如果我們使用語句 GROUP BY A1,……, Ak 我們就把關系分成了組,這樣當且僅當兩條記錄 在所有屬性 A1,……, Ak 上的值達成一致,它們才 是同一組的。 SQL 允許我們把一個表里面的記錄用GROUP BY 分成組。 然后上面描述的聚集操作符可以應用於 這些組上 (也就是說,聚集操作符的值不再是對 所有聲明的列的值進行操作, 而是對一個組的所 有值進行操作。這樣聚集函數是為每個組獨立地 進行計算的。)
當在查詢中沒有使用GROUP BY子句時,數據庫就把數據表 中的所有行為作為一個組來處理。通常情況下,我們並不希 望是這樣的。多數用戶都能理解組的概念,但在使用的時候 卻很快就陷入 麻煩中。有一個技巧是:如果有一列在 GROUP BY子句中沒有提到,就必須對它進行累計。換句話 說,就是必須對select中那些不包括在GROUP BY子句中的所有列使 用上面提到過的一個函數。
請注意如果要讓一個使用 GROUP BY 和聚集操 作符的查詢的結果有意義, 那么用於分組的屬性 也必須出現在目標列表中。 所有沒有在 GROUP BY 子句里面出現的屬性都只能通過使用聚集函數 來選擇。 否則就不會有唯一的數值與其它字段關 聯. 還要注意的是在聚集上聚集是沒有意義的,比如, AVG(MAX(sno)), 因為 SELECT 只做一個回合 的分組和聚集.你可以獲得這樣的結果, 方法是 使用臨時表或者在 FROM 子句中使用一個子 SELECT 做第一個層次的聚集。
總結:
在帶有group by 子句的查詢語句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚組函數
查詢語句的select 和group by ,having 子句是聚組函數唯一出現的地方,在where 子句中不能使用聚組函數。
當在gropu by 子句中使用having 子句時,查詢結果中只返回滿足having條件的組。在一個sql語句中可以有where子句和having子句。having 與where 子句類似,均用於設置限定條件。where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標准進行分組。
用到的其它函數:
1、CHARINDEX (<'substring_expression'>, <expression>)其中substring _expression 是所要查找的字符表達式,expression 可為字符串也可為列名表達式。如果沒有發現子串,則返回0 值。此函數不能用於TEXT 和IMAGE 數據類型。
2、CONVERT (<data_ type>[ length ], <expression> [, style])
1)data_type為SQL Server系統定義的數據類型,用戶自定義的數據類型不能在此使用。
2)length用於指定數據的長度,缺省值為30。
3)把CHAR或VARCHAR類型轉換為諸如INT或SAMLLINT這樣的INTEGER類型、結果必須是帶正號或負號的數值。
4)TEXT類型到CHAR或VARCHAR類型轉換最多為8000個字符,即CHAR或VARCHAR數據類型是最大長度。
5)IMAGE類型存儲的數據轉換到BINARY或VARBINARY類型,最多為8000個字符。
6)把整數值轉換為MONEY或SMALLMONEY類型,按定義的國家的貨幣單位來處理,如人民幣、美元、英鎊等。
7)BIT類型的轉換把非零值轉換為1,並仍以BIT類型存儲。
8)試圖轉換到不同長度的數據類型,會截短轉換值並在轉換值后顯示"+",以標識發生了這種截斷。
9)用CONVERT() 函數的style 選項能以不同的格式顯示日期和時間。style 是將DATATIME 和SMALLDATETIME 數據轉換為字符串時所選用的由SQL Server 系統提供的轉換樣式編號,不同的樣式編號有不同的輸出格式。