3.1函數組成程序員
在T-SQL中,變量既可用於輸入,也可用於輸出。用戶變量以@符號開頭,用於聲明特定的數據類型。能夠使用SET或者SELECT語句給變量賦值。web
運行結果:12算法
同時,也能夠使用SELECT來進行變量賦值。能夠在一個操做內同時給多個變量賦值。數據庫
運行結果:12,11數組
3.2聚合函數服務器
聚合函數應用特定的聚合操做並返回一個標量值。返回的數據類型對應於該列或者傳遞到函數中的值。聚合常常和分組、累積以及透視等表運算一塊兒使用。網絡
AVG()函數:返回一組數值中全部非空數值的平均值。函數
select AVG(UnitPrice) as Avgprice from Productsui
COUNT()函數:返回一個列內全部非空值的個數。url
MIN()和MAX()函數:返回一個列範圍內的最小非空值和最大值。當所查的列結構爲非數據類型,返回的數值爲ASCII值的大小。
SUM()函數:返回一個列範圍內全部非空值的總和。
3.3配置變量
配置變量返回SQL Server執行環境的標量信息。
3.31@@ERROR變量
包含當前鏈接發生的最後一次錯誤的代碼。執行的語句沒有發生錯誤時,@@ERROR變量的值是0.出現標準錯誤時,錯誤是由數據庫引擎引起的。全部的標準錯誤代碼與信息都保存在sys.messages系統視圖中。
運行結果
消息8134,級別16,狀態1,第1 行
遇到以零做除數錯誤。
3.32@@SERVICENAME變量
用於執行和維護當前SQL Server實例的Windows服務名。
3.33@@TOTALE_RRORS變量
記錄從打開當前鏈接開始發生的總錯誤次數。
3.34@@TOTAL_READ變量
從打開當前鏈接時開始計算的磁盤讀取總數
運行結果
1250
3.35@@VERSION變量
返回當前SQL Server實例的完整版本信息
運行結果
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
3.36錯誤函數
編寫錯誤錯誤代碼時,SQL程序員必須把這些代碼放在會引起系統錯誤的catch代碼塊中。
錯誤函數用於返回錯誤的特定信息:
ERROR_MESSAGE()---返回錯誤的描述
ERROR_NUMBER()---返回錯誤號
ERROR_SEVERITY()---返回錯誤的嚴重級別
ERROR_STATE()---返回錯誤的狀態號
ERROR_LINE()---返回例程中致使錯誤的行號
ERROR_PROCEDURE()---返回發生錯誤的儲存過程名或觸發器名
3.4轉換函數
3.41CAST()函數
包括用AS關鍵字分割的源值和目標數據類型
運行結果
123.10
3.41CONVERT()函數
須要兩個參數:第一個是目標數據類型,第2個是源數據
運行結果
2010.12
CONVERT函數還能夠返回通過格式化的字符串值。
3.42STR()函數
將數字轉化爲字符串,函數有三個參數:數值、總長度和小數位數。
運行結果
123457.00
3.5遊標函數與變量
遊標能夠處理多行數據,在過程循環中一次訪問一行。
3.51CURSOR_STATUS()函數
返回一個整型值,表示傳遞給這個函數的遊標類型變量的狀態。
3.52@@CURSOR_ROWS全局變量
返回一個整型值,表示當前鏈接中打開的遊標中的行數。
3.53@@FETCH_STATUS全局變量
返回一個標記,用於表示當前遊標指針的狀態。
3.6日期函數
3.61DATEADD()函數
在日期/時間值上加上日期單位間隔。
運行結果
2010-04-20 00:00:00.000
其中時間間隔參數傳遞給DATEADD()函數以下
時間間隔 |
時間間隔參數 |
年 |
Year,yyyy,yy |
季度 |
Quarter,qq,q |
月 |
Month,mm,m |
一年內的天 |
DayOfYear,dy,y |
天 |
Day,dd,d |
星期 |
Week,wk,ww |
小時 |
Hour,hh |
分鐘 |
Minute,mi,m |
秒 |
Second,ss,s |
毫秒 |
Millsecond,ms |
3.62DATEDIFF()函數
在等式的兩端有4個元素:起始日期、時間間隔、差值和最終日期。
運行結果
219
3.63DATEPART()與DATENAME()函數
返回datetime或者shortdatetime值日期部分。DATEPART()返回一個整型值,DATENAME()返回一個包含描述性文字的字符串。
運行結果
1
3.64GETDATE()與GETUTCDATE()函數
返回datetime類型的當前日期與時間。
3.65DAY()、MONTH()和YEAR()函數
運行結果
Year: 2010, Month: 1, Day: 21
3.66字符串操做函數
ACSII()、CHAR()、UNICODE()、NCHAR()返回ASCII碼等
CHARINDEX():尋找在一個字符串中某字符串第一次出現的位置
運行結果
2
PATINDEX():與charindex()類似,增長對通配符Like的支持,返回一個字符模式的索引
運行結果
2
LEN()函數:返回一個表明字符串長度的整型值
運行結果
10
LEFT()和RIGHT()函數:返回必定長度的子字符串。LEFT()返回字符串最左邊的字符。
運行結果
2010
運行結果
10
SUBSTRING()函數:從字符串的一個位置開始,返回一個特定長度的子字符串。返回最大可能長度的字符串,而不會將多出的長度以空格填空,索引從1開始
運行結果
20100120
LOWER()和UPPER()函數:將字符串中全部字符分別轉換爲小寫和大寫。
運行結果
KEYSKY
LTRIM()與RTRIM()函數:返回將字符串的左邊和右邊的空白修剪以後的字符串
REPLACE()函數:把字符串中的某個字符或某個子字符串替換爲另外一個字符或者子字符串。
運行結果
KeySky is receiving a message for a potential challenge
REPLICATE()與SPACE()函數:將一些字符重複填充進一個字符串。
運行結果
KeySky****
REVERSE()函數:將字符串中的字符轉置。
運行結果
ykSyeK
STUFF()函數:將字符串中的一部分替換爲另外一個字符串。
運行結果
KeyHelloKeySky
3.7數學函數
函數 |
說明 |
ABS() |
返回一個數的絕對值 |
ACOS() |
計算一個角的反餘弦值,以弧度表示 |
ASIN() |
計算一個角的正餘弦值,以弧度表示 |
ATAN() |
計算一個角的反切值,以弧度表示 |
ATN2() |
計算兩個值的反正切,以弧度表示 |
CEILING() |
返回大於或等於一個數的最小整數 |
COS() |
計算一個角的餘弦值,以弧度表示 |
COT() |
計算一個角的餘切值,以弧度表示 |
DEGREES() |
將一個角從弧度轉換爲角度 |
EXP() |
指數運算 |
FLOOR() |
返回小於或等於一個數的最大整數 |
LOG() |
計算以2爲底的天然對數 |
LOG10() |
計算以10爲底的天然對數 |
PI() |
返回以浮點數表示的圓周率 |
POWER() |
冪運算 |
RADIANS() |
將一個角從角度轉換爲弧度 |
RAND() |
返回以隨機數算法算出的一個小數 |
ROUND() |
對一個小數進行四捨五入運算 |
SIGN() |
根據參數正負,返回-1或者1 |
SQRT() |
返回一個數學的平方根 |
SQUARE() |
返回一個數的平方 |
TAN() |
計算一個角正切的值,以弧度表示 |
3.8系通通計變量
變量 |
說明 |
@@CONNECTIONS |
打開鏈接的次數 |
@@CPU_BUSY |
從上次啓動服務器開始,SQL Server一共工做的毫秒數 |
@@IDLE |
從上次啓動服務器開始,SQL Server一共空閒的毫秒數 |
@@IO_BUSY |
從上次啓動服務器開始,SQL Server一共處理的網絡數據包數 |
@@PACK_RECEIVED |
從上次啓動服務器開始,SQL Server一共收到的網絡數據包數 |
@@PACK_SENT |
從上次啓動服務器開始,SQL Server一共發送的網絡數據包數 |
@@PACKET_ERRORS |
從上次啓動服務器開始,SQL Server一共收到的網絡數據包錯誤數 |
@@TIMETICKS |
每一個時鐘滴答有多少毫秒 |
@@TOTAL_ERRORS |
從上次啓動服務器開始,SQL Server一共收到的磁盤I/O錯誤數 |
@@TOTAL_READ |
從上次啓動服務器開始,SQL Server一共進行的物理磁盤讀取次數 |
@@TOTAL_WRITE |
從上次啓動服務器開始,SQL Server一共進行的物理磁盤寫入次數 |
4.1複雜統計函數
STDEV()函數:返回某數字範圍內全部非空值的簡單標準方差。返回的數據類型是FLOAT
運行結果
33.8151114580251
STDEVP()函數:返回標準方差
VAR()函數:返回測量最小值或最大值和中點的距離有多遠。
4.2數據分組
4.21 GROUP BY子句
添加到查詢的WHERE和ORDER BY子句以後。查詢先於聚合函數與分組操做執行。這些結果讀進內存後,SQL Server會遍歷這些記錄,並在這些記錄上應用分組和聚合計算。
運行結果
1 60.00 2
2 23.00 1
4 64.00 2
6 64.00 2
8 26.00 1
9 99.00 1
10 28.00 1
11 113.00 2
13 83.00 1
14 27.00 1
4.22 HAVING子句
若是須要根據聚合值的結果來過濾分組查詢的結果,必須首先執行聚會操做。不能使用where子句,它會在分組和聚合以前對結果進行處理,HAVING子句實現分組後過濾行。
運行結果
1 60.00 2
4 64.00 2
6 64.00 2
11 113.00 2
4.23 ROLLUP子句
對列表進行小技和總計計算。
運行結果
1 60.00 2
4 64.00 2
6 64.00 2
11 113.00 2
NULL 587.00 14
4.24 CUBE子句
用於對每一個分組的列值執行累積。
4.25 GROUPING()子句
返回一個位值(1或者0)來代表某行是一個累計值,將該行與空值的聚合相隔離。
4.26 COMPUTE與COMPUTE BY子句
運行結果
1 25.00
1 35.00
2 23.00
4 12.00
4 52.00
6 27.00
6 37.00
8 26.00
9 99.00
10 28.00
11 65.00
11 48.00
13 83.00
14 27.00
587.00
5.1子查詢與鏈接
5.11 WHERE子句中的鏈接
這個查詢實現一個內鏈接,兩個列引用中間的等號表示這個查詢只返回兩個表中有匹配記錄的行。這種鏈接方式成爲同等鏈接,表示在鏈接運算中比較的兩個表中的值必須相等。
5.12 FROM子句中的鏈接
在FROM子句中,經過JOIN語句引用兩個表,後跟ON關鍵字。
官方推薦,在where 與FROM子句鏈接中使用FROM的ANSI標準方法。
5.13 鏈接的類型
內鏈接:只返回兩個表中的相關記錄;外鏈接:先返回同一個表中的全部行,而後返回第二個表中的相關行。
5.14 內鏈接
內鏈接的目的是將一個表中的記錄和另外一個表中的對應記錄進行匹配,前提是兩個表的相關列包含相同的值。例如上面的FROM子句鏈接和WHERE子句鏈接都屬於內鏈接
5.15 外鏈接
外鏈接用於從一個表中返回全部的行,而後匹配相關表中具備相同鏈接列值的行。在外鏈接中,查詢將返回一個表中不匹配的行。
這表示返回Categories中的全部行,而後返回相關的Products行
5.16 多列鏈接
在鏈接的基礎上使用AND和OR字符自合來實現多列鏈接
另外還有非同等鏈接以及一些特殊目的的鏈接運算。
5.17 合併查詢
UNION()查詢垂直地擴展結果,將一個記錄堆積到另外一個記錄的頂部。