當前位置:首頁 » 編程語言 » sql的核心集合函數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql的核心集合函數

發布時間: 2023-06-08 09:45:56

『壹』 如何利用sql Server 2012 使用聚合函數統計匯總

1.用SELECT語句對數據進行統計匯總
2.集合函數(聚合函數,統計函派團激數)
3.為了有效處理查詢得到的數據集合,SQL Server提供了一系列統計函數.
4.這些函數可以實現數據集合和匯總:
avg ([ALL|DISTINCT]列名或猛) 求指定數字欄位的平均值
sum ([ALL|DISTINCT]列名) 求指定數字欄位的總和
max([ALL|DISTINCT]列名) 求指定數字欄位中最大值
min ([ALL|DISTINCT]列名) 求指定數字欄位中最小值
count([ALL|DISTINCT]列名) 求滿足條件記錄中指定欄位不為空的記錄個數塵襪!

『貳』 關於sql聚集函數的正確描述是什麼

一下內容純屬抄襲~,希望有點用~

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表中所有不同的工資記錄的平均值。

『叄』 SQL語句中 聚合函數count()忽略空值么

SQL語句函數count(),如果括弧中是列名稱,是忽略空值NULL的,即返回列的值的數目,不包含NULL值。

COUNT函數,用於Excel中對給定數據集合或者單元格區域中數據的個數進行計數,其語法結構為COUNT(value1,value2, ...)。COUNT函數只能對數字數據進行統計,對於空單元格、邏輯值或者文本數據將被忽略,因此可以利用該函數來判斷給定的單元格區域中是否包含空單元格。

(3)sql的核心集合函數擴展閱讀:

如果參數是一個數組或引用,那麼只統計數組或引用中的數字;數組中或引用的空單元格、邏輯值、文字或錯誤值都將忽略。具體如下:

如果參數為數字、日期或者代表數字的文本(例如,用引號引起的數字,如 "1"),則將被計算在內。

邏輯值和直接鍵入到參數列表中代表數字的文本被計算在內。

如果參數為錯誤值或不能轉換為數字的文本,則不會被計算在內。

如果參數為數組或引用,則只計算數組或引用中數字的個數。不會計算數組或引用中的空單元格、邏輯值、文本或錯誤值。

『肆』 SQL函數有哪些(SQL函數有哪些)

聚合函段升數:sum-求和

avg-求平均值

max-求最大值

min-求最小值

count-求記錄數

當使用這些函數時,如果不使用groupby(分組友迅)這句,則握告老是對整個表做運算。加上分組子句,則在每個組的基礎上運算。

『伍』 求SQL的全部函數!完整的加100分!

一.聚合函數
AVG 返回組中值的平均值。空值將被忽略
BINARY_CHECKSUM 返回對表中的行或表達式列表計算的二進制校驗值。BINARY_CHECKSUM 可用於檢測表中行的更改
CHECKSUM 返回在表的行上或在表達式列表上計算的校驗值。CHECKSUM 用於生成哈希索引
CHECKSUM_AGG 返回組中值的校驗值。空值將被忽略
COUNT 返回組中項目的數量
COUNT_BIG 返回組中項目的數量。COUNT_BIG 的使用與 COUNT 函數相似。它們之間的唯一差別是它們的返回值:COUNT_BIG 總是返回 bigint 數據類型值,而 COUNT 則總是返回 int 數據類型值
GROUPING "是一個聚合函數,它產生一個附加的列,當用 CUBE 或 ROLLUP 運算符添加行時,附加的列輸出值為1,當所添加的行不是由 CUBE 或 ROLLUP 產生時,附加列值為0。
僅在與包含 CUBE 或 ROLLUP 運算符的 GROUP BY 子句相聯系的選擇列表中才允許分組"
MAX 返回表達式的最大值
MIN 返回表達式的最小值
SUM 返回表達式中所有值的和,或只返回 DISTINCT 值。SUM 只能用於數字列。空值將被忽略
STDEV 返回給定表達式中所有值的統計標准偏差
STDEVP 返回給定表達式中所有值的填充統計標准偏差
VAR 返回給定表達式中所有值的統計方差。
VARP 返回給定表達式中所有值的填充的統計方差。

二.數學函數
ABS 返回給定數字表達式的絕對值
ACOS 返回以弧度表示的角度值,該角度值的餘弦為給定的 float 表達式;本函數亦稱反餘弦。
ASIN 返回以弧度表示的角度值,該角度值的正弦為給定的 float 表達式;亦稱反正弦
ATAN 返回以弧度表示的角度值,該角度值的正切為給定的 float 表達式;亦稱反正切
ATN2 返回以弧度表示的角度值,該角度值的正切介於兩個給定的 float 表達式之間;亦稱反正切
CEILING 返回大於或等於所給數字表達式的最小整數
COS 一個數學函數,返回給定表達式中給定角度(以弧度為單位)的三角餘弦值
COT 一個數學函數,返回給定 float 表達式中指定角度(以弧度為單位)的三角餘切值
DEGREES 當給出以弧度為單位的角度時,返回相應的以度數為單位的角度
EXP 返回所給的 float 表達式的指數值
FLOOR 返回小於或等於所給數字表達式的最大整數
LOG 返回給定 float 表達式的自然對數
LOG10 返回給定 float 表達式的以 10 為底的對數
PI 返回 PI 的常量值
POWER 返回給定表達式乘指定次方的值
RADIANS 對於在數字表達式中輸入的度數值返回弧度值
RAND 返回 0 到1 之間的隨機float 值
ROUND 返回數字表達式並四捨五入為指定的長度或精度
SIGN 返回給定表達式的正 (+1)、零 (0) 或負 (-1) 號
SIN 以近似數字 (float) 表達式返回給定角度(以弧度為單位)的三角正弦值
SQUARE 返回給定表達式的平方
SQRT 返回給定表達式的平方根
TAN 返回輸入表達式的正切值
三.日期函數
DATEADD 在向指定日期加上一段時間的基礎上,返回新的 datetime 值。
DATEDIFF 返回跨兩個指定日期的日期和時間邊界數
DATENAME 返回代表指定日期的指定日期部分的字元串
DATEPART 返回代表指定日期的指定日期部分的整數
DAY 返回代表指定日期的天的日期部分的整數
GETDATE 按 datetime 值的 Microsoft�0�3 SQL Server�6�4 標准內部格式返回當前系統日期和時間
GETUTCDATE 返回表示當前 UTC 時間(世界時間坐標或格林尼治標准時間)的 datetime 值
MONTH 返回代表指定日期月份的整數
YEAR 返回表示指定日期中的年份的整數
四.系統函數
APP_NAME 返回當前會話的應用程序名稱(如果應用程序進行了設置)。
CASE 表達式 計算條件列表並返回多個可能結果表達式之一(詳見PPT資料)
CAST 和 CONVERT 將某種數據類型的表達式顯式轉換為另一種數據類型(詳見PPT資料)
COALESCE 返回其參數中第一個非空表達式
COLLATIONPROPERTY 返回給定排序規則的屬性
CURRENT_TIMESTAMP 返回當前的日期和時間。等價於 GETDATE()
CURRENT_USER 返回當前的用戶。價於 USER_NAME()

『陸』 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 檢查的行進行分組和聚集計算。

『柒』 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),結果分別為假、真。
例如:

『捌』 SQL有哪些函數

1.絕對值
SQL:select abs(-1) value
O:select abs(-1) value from al
2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from al
3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from al
4.取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from al
5.四捨五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from al 1.2346
6.e為底的冪
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from al 2.71828182
7.取e為底的對數
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from al; 1
8.取10為底對數
S:select log10(10) value 1
O:select log(10,10) value from al; 1
9.取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from al 16
10.取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from al 2
11.求任意數為底的冪
S:select power(3,4) value 81
O:select power(3,4) value from al 81
12.取隨機數
S:select rand() value
O:select sys.dbms_random.value(0,1) value from al;
13.取符號
S:select sign(-8) value -1
O:select sign(-8) value from al -1
----------數學函數
14.圓周率
S:SELECT PI() value 3.1415926535897931
O:不知道
15.sin,cos,tan 參數都以弧度為單位
例如:select sin(PI()/2) value 得到1(SQLServer)
16.Asin,Acos,Atan,Atan2 返回弧度
17.弧度角度互換(SQLServer,Oracle不知道)
DEGREES:弧度-〉角度
RADIANS:角度-〉弧度
---------數值間比較
18. 求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from al
19. 求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from al
20.如何處理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
--------數值間比較
21.求字元序號
S:select ascii('a') value
O:select ascii('a') value from al
22.從序號求字元
S:select char(97) value
O:select chr(97) value from al
23.連接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')||33 value from al
23.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from al
23.模糊子串的位置 --返回2,參數去掉中間%則返回7
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle沒發現,但是instr可以通過第四霾問 刂瞥魷執問?BR> select INSTR('sdsfasdqe','sd',1,2) value from al 返回6
24.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from al
25.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from al
26.子串全部替換
S:沒發現
O:select Translate('fasdbfasegas','fa','我' ) value from al
27.長度
S:len,datalength
O:length
28.大小寫轉換 lower,upper
29.單詞首字母大寫
S:沒發現
O:select INITCAP('abcd dsaf df') value from al
30.左補空格(LPAD的第一個參數為空格則同space函數)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from al
31.右補空格(RPAD的第一個參數為空格則同space函數)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from al
32.刪除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33. 重復字元串
S:select REPLICATE('abcd',2) value
O:沒發現
34.發音相似性比較(這兩個單詞返回值一樣,發音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from al
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差
返回0-4,4為同音,1最高
--------------日期函數
35.系統時間
S:select getdate() value
O:select sysdate value from al
36.前後幾日
直接與整數相加減
37.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from al
select to_char(sysdate,'yyyy-mm-dd') value from al
38.求時間
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from al
39.取日期時間的其他部分
S:DATEPART 和 DATENAME 函數 (第一個參數決定)
O:to_char函數 第二個參數決定
參數---------------------------------下表需要補充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O無效)
dayofyear dy, y (O表星期)
day dd, d (d O無效)
week wk, ww (wk O無效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S無效)
minute mi, n (n O無效)
second ss, s (s O無效)
millisecond ms (O無效)
----------------------------------------------
40.當月最後一天
S:不知道
O:select LAST_DAY(sysdate) value from al
41.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字元串轉時間
S:可以直接轉或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求兩日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用兩個日期相減(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.根據差值求新的日期(比如分鍾)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同時區時間
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----時區參數,北京在東8區應該是Ydt-------
AST ADT 大西洋標准時間
BST BDT 白令海標准時間
CST CDT 中部標准時間
EST EDT 東部標准時間
GMT 格林尼治標准時間
HST HDT 阿拉斯加—夏威夷標准時間
MST MDT 山區標准時間
NST 紐芬蘭標准時間
PST PDT 太平洋標准時間
YST YDT YUKON標准時間
Oracle支持的字元函數和它們的Microsoft SQL Server等價函數:
函數 Oracle Microsoft SQL Server
把字元轉換為ASCII ASCII ASCII
字串連接 CONCAT (expression + expression)
把ASCII轉換為字元 CHR CHAR
返回字元串中的開始字元(左起) INSTR CHARINDEX
把字元轉換為小寫 LOWER LOWER
把字元轉換為大寫 UPPER UPPER
填充字元串的左邊 LPAD N/A
清除開始的空白 LTRIM LTRIM
清除尾部的空白 RTRIM RTRIM
字元串中的起始模式(pattern) INSTR PATINDEX
多次重復字元串 RPAD REPLICATE
字元串的語音表示 SOUNDEX SOUNDEX
重復空格的字串 RPAD SPACE
從數字數據轉換為字元數據 TO_CHAR STR
子串 SUBSTR SUBSTRING
替換字元 REPLACE STUFF
將字串中的每個詞首字母大寫 INITCAP N/A
翻譯字元串 TRANSLATE N/A
字元串長度 LENGTH DATELENGTH or LEN
列表中最大的字元串 GREATEST N/A
列表中最小的字元串 LEAST N/A
如果為NULL則轉換字串 NVL ISNULL
日期函數
函數 Oracle Microsoft SQL Server
日期相加 (date column +/- value) or
ADD_MONTHS DATEADD
兩個日期的差 (date column +/- value) or
MONTHS_BETWEEN DATEDIFF
當前日期和時間 SYSDATE GETDATE()
一個月的最後一天 LAST_DAY N/A
時區轉換 NEW_TIME N/A
日期後的第一個周日 NEXT_DAY N/A
代表日期的字元串 TO_CHAR DATENAME
代表日期的整數 TO_NUMBER
(TO_CHAR)) DATEPART
日期舍入 ROUND CONVERT
日期截斷 TRUNC CONVERT
字元串轉換為日期 TO_DATE CONVERT
如果為NULL則轉換日期 NVL ISNULL
轉換函數
函數 Oracle Microsoft SQL Server
數字轉換為字元 TO_CHAR CONVERT
字元轉換為數字 TO_NUMBER CONVERT
日期轉換為字元 TO_CHAR CONVERT
字元轉換為日期 TO_DATE CONVERT
16進制轉換為2進制 HEX_TO_RAW CONVERT
2進制轉換為16進制 RAW_TO_HEX CONVERT
其它行級別的函數
函數 Oracle Microsoft SQL Server
返回第一個非空表達式 DECODE COALESCE
當前序列值 CURRVAL N/A
下一個序列值 NEXTVAL N/A
如果exp1 = exp2, 返回null DECODE NULLIF
用戶登錄賬號ID數字 UID SUSER_ID
用戶登錄名 USER SUSER_NAME
用戶資料庫ID數字 UID USER_ID
用戶資料庫名 USER USER_NAME
當前用戶 CURRENT_USER CURRENT_USER
用戶環境(audit trail) USERENV N/A
在CONNECT BY子句中的級別 LEVEL N/A
合計函數
函數 Oracle Microsoft SQL Server
Average AVG AVG
Count COUNT COUNT
Maximum MAX MAX
Minimum MIN MIN
Standard deviation STDDEV STDEV or STDEVP
Summation SUM SUM
Variance VARIANCE VAR or VARP
Oracle還有一個有用的函數EXTRACT,提取並且返回日期時間或時間間隔表達式中特定的時間域:
EXTRACT(YEAR FROM 日期)