SQL函數

3.SQL函數

3.1函數組成程序員

  • 肯定性函數:若是函數的輸出只與輸入的參數的值相關,而與其餘外部因素無關。
  • 非肯定性函數:若是函數的輸出基於環境條件,或者產生隨機或者依賴結果的算法。

在T-SQL中,變量既可用於輸入,也可用於輸出。用戶變量以@符號開頭,用於聲明特定的數據類型。能夠使用SET或者SELECT語句給變量賦值。web

DECLARE @MyNumber int @MyCount int SET @MyNumber = 144 SET @MyCount = 100

SELECT SQRT ( @MyNumber )

運行結果:12算法

同時,也能夠使用SELECT來進行變量賦值。能夠在一個操做內同時給多個變量賦值。數據庫

DECLARE @MyNumber1 int , @MyNumber2 int , @MyResult1 int , @MyResult2 int

SELECT @MyNumber1 = 144 , @MyNumber2 = 121

SELECT @MyResult1 = SQRT ( @MyNumber1 ), @MyResult2 = SQRT ( @MyNumber2 )

SELECT @MyResult1 , @MyResult2

運行結果:12,11數組

3.2聚合函數服務器

聚合函數應用特定的聚合操做並返回一個標量值。返回的數據類型對應於該列或者傳遞到函數中的值。聚合常常和分組、累積以及透視等表運算一塊兒使用。網絡

AVG()函數:返回一組數值中全部非空數值的平均值。函數

select AVG(UnitPrice) as Avgprice from Productsui

COUNT()函數:返回一個列內全部非空值的個數。url

select count ( * ) as Countprice from Products

MIN()和MAX()函數:返回一個列範圍內的最小非空值和最大值。當所查的列結構爲非數據類型,返回的數值爲ASCII值的大小。

select MIN (ProductName) as MINName from Products

SUM()函數:返回一個列範圍內全部非空值的總和。

3.3配置變量

配置變量返回SQL Server執行環境的標量信息。

3.31@@ERROR變量

包含當前鏈接發生的最後一次錯誤的代碼。執行的語句沒有發生錯誤時,@@ERROR變量的值是0.出現標準錯誤時,錯誤是由數據庫引擎引起的。全部的標準錯誤代碼與信息都保存在sys.messages系統視圖中。

select 5 / 0

select @@error

運行結果

消息8134,級別16,狀態1,第1 行

遇到以零做除數錯誤。

3.32@@SERVICENAME變量

用於執行和維護當前SQL Server實例的Windows服務名。

3.33@@TOTALE_RRORS變量

記錄從打開當前鏈接開始發生的總錯誤次數。

3.34@@TOTAL_READ變量

從打開當前鏈接時開始計算的磁盤讀取總數

select @@TOTAL_READ

運行結果

1250

3.35@@VERSION變量

返回當前SQL Server實例的完整版本信息

select @@VERSION

運行結果

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關鍵字分割的源值和目標數據類型

select cast ( ' 123.1 ' as decimal ( 9 , 2 ))

運行結果

123.10

3.41CONVERT()函數

須要兩個參數:第一個是目標數據類型,第2個是源數據

select convert ( decimal ( 9 , 2 ), ' 2010.1234 ' )

運行結果

2010.12

CONVERT函數還能夠返回通過格式化的字符串值。

3.42STR()函數

將數字轉化爲字符串,函數有三個參數:數值、總長度和小數位數。

DECLARE @Num DECIMAL

SET @NUM = 123456.7191

SELECT STR ( @NUM , 9 , 4 )

運行結果

123457.00

3.5遊標函數與變量

遊標能夠處理多行數據,在過程循環中一次訪問一行。

3.51CURSOR_STATUS()函數

返回一個整型值,表示傳遞給這個函數的遊標類型變量的狀態。

3.52@@CURSOR_ROWS全局變量

返回一個整型值,表示當前鏈接中打開的遊標中的行數。

3.53@@FETCH_STATUS全局變量

返回一個標記,用於表示當前遊標指針的狀態。

3.6日期函數

3.61DATEADD()函數

在日期/時間值上加上日期單位間隔。

select dateadd ( Day , 90 , ' 1-20-2010 ' )

運行結果

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個元素:起始日期、時間間隔、差值和最終日期。

select datediff ( day , ' 1-20-2010 ' , ' 6-15-2009 ' )

運行結果

219

3.63DATEPART()與DATENAME()函數

返回datetime或者shortdatetime值日期部分。DATEPART()返回一個整型值,DATENAME()返回一個包含描述性文字的字符串。

select datepart ( month , ' 1-21-2010 ' )

運行結果

1

3.64GETDATE()與GETUTCDATE()函數

返回datetime類型的當前日期與時間。

3.65DAY()、MONTH()和YEAR()函數

select ' Year: ' + CONVERT ( varchar ( 4 ), YEAR ( GETDATE ()))

+ ' , Month: ' + CONVERT ( varchar ( 2 ), MONTH ( GETDATE ()))

+ ' , Day: ' + CONVERT ( varchar ( 2 ), DAY ( GETDATE ()))

運行結果

Year: 2010, Month: 1, Day: 21

3.66字符串操做函數

ACSII()、CHAR()、UNICODE()、NCHAR()返回ASCII碼等

CHARINDEX():尋找在一個字符串中某字符串第一次出現的位置

select charindex ( ' k ' , ' skykeysky ' )

運行結果

2

PATINDEX():與charindex()類似,增長對通配符Like的支持,返回一個字符模式的索引

select patindex ( ' %k% ' , ' skykeysky ' )

運行結果

2

LEN()函數:返回一個表明字符串長度的整型值

declare @DATE varchar ( 50 )

set @DATE = ' 2010-01-20 '

select len ( @date )

運行結果

10

LEFT()和RIGHT()函數:返回必定長度的子字符串。LEFT()返回字符串最左邊的字符。

declare @DATE varchar ( 50 )

set @DATE = ' 2010-01-20 '

select LEFT ( @date , 4 )

運行結果

2010

declare @DATE varchar ( 50 )

set @DATE = ' 2010-01-20 '

select RIGHT ( @date , 2 )

運行結果

10

SUBSTRING()函數:從字符串的一個位置開始,返回一個特定長度的子字符串。返回最大可能長度的字符串,而不會將多出的長度以空格填空,索引從1開始

declare @DATE varchar ( 50 )

set @DATE = ' 2010-01-20 '

select substring ( @DATE , 1 , 4 ) + substring ( @DATE , 6 , 2 ) + substring ( @DATE , 9 , 2 )

運行結果

20100120

LOWER()和UPPER()函數:將字符串中全部字符分別轉換爲小寫和大寫。

declare @Name varchar ( 50 )

set @Name = ' keySky '

select UPPER ( @Name )

運行結果

KEYSKY

LTRIM()與RTRIM()函數:返回將字符串的左邊和右邊的空白修剪以後的字符串

REPLACE()函數:把字符串中的某個字符或某個子字符串替換爲另外一個字符或者子字符串。

DECLARE @Mes varchar ( 50 )

set @Mes = ' KeySky is writing a message for a potential challenge '

select replace ( @Mes , ' writing ' , ' receiving ' )

運行結果

KeySky is receiving a message for a potential challenge

REPLICATE()與SPACE()函數:將一些字符重複填充進一個字符串。

DECLARE @Mes varchar ( 50 )

set @Mes = ' KeySky '

select @Mes + replicate ( ' * ' , 10 - len ( @Mes ))

運行結果

KeySky****

REVERSE()函數:將字符串中的字符轉置。

DECLARE @Mes varchar ( 50 )

set @Mes = ' KeySky '

select reverse ( @Mes )

運行結果

ykSyeK

STUFF()函數:將字符串中的一部分替換爲另外一個字符串。

DECLARE @Mes varchar ( 50 )

set @Mes = ' KeySkyKeySky '

select STUFF ( @Mes , 4 , 3 , ' Hello ' )

運行結果

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.聚合與分組

4.1複雜統計函數

STDEV()函數:返回某數字範圍內全部非空值的簡單標準方差。返回的數據類型是FLOAT

select STDEV (UnitPrice) from Products

運行結果

33.8151114580251

STDEVP()函數:返回標準方差

VAR()函數:返回測量最小值或最大值和中點的距離有多遠。

4.2數據分組

4.21 GROUP BY子句

添加到查詢的WHERE和ORDER BY子句以後。查詢先於聚合函數與分組操做執行。這些結果讀進內存後,SQL Server會遍歷這些記錄,並在這些記錄上應用分組和聚合計算。

select id, sum (value), count (id) from tbltest group by id

運行結果

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子句實現分組後過濾行。

select id, sum (value), count (id) from tbltest group by id having count (id) > 1

運行結果

1       60.00        2

4       64.00        2

6       64.00        2

11     113.00      2

4.23 ROLLUP子句

對列表進行小技和總計計算。

select id, sum (value), count (id) from tbltest group by id with rollup having count (id) > 1

運行結果

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子句

select id,val from tbltest compute sum (val)

運行結果

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.多表查詢

5.1子查詢與鏈接

5.11 WHERE子句中的鏈接

SELECT dbo.Products.ProductID, dbo.Products.ProductName, dbo.Products.SupplierID,
dbo.Products.CategoryID, dbo.Products.QuantityPerUnit,

dbo.Products.UnitPrice, dbo.Products.UnitsInStock, dbo.Products.UnitsOnOrder,
dbo.Products.ReorderLevel, dbo.Products.Discontinued, dbo.Categories.CategoryName

FROM dbo.Categories , dbo.Products

WHERE dbo.Categories. CategoryID = dbo.Products.CategoryID

這個查詢實現一個內鏈接,兩個列引用中間的等號表示這個查詢只返回兩個表中有匹配記錄的行。這種鏈接方式成爲同等鏈接,表示在鏈接運算中比較的兩個表中的值必須相等。

5.12 FROM子句中的鏈接

在FROM子句中,經過JOIN語句引用兩個表,後跟ON關鍵字。

SELECT dbo.Products.ProductID, dbo.Products.ProductName, dbo.Products.SupplierID,
dbo.Products.CategoryID, dbo.Products.QuantityPerUnit,

dbo.Products.UnitPrice, dbo.Products.UnitsInStock, dbo.Products.UnitsOnOrder,
dbo.Products.ReorderLevel, dbo.Products.Discontinued,

dbo.Categories.CategoryName

FROM dbo.Categories INNER JOIN

dbo.Products
ON dbo.Categories.CategoryID = dbo.Products.CategoryID

WHERE (dbo.Products.Discontinued = 0 )

官方推薦,在where 與FROM子句鏈接中使用FROM的ANSI標準方法。

5.13 鏈接的類型

內鏈接:只返回兩個表中的相關記錄;外鏈接:先返回同一個表中的全部行,而後返回第二個表中的相關行。

5.14 內鏈接

內鏈接的目的是將一個表中的記錄和另外一個表中的對應記錄進行匹配,前提是兩個表的相關列包含相同的值。例如上面的FROM子句鏈接和WHERE子句鏈接都屬於內鏈接

5.15 外鏈接

外鏈接用於從一個表中返回全部的行,而後匹配相關表中具備相同鏈接列值的行。在外鏈接中,查詢將返回一個表中不匹配的行。

SELECT dbo.Products.ProductID, dbo.Products.ProductName, dbo.Products.SupplierID,
dbo.Products.CategoryID, dbo.Products.QuantityPerUnit,

dbo.Products.UnitPrice, dbo.Products.UnitsInStock, dbo.Products.UnitsOnOrder,
dbo.Products.ReorderLevel, dbo.Products.Discontinued,

dbo.Categories.CategoryName

FROM dbo.Categories LEFT OUTER JOIN

dbo.Products
ON dbo.Categories.CategoryID = dbo.Products.CategoryID

WHERE (dbo.Products.Discontinued = 0 )

這表示返回Categories中的全部行,而後返回相關的Products行

5.16 多列鏈接

在鏈接的基礎上使用AND和OR字符自合來實現多列鏈接

另外還有非同等鏈接以及一些特殊目的的鏈接運算。

5.17 合併查詢

UNION()查詢垂直地擴展結果,將一個記錄堆積到另外一個記錄的頂部。

相關文章
相關標籤/搜索