




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
ISBN978-7-111-50122-0第7章
T-SQL語言前面第5章、第6章在講解數據庫、表以及表數據操作時,已經介紹了使用命令行方式操作。在命令行方式中,使用是SQLServer2012的T-SQL語句。本章主要介紹T-SQL語句的語法以及常用語句。7.1SQL語言基本概念SQL(StructuredQueryLanguage)即結構化查詢語言,是關系數據庫的標準語言,是一個通用的、功能極強的關系數據庫語言。目前,絕大多數流行的關系型數據庫管理系統(tǒng),如SQLServer、Oracle、Sybase等都采用了SQL語言標準。T-SQL(Transact-SQL)語言是Microsoft公司在SQLServer數據庫管理系統(tǒng)中SQL的實現(xiàn)。7.1.1T-SQL語言簡介T-SQL語言具有以下5個特點。1.高度非過程化T-SQL是一個非過程化的語言。所有的T-SQL語句接受集合作為輸入,返回集合作為輸出。T-SQL的集合特性允許一條T-SQL語句的結果作為另一條T-SQL語句的輸入。2.綜合統(tǒng)一T-SQL可用于所有用戶的數據庫活動模型,包括系統(tǒng)管理員、數據庫管理員、應用程序員、決策支持系統(tǒng)人員及許多其他類型的終端用戶。3.可移植性雖然T-SQL語言是Microsoft公司在SQLServer數據庫管理系統(tǒng)中SQL的實現(xiàn),但T-SQL語言主要部分其它關系數據庫管理系統(tǒng)都支持,只不過是有些細節(jié)不同而已。所以用戶可將使用T-SQL的技能從SQLServer轉到其它關系數據庫管理系統(tǒng)中。4.以同一種語法結構提供兩種使用方式T-SQL語言既是自含式語言,又是嵌入式語言。作為自含式語言,它能夠獨立地使用;作為嵌入式語言,T-SQL語句可以嵌入到其他高級語言(如C、C++、C#、VB等)程序中。而在兩種不同的使用方式下,T-SQL語言的語法結構基本一致。5.簡單易學基本的T-SQL命令非常簡單,語言十分簡捷,非常容易學會。7.1.2T-SQL語言的語法約定既然T-SQL稱為語言,那么它就有語言的語法約定。其實在本書的第5章、第6章,介紹使用命令行方式操作時,就已經介紹了T-SQL語言的一些語法。T-SQL語言參考的語法格式使用的約定以及說明見表7-1。表7-1T-SQL語言參考的語法格式約定約
定用
途字母大寫T-SQL關鍵字斜體
用戶提供的
T-SQL語法的參數粗體
數據庫名、表名、列名、索引名、存儲過程、實用工具、數據類型名以及必須按所顯示的原樣鍵入的文本下劃線(
)
指示當語句中省略了包含帶下劃線的值的子句時應用的默認值豎線(|)
分隔括號或大括號中的語法項。只能選擇其中一項方括號([])
可選語法項。不要鍵入方括號大括號({})
必選語法項。不要鍵入大括號[,...n]
指示前面的項可以重復
n次。每一項由逗號分隔[...n]
指示前面的項可以重復
n次。每一項由空格分隔[;]
可選的
Transact-SQL語句終止符。不要鍵入方括號<標簽>::=
語法塊的名稱。此約定用于對可在語句中的多個位置使用的過長語法段或語法單元進行分組和標記??墒褂玫恼Z法塊的每個位置由尖括號內的標簽指示:<label>7.1.3標識符前面章節(jié)介紹的數據庫名、表名、列名其實就是標識符。按照標識符的使用方式,可以把這些標識符分為常規(guī)標識符和分隔標識符兩種類型。1.常規(guī)標識符常規(guī)標識符是符合標識符的格式規(guī)則的對象名稱。在T-SQL語句中使用常規(guī)標識符時,不用使用分隔符將其分隔開。在SQLServer2012中,T-SQL的常規(guī)標識符必須符合以下格式規(guī)則:(1)第一個字符必須是下列字符之一:1)Unicode標準3.2所定義的字母。Unicode中定義的字母包括拉丁字母a~z和A~Z,以及來自其他語言的字母字符。2)“_”下劃線符號、“@”符號或“#”符號。(2)后續(xù)字符可以包括:1)Unicode標準3.2所定義的字母。2)基本拉丁字符或其他國家/地區(qū)字符中的十進制數字。3)“_”下劃線符號、“@”符號、“$”符號或數字符號。(3)標識符不能是T-SQL保留字。(4)不允許嵌入空格或其他特殊字符。(5)不允許使用增補字符。7.1.3標識符在SQLServer2012中,某些位于標識符開頭位置的符號具有特殊意義。以“@”符號開頭的常規(guī)標識符表示局部變量或參數,并且不能用做任何其他類型的對象的名稱。以“#”符號開頭的標識符表示臨時表或過程。以“##”符號開頭的標識符表示全局臨時對象。2.分隔標識符包含在雙引號("")或方括號([])內的標識符被稱為分隔標識符。符合所有標識符格式規(guī)則的標識符既可以使用分隔符,也可以不使用分隔符。但是,不符合常規(guī)標識符格式規(guī)則的標識符必須使用分隔符。使用雙引號分隔的標識符稱為引用標識符,使用方括號分隔的標識符稱為括號標識符。7.1.4常量和變量T-SQL語言最常用到的就是常量和變量,無論是常量還是變量,都有數據類型。1.數據類型在SQLServer2012中,每個列(字段或屬性)、局部變量、表達式和參數都具有一個相關的數據類型。數據類型是一種屬性,用于指定對象可保存的數據的類型。SQLServer提供了系統(tǒng)數據類型和用戶定義數據類型。系統(tǒng)數據類型就是由SQLServer系統(tǒng)提供的數據類型。第6章已經介紹過了。7.1.4常量和變量用戶定義數據類型是用戶根據自己的需求,定義的一種新的數據類型,但用戶定義數據類型必須建立在系統(tǒng)數據類型之上。在“對象資源管理器”中,展開COLLEGE數據庫,右鍵單擊“可編程性”中“類型”的“用戶定義數據類型”選項,選擇“新建用戶定義數據類型”選項。如圖所示。7.1.4常量和變量單擊“確定”按鈕即新建成功。展開“用戶定義數據類型”選項,可以看到新建的數據類型。如圖所示。使用用戶定義數據類型與使用系統(tǒng)數據類型方法相同。7.1.4常量和變量2.常量常量指在程序運行過程中值不變的量。常量又稱為文字值或標量值,表示一個特定數據值的符號。常量的使用格式取決于它所表示的值的數據類型。根據常量值的不同類型,分為字符串常量、二進制常量、整型常量、實數常量、日期時間常量、貨幣常量、惟一標識常量。(1)字符串常量字符串常量分為ASCII字符串常量和Unicode字符串常量。ASCII字符串常量是用單引號引起來,并由ASCII字符構成的符號串常量??兆址?')用中間沒有任何字符的兩個單引號表示。例如:'Windows''Howareyou!''SQLServer'''Unicode字符串常量的格式與普通字符串相似,但它前面有一個N標識符。N前綴必須是大寫字母。例如:N'Windows'N'Howareyou!'N'SQLServer'N''如果字符串包含一個嵌入的單引號,可以使用兩個單引號表示嵌入的單引號。對于嵌入在雙引號中的字符串則沒有必要這樣做。例如:'Hesay:''Hi!'''N'Hesay:''Hi!'''7.1.4常量和變量(2)二進制常量二進制常量具有前輟0x,并且是十六進制數字字符串,不使用單引號。例如:0x11F0x95AE0x1234ABC5678DEF0x(空二進制常量)(3)bit常量bit常量使用數字0或1表示,并且不括在引號中。如果使用一個大于1的數字,則該數字將轉換為1。例如:01(4)整型常量整型常量以沒有用引號引起來并且不包含小數點的十進制數字字符串來表示。整型常量必須全部為數字,不能包含小數。例如:1009+126482139-2136768(5)實數常量實數常量是包含小數點的十進制數字字符串,分為定點表示和浮點表示。例如:定點表示15.465.0+85698.1354-583462.5429浮點表示316.4E30.12E-2+562E+6-4328E-37.1.4常量和變量(6)日期和時間常量日期和時間常量使用特定格式的字符日期值來表示,并被單引號引起來。SQLServer可以識別多種格式的日期和時間。例如:數字日期格式'2006-05-21''2006/01/21''12.05.2006''05/10/26'字母日期格式'April15,2006''October20,2006'未分隔的字符串日期格式'990710''20061122'時間格式'10:40:34''04:24PM'日期時間格式'2006-05-2110:40:34''2006-04-0508:07:02.520'(7)貨幣常量貨幣常量以前綴為可選的小數點和可選的貨幣符號“$”的數字字符串來表示。例如:$1329.46-$5028(8)惟一標識常量惟一標識(uniqueidentifier)常量是表示全局惟一標識符(GUID)的字符串??梢允褂米址蚨M制字符串格式指定。例如:'7A19DB-8B86-D011-B42D-00C04FC964FF'0xdc19966f868b11d0b42d00c04fc964ff7.1.4常量和變量3.變量變量是指在程序運行過程中值可以改變的量,用于臨時存放數據。變量具有名字及其數據類型兩個屬性,變量名用于標識該變量,數據類型用于確定該變量存放值的格式及允許的運算。SQLServer2012的變量,按照數據庫角度,可以分為數據庫變量和普通變量。普通變量又可以分為局部變量和全局變量。(1)變量名變量名必須是一個合法的標識符。SQLServer2012規(guī)定,變量名必須以ASCII字母、Unicode字母、漢字、下劃線(_)、@或#開頭,后跟一個或多個ASCII字母、Unicode字母、漢字、下劃線(_)、@、$或#,但不能都是下劃線(_)、@、$或#。數據庫名、表名、列名等,都是數據庫變量。如果是普通變量,變量名必須以@開頭,而且長度不能超過128個字符。例如:COLLEGEMark@StudentID@name@i_123@@a@var_#$7.1.4常量和變量(2)數據類型變量的數據類型和常量數據類型的分類一樣。SQLServer2012規(guī)定,普通變量必須先聲明再使用。在SQLServer2012中,使用DECLARE語句聲明變量,同時聲明該變量的數據類型,使用SET或SELECT語句給變量賦值。聲明一個變量后,該變量將被初始化為NULL。使用SET或SELECT語句將一個不是NULL的值賦給聲明的變量。給變量賦值的SET語句返回單值,給變量賦值的SELECT語句可以返回多值。在初始化多個變量時,為每個局部變量使用單獨的SET語句。在分配變量時,建議使用SET語句。變量只能用在表達式中,不能代替對象名或關鍵字?!纠?-1】
聲明變量數據類型并賦值。DECLARE@mint /*聲明變量@m為int型*/DECLARE@namenchar(10) /*聲明變量@name為nchar型*/SET@x=5 /*給變量@x賦整型數值*/SET@name='張子鵬' /*給變量@name賦字符型數值'張子鵬'*/GO7.1.4常量和變量(3)全局變量和局部變量局部變量的作用范圍僅限制在程序的內部,即在其中定義局部變量的批處理、存儲過程或語句塊。局部變量常用來保存臨時數據。普通變量通常都是局部變量。全局變量由SQLServer2012系統(tǒng)內部提供,其作用范圍并不僅僅局限于某一個程序,以系統(tǒng)函數形式使用。用戶不能定義全局變量,只能使用系統(tǒng)提供的預先定義的全局變量,任何程序均可以隨時飲用全局變量。全局變量名前必須加兩個“@”符號。例如:@@version@@spid注意,局部變量名不能與全局變量名重名。7.1.4注釋在第5章講解T-SQL語句時就已經涉及到注釋了。所有的程序設計語言都有注釋。注釋是程序代碼中不執(zhí)行的文本字符串,用于對代碼的說明。SQLServer2012提供了兩種注釋字符:“--”(雙連字符)和“/**/”。“--”為單行注釋,對于多行注釋語句,需要每行都使用?!?**/”可以在程序的任意處注釋,只要包含在“/*”和“*/”之間的都是注釋。7.1.5運算符運算符是一種符號,用來指定要在一個或多個表達式中執(zhí)行的操作。SQLServer2012所使用的運算符類別見表7-2。表7-2SQLServer2012運算符類別運算符類別所包含運算符賦值運算符=(賦值)算術運算符+(加)、-(減)、*(乘)、/(除)、%(取模)、^(冪運算)按位運算符&(位與)、|(位或)、^(位異或)、~(非運算)字符串串聯(lián)運算符+(連接)比較運算符=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、<>(或!=,不等于)、!<(不小于)、!>(不大于)邏輯運算符ALL(所有)、AND(與)、ANY(任意一個)、BETWEEN(兩者之間)、EXISTS(存在)、IN(在范圍內)、LIKE(匹配)、NOT(非)、OR(或)、SOME(任意一個)一元運算符+(正)、-(負)、~(取反)7.1.6函數函數是一個T-SQL語句的集合,每個函數用于完成某種特定的功能。SQLServer2012將函數分為內置系統(tǒng)函數和用戶定義函數。內置函數又稱為系統(tǒng)函數,由SQLServer2012系統(tǒng)提供。其實這些函數都在創(chuàng)建的數據庫中已經存在。用戶可以展開數據庫的“可編程性”的“函數”對象查看。如圖所示。7.1.6函數SQLServer2012內置函數分為4類:標量函數,聚合函數,排名函數和行集函數。1.標量函數標量函數對單一值進行運算,然后返回單一值。只要表達式有效,即可使用標量函數。標量函數使用范圍廣、頻率高,所以又細分為12種類型。見表7-3。表7-3SQLServer2012內置函數類型和說明函數類型說明數學函數指定對數、指數、三角函數等數學運算字符串函數對字符串執(zhí)行替換、截斷、合并等操作日期和時間數據類型函數對日期和時間輸入值執(zhí)行運算,然后返回字符串、數字或日期和時間值系統(tǒng)函數返回SQLServer實例中有關值、對象和設置的信息邏輯函數執(zhí)行邏輯運算。安全函數返回有關用戶和角色的信息系統(tǒng)統(tǒng)計函數返回SQLServer系統(tǒng)統(tǒng)計信息轉換函數支持數據類型強制轉換和轉換。元數據函數返回有關數據庫和數據庫對象的信息游標函數返回有關游標狀態(tài)的信息配置函數返回當前配置的信息文本和圖像函數對文本或圖像輸入值或列執(zhí)行運算,然后返回有關值的信息7.1.6函數(1)數學函數常用的數學函數見表7-4。函數功能描述示例返回值ABS(數值表達式)絕對值函數,返回指定數值表達式的絕對值ABS(-5)5CEILING(數值表達式)最高限度函數,返回大于或等于指定表達式的最小整數CEILING(5.96)6COS(數值表達式)余弦函數,返回指定表達式中以弧度表示的指定角的三角余弦COS(30*3.14/180)0.866158260995449EXP(數值表達式)指數函數,返回指定表達式的以e為基的指數EXP(1)2.71828182845905FLOOR(數值表達式)最低限度函數,返回小于或等于指定表達式的最大整數FLOOR(5.96)5LOG(數值表達式)自然對數函數,返回指定表達式的自然對數值LOG(10)2.30258509299405LOG10(數值表達式)以10為底的常用函數,返回指定表達式的以10為底的常用函數值LOG10(10)1PI()圓周率函數,返回PI的常量值PI()3.14159265358979POWER(數值表達式,冪值)冪函數,返回指定表達式的指定冪的值POWER(5,2)25RADIANS(數值表達式)角度至弧度轉換函數,對于在表達式中輸入的度數值返回弧度值RADIANS(180.0)3.141592653589793100RAND([種子值
])隨機數函數,返回一個介于0到1(不包括0和1)之間的隨機數值RAND(1)0.713591993212924ROUND(數值表達式,長度)圓整函數,返回指定表達式的一個數值,舍入到指定的長度或精度ROUND(456.789,2)456.790SIGN(數值表達式)符號函數,返回表達式的符號:正號(+1)、負號(-1)或零(0)。SIGN(-6)-1SIN(數值表達式)正弦函數,返回指定表達式中以弧度表示的指定角的三角正弦SIN(30*3.14/180)0.49976981392371SQRT(數值表達式)平方根函數,返回指定表達式的平方根SQRT(9)3SQUARE(數值表達式)平方函數,返回指定表達式的平方SQUARE(9)81TAN(數值表達式)正切函數,返回指定表達式中以弧度表示的指定角的三角正切TAN(30*3.14/180)0.5769959560846767.1.6函數(2)字符串函數常用的字符串函數見表7-5。函數功能描述示例返回值ASCII(字符表達式)返回指定字符的ASCII代碼值ASCII('V')86CHAR(整數表達式)返回整數表達式所表示ASCII代碼值對應的字符CHAR('85')'U'CHARINDEX(字符表達式1,字符表達式2[,起始位置
])查找并返回字符表達式1在字符表達式2中出現(xiàn)的起始位置。如果指定起始位置,則從起始位置開始查找CHARINDEX('me','comein')3LEFT(字符表達式,長度)返回字符串左邊指定長度的字符LEFT('world',2)'wo'LEN(字符表達式)返回指定字符表達式的字符個數,不含尾部空格LEN('inaword')9LOWER(字符表達式)小寫字符函數,將指定表達式轉換為小寫字符LOWER('Hello')'hello'LTRIM(字符表達式)刪除字符串起始空格函數,將刪除指定表達式起始的所有空格LTRIM('Howareyou')'Howareyou'REPLACE(字符表達式1,字符表達式2,字符表達式3)用字符表達式3替換字符表達式1中出現(xiàn)的所有字符表達式2REPLACE('abcxabcx','x','m')'abcmabcm'REPLICATE(字符表達式,整數值表達式)字符串重復函數,重復整數值表達式指定的字符串REPLICATE('abc',2)'abcabc'REVERSE(字符表達式)返回字符串表達式的反轉REVERSE('LOVE')'EVOL'RIGHT(字符表達式,長度)返回字符串右邊指定長度的字符RIGHT('world',2)'ld'RTRIM(字符表達式)刪除字符串末尾空格函數,將刪除指定表達式末尾的所有空格RTRIM('Howareyou')'Howareyou'SPACE(整數值表達式)空格字符串函數,返回指定個數的空格'I'+SPACE(1)+'do''Ido'STR(數值表達式
[,總長度[,小數位數]])將數字表達式轉換為字符串STR(1234.5678,6,2)'1234.6'STUFF(字符表達式1,起始位置,長度,字符串表達式2)刪除并替換字符串函數,在字符表達式1的起始位置刪除指定長度字符,并在刪除起始位置插入字符串表達式2STUFF('abcdefg',2,3,'xyz')'axyzefg'SUBSTRING(字符表達式,起始位置,長度)返回指定字符串從左邊起始位置開始的指定長度的字符SUBSTRING('Iamsorry',3,4)'ams'UPPER(字符表達式)大寫字符函數,將指定表達式轉換為大寫字符UPPER('Hello')'HELLO'7.1.6函數(3)日期和時間數據類型函數常用的日期和時間函數見表7-6。函數功能描述示例返回值DAY(日期)返回指定日期的天數,結果為int類型DAY('2020-5-10')10DATEADD(日期部分,數字,日期)返回指定日期的某一部分加上數字指定的數,返回一個新的日期DATEADD(DAY,5,'2013-6-1')'2013-06-0600:00:00.000'DATEDIFF(日期部分,起始日期,終止日期)返回指定的起始日期和終止日期之間的差額DATEDIFF(DAY,GETDATE(),'2015-1-1')732DATENAME(日期部分,日期)返回代表指定日期部分,結果為字符類型DATENAME(WEEKDAY,'2013-12-20''星期五'DATEPART(日期部分,日期)返回表示指定日期的指定日期部分的整數,結果為int類型DATEPART(day,'2013-10-1')1GETDATE()返回當前系統(tǒng)日期和時間GETDATE()'2012-12-3009:51:08.253'MONTH(日期)返回指定日期的月數,結果為int類型MONTH('2020-5-10')5YEAR(日期)返回指定日期的年數,結果為int類型YEAR('2020-5-10')20207.1.6函數表7-6所示的日期和時間函數的“日期部分”參數,可以使用表7-7所示的“日期部分”列中的值,也可以使用相應的縮寫來代替。日期部分縮寫含義yearyy,yyyy年quarterqq,q季度monthmm,m月weekwk,ww周daydd,d日dayofyeardy,y年中的日hourhh小時minutemi,n分secondss,s秒millisecondms微妙7.1.6函數(4)邏輯函數常用的邏輯函數見表7-8。函數功能描述示例返回值CHOOSE()從值列表返回指定索引處的項CHOOSE(2,'I','he','she','we')'he'IIF()根據布爾表達式計算為true還是false,返回其中一個值DECLARE@aint=10,@bint=15SELECTIIF(@a>@b,'TRUE','FALSE')FALSE7.1.6函數(5)轉換函數常用的轉換函數見表7-9。函數功能描述示例返回值CAST()將一種數據類型的表達式顯式轉換為另外一種數據類型的表達式
CONVERT()將一種數據類型的表達式顯式轉換為另外一種數據類型的表達式
HOST_ID()返回工作站標識符HOST_ID()'4756'HOST_NAME()返回工作站名稱HOST_NAME()'HP-PC'USER_NAME()返回指定標識符的數據庫用戶名USER_NAME()'dbo'7.1.6函數一般情況下,SQLServer2012會自動處理某些數據類型的轉換。例如將smallint類型轉換為int類型。這種轉換稱為隱性轉換。但有些數據類型無法由SQLServer2012自動轉換,就必須使用轉換函數做顯示轉換。CAST和CONVERT函數是數據類型轉換函數,功能相同,只是函數語法格式不同。CAST函數語法格式如下:CAST(表達式AS數據類型)CONVERT函數語法格式如下:CONVERT(數據類型,表達式[,樣式])【例7-2】
使用CAST和CONVERT函數進行數據類型轉換。SELECTCONVERT(NCHAR,'10-30-2013',101),CAST(25ASNCHAR)輸出結果是將字符串“10-30-2013”按照101標準(美國標準)轉換為日期時間類型,將整數25轉換為字符串類型。7.1.6函數(6)元函數常用的元函數見表7-10。函數功能描述示例返回值COL_LENGTH(表名,列名)返回列的定義長度,(以字節(jié)為單位)COL_LENGTH('CJ','xh')20DB_ID(
[數據庫名稱
])返回數據庫標識號DB_ID('COLLEGE')7COL_NAME(表ID,列ID)返回列的名稱COL_LENGTH('Mark','Score')4DB_NAME([數據庫名稱標志號
])返回數據庫名稱DB_NAME(5)'ReportServer'OBJECT_NAME(數據庫對象ID)返回數據庫對象名稱OBJECT_NAME(6)ID號對應的表名FILE_NAME(文件ID)返回給定文件標識號的邏輯文件名FILE_NAME(10)
ID號對應的文件名7.1.6函數(7)安全函數常用的安全函數見表7-11。函數功能描述示例返回值CURRENT_USER返回當前用戶名稱CURRENT_USER'dbo'SESSION_USER返回當前數據庫中當前上下文中的用戶名SESSION_USER'dbo'SYSTEM_USER返回當前登錄名SYSTEM_USER'hp-PC\hp'7.1.6函數(8)配置函數常用的配置函數見表7-12。函數功能描述示例返回值@@LANGUAGE返回當前所用語言的名稱@@LANGUAGE'簡體中文'@@SERVERNAME返回運行SQLServer的本地服務器的名稱@@SERVERNAME'HP-PC'@@VERSION返回當前的SQLServer安裝的版本、處理器體系結構、生成日期和操作系統(tǒng)@@VERSION'MicrosoftSQLServer2012R2(RTM)-10.50.1617.0(IntelX86)……'@@SPID返回當前用戶進程的會話
ID@@SPID53@@SERVICENAME返回SQLServer正在其下運行的注冊表項的名稱。若當前實例為默認實例,則@@SERVICENAME返回MSSQLSERVER;若當前實例是命名實例,則該函數返回該實例名。@@SERVICENAMEMSSQLSERVER7.1.6函數(9)系統(tǒng)函數常用的系統(tǒng)函數見表7-13。函數功能描述示例返回值@@ERROR返回執(zhí)行的上一個T-SQL語句的錯誤號。如有沒有錯誤,返回值為0@@ERROR0@@IDENTITY返回最后插入的標識值的系統(tǒng)函數@@IDENTITYNULL@@ROWCOUNT返回受上一語句影響的行數@@ROWCOUNT1HOST_ID()返回工作站標識號HOST_ID()36487.1.6函數(10)系統(tǒng)統(tǒng)計函數常用的系統(tǒng)統(tǒng)計函數見表7-14。函數功能描述示例返回值@@TOTAL_WRITE返回自上次啟動SQLServer以來SQLServer所執(zhí)行的磁盤寫入數@@TOTAL_WRITE137@@TOTAL_READ返回SQLServer自上次啟動后由SQLServer讀取(非緩存讀?。┑拇疟P的數目@@TOTAL_READ3106@@CONNECTIONS返回SQLServer自上次啟動以來嘗試的連接數,無論連接是成功還是失敗@@CONNECTIONS1122@@IO_BUSY返回自從SQLServer最近一次啟動以來,SQLServer已經用于執(zhí)行輸入和輸出操作的時間@@IO_BUSY307.1.6函數(11)游標函數常用的游標函數見表7-15。函數功能描述示例返回值@@CURSOR_ROWS返回連接上打開的上一個游標中的當前限定行的數目@@CURSOR_ROWS12@@FETCH_STATUS返回針對連接當前打開的任何游標發(fā)出的最后一條游標FETCH語句的狀態(tài)@@FETCH_STATUS07.1.6函數2.聚合函數聚合函數與數學函數、字符換函數、日期和時間函數不太一樣,通常都是在表查詢時使用,也就是函數的參數都是表的列名,單獨使用沒有意義。聚合函數對一組值進行運算,但只返回一個匯總值。由于聚合函數通常用在對表的查詢操作中,一些聚合函數的示例不方便舉例,所以只舉幾個示例。常用的聚合函數見表7-16。函數功能描述示例返回值AVG(表達式)返回組中各組的平均值AVG(Scroce)80COUNT(表達式)返回組中列值的項數,忽略空值COUNT(Name)10COUNT(*)返回組中所有行數的項數,包含空值COUNT(*)11MAX(表達式)返回組中最大值MAX(Scroce)98MIN(表達式)返回組中最小值MIN(Scroce)43SUM(表達式)返回組中各組的總和SUM(Scroce)1648CHECKSUM_AGG(表達式)返回組中各值的校驗和
COUNT_BIG(表達式)返回組中的項數。
GROUPING(表達式)指示是否聚合GROUPBY列表中的指定列表達式
GROUPING_ID(表達式)計算分組級別的函數。僅當指定了GROUPBY時,GROUPING_ID才能在SELECT列表、HAVING或ORDERBY子句中使用
STDEV(表達式)返回指定表達式中所有值的標準偏差
STDEVP(表達式)返回指定表達式中所有值的總體標準偏差
VAR(表達式)返回指定表達式中所有值的方差
VARP(表達式)返回指定表達式中所有值的總體方差
7.1.6函數行集函數返回可在SQL語句中像表引用一樣使用的對象。排名函數對分區(qū)中的每一行均返回一個排名值。由于本書篇幅有限,不予介紹。7.1.6函數3.聚合函數SQLServer2012根據函數返回結果又分為確定性函數和非確定性函數。如果對于一組特定的輸入值,函數始終可以返回相同的結果,那么這種函數就是確定性函數。如果同對于一組特定的輸入值,函數的結果可能會不同,那么這種函數就是非確定性函數。SQLServer2012中,所有的配置函數、游標函數、元數據函數、安全函數、系統(tǒng)統(tǒng)計函數等都是非確定性函數。4.用戶自定義函數SQLServer2012不僅提供了大量的系統(tǒng)內置函數,而且允許用戶根據需要創(chuàng)建自定義函數。用戶選擇數據庫中“可編程性”中的“函數”對象,選擇右鍵菜單的“新建”選項,可以創(chuàng)建用戶定義函數,如圖7-5所示。7.1.6函數用戶定義函數是一個已保存T-SQL或公共語言運行時(CLR)例程,該例程可返回一個值。用戶定義函數為標量值函數或表值函數。如果RETURNS子句指定了一種標量數據類型,則函數為標量值函數??梢允褂枚鄺lT-SQL語句定義標量值函數。如果RETURNS子句指定TABLE,則函數為表值函數。根據函數主體的定義方式,表值函數可分為內聯(lián)函數或多語句函數。用戶定義函數使用T-SQL語句CREATEFUNCTION新建,使用ALTERFUNCTION修改,使用DROPFUNCTION刪除。用戶定義函數將在第10章詳細介紹。7.1.6函數5.確定性函數和非確定性函數其實函數如果以輸出結果是否確定,還可以分為確定性函數和非確定性函數。所謂確定性函數是指,只要使用特定的輸入值集并且數據庫具有相同的狀態(tài),那么不管何時調用,確定性函數始終都會返回相同的結果。所謂非確定性函數是指,即使訪問的數據庫的狀態(tài)不變,每次使用特定的輸入值集調用非確定性函數都可能會返回不同的結果。用戶無法影響任何內置函數的確定性。所有聚合和字符串,以及大部分的數學函數等內置函數都是確定性函數。所有配置、游標、元數據、安全和系統(tǒng)統(tǒng)計等函數都是非確定性函數。例如,ABS絕對值函數是確定性函數,CGETDATE函數是非確定性函數。7.1.7表達式通過運算符可以將變量、常量、函數等連接在一起構成表達式。在SQLServer2012中,用戶通過在查詢窗口輸入運行T-SQL語句代碼,實現(xiàn)表達式。如1.賦值表達式T-SQL提供了惟一的賦值運算符“=”。用戶可以使用賦值運算符給變量等賦值,也可以在列標題和定義列值的表達式之間建立關系。【例7-3】聲明變量數據類型并賦值。DECLARE@mINTDECLARE@nNCHAR(10)SET@m=600SELECT@n='Windows'GO7.1.7表達式2.算術運算表達式算術運算符對兩個表達式執(zhí)行數學運算,這兩個表達式可以是數值數據類型類別的一個或多個數據類型,也可以是日期時間型?!纠?-4】
聲明變量數據為整型類型并賦值,進行算術運算。DECLARE@xINTDECLARE@yINTDECLARE@zDATETIMESET@x=4SET@y=SQRT((3*@x+20)/2)SET@z=GETDATE()+@ySELECT@y,@zGO7.1.7表達式3.按位運算表達式按位運算符在兩個表達式之間執(zhí)行位(二進制位)運算。位運算符的操作數可以是整數或二進制字符串數據類型類別中的任何數據類型(image數據類型除外),但兩個操作數不能同時是二進制字符串數據類型類別中的某種數據類型?!纠?-5】
聲明變量為整型類型并賦值,進行位運算。DECLARE@iINTDECLARE@jINTSET@i=231SET@j=54SELECT@i&@j,@i|@j,@i^@jGO運行結果如圖7-6所示。輸出結果是將十進制的數,按照二進制的位運算得出,再以十進制的方式顯示。7.1.7表達式4.字符串串聯(lián)運算表達式字符串串聯(lián)運算符將兩個字符串數據相連接,生成一個新的字符串。【例7-6】
聲明變量為字符串類型并賦值,進行字符串串聯(lián)運算。DECLARE@var1NCHAR(10)DECLARE@var2NCHAR(2)SET@var1='北京'SET@var2='歡迎你'SELECTRTRIM(@var1)+@var2GO運行結果如圖7-7所示。字符串連接結果少了個“你”字,原因是在聲明字符串變量@var2時,該變量只有2個字符的存儲空間。7.1.7表達式5.比較運算表達式比較運算符又稱為關系運算符,用來測試兩個表達式是否相同。SQLServer2012所使用的比較運算符運算規(guī)則,見表7-17。表7-17比較運算符運算規(guī)則運
算
符運算規(guī)則>
如果大于,那么就為TRUE>=如果大于等于,那么就為TRUE<
如果小于,那么就為TRUE<=如果小于等于,那么就為TRUE=如果等于,那么就為TRUE<>
如果不等于,那么就為TRUE!=如果不等于,那么就為TRUE!<如果不小于(相當于>=),那么就為TRUE!>如果不大于(相當于<=),那么就為TRUE7.1.7表達式除了text、ntext或image數據類型的表達式外,比較運算符可以用于所有的表達式,結果是boolean數據類型。它有3個值:TRUE、FALSE和UNKNOWN。返回boolean數據類型的表達式稱為布爾表達式。與其他SQLServer2012數據類型不同,boolean數據類型不能被指定為表列或變量的數據類型,也不能在結果集中返回。可以使用SETANSI_NULLS設置比較運算結果顯示。當SETANSI_NULLS為ON時,帶有一個或兩個NULL表達式的運算符返回UNKNOWN。當SETANSI_NULLS為OFF時,上述規(guī)則同樣適用,但是兩個表達式均為NULL,則等號(=)運算符返回TRUE?!纠?-7】
聲明變量為整型類型并賦值,進行比較運算。SETANSI_NULLSONIF5<6 /*不顯示比較結果,只根據結果選擇執(zhí)行語句*/--如果“5<6”比較結果為TRUE,執(zhí)行SELECT語句SELECT'OK'GO7.1.7表達式6.邏輯運算表達式符邏輯運算符對某些條件進行測試。邏輯運算符和比較運算符一樣,返回帶有TRUE或FALSE值的boolean數據類型。SQLServer2012所使用的邏輯運算符運算規(guī)則,見表7-18。運
算
符運算規(guī)則ALL如果條件的比較都為TRUE,那么就為TRUEAND如果兩個布爾表達式都為TRUE,那么就為TRUEANY如果一組的比較中任何一個為TRUE,那么就為TRUEBETWEEN如果操作數在某個范圍之內,那么就為TRUEEXISTS如果子查詢包含一些行,那么就為TRUEIN如果操作數等于表達式列表中的一個,那么就為TRUELIKE如果操作數與一種模式相匹配,那么就為TRUENOT對任何其他布爾運算符的值取反OR如果兩個布爾表達式中的一個為TRUE,那么就為TRUESOME如果在一組比較中,有些為TRUE,那么就為TRUE7.1.7表達式其中,ALL、ANY、BETWEEN、EXISTS、LIKE、SOME通常用于數據庫查詢?!纠?-8】
聲明變量為整型類型并賦值,進行比較運算。DECLARE@xINTDECLARE@yINTDECLARE@zINTSET@x=5SET@y=10SET@z=15IF(@x>10)OR(@y<=10)AND(@z=15)SELECT'邏輯表達式結果為TRUE'GO7.1.7表達式7.一元運算表達式+(正)和-(負)運算符可以用于numeric數據類型類別中任意數據類型的任意表達式。~(按位取非)運算符只能用于整數數據類型類別中任意數據類型的表達式?!纠?-9】
聲明變量為整型類型并賦值,進行一元運算。DECLARE@mintSET@m=23SELECT~@mGO7.1.7表達式8.運算符優(yōu)先級當一個復雜的表達式有多個運算符時,運算符優(yōu)先級決定運算符的先后順序。SQLServer2012所使用的運算符的優(yōu)先級,見表7-19。優(yōu)
先
級所包含運算符1+(正)、-(負)、~(取反)2*(乘)、/(除)、%(取模)3+(連接)、+(加)、-(減)4=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、<>(或!=,不等于)、!<(不小于)、!>(不大于)5&(位與)、|(位或)、^(位異或)6not(非)7and(與)8all(所有)、any(任意一個)、between(兩者之間)、exists(存在)、in(在范圍內)、like(匹配)、or(或)、some(任意一個)9=(賦值)7.2流程控制語句與所有的計算機編程語言一樣,T-SQL語言也提供了用于編程的代碼的語法結構,可用來進行順序、選擇、循環(huán)等程序設計。在SQLServer2012中提供了一些流程控制語句,也稱為控制流語言,見表7-20??刂普Z句說
明SET順序賦值語句BEGIN…END語句塊IF…ELSE條件選擇語句WHILE條件循環(huán)語句CASE流程控制語句CONTINUE重新開始下一次循環(huán)語句BREAK結束循環(huán)語句RETURN無條件退出語句WAITFOR延遲語句GOTO無條件轉移語句TRY…CATCH異常錯誤處理語句GO程序段落標識7.2.1SET語句SET語句將先前使用DECLARE@local_variable語句創(chuàng)建的局部變量設置為指定值。聲明一個變量后,該變量將被初始化為NULL。使用SET語句將一個不是NULL的值賦給聲明的變量。其語法格式為:SET@local_variable=expression說明:SET語句是順序執(zhí)行的,將一個表達式賦給聲明的變量。表達式的數據類型一定要和變量聲明的數據類型相符。【例7-10】聲明變量數據類型,并用SET語句順序給變量賦值。DECLARE@int_aINTDECLARE@char_chNCHAR(10)SET@int_a=15SET@char_ch='helloworld'GO除了賦值外,T-SQL編程語言還提供了一些SET語句,這些語句可以設置特定信息的當前處理方式。7.2.2BEGIN…END語句在實際的程序設計過程中,IF…ELSE語句中不止包含一條語句,而是一組SQL語句。為了可以一次執(zhí)行一組SQL語句,這時就需要使用BEGIN…END語句將多條語句封閉起來。其語法格式為:BEGIN{sql_statement|statement_block} /*語句塊*/ENDBEGIN…END語句塊允許嵌套。7.2.3IF…ELSE語句IF…ELSE語句對條件表達式進行判斷,如果滿足條件,則在IF及其條件之后執(zhí)行SQL語句,此時條件表達式返回TRUE;可選的ELSE引入另一個SQL語句,當不滿足IF條件時,就執(zhí)行該語句,此時條件表達式返回FALSE。其語法格式為:IFBoolean_expression{sql_statement|statement_block}[ELSE{sql_statement|statement_block}]【例7-11】
聲明變量數據類型并賦值,用IF…ELSE語句進行選擇。DECLARE@dec_xDECIMAL(6,1)SET@dec_x=20.1IF@dec_x>20 /*判斷數值大小*/BEGINSELECT'@dec_x大于20' /*條件為真執(zhí)行*/ENDELSESELECT'@dec_x小于20' /*條件為假執(zhí)行*/GO7.2.3IF…ELSE語句【例7-12】
根據分數劃分等級:小于60分是差,大于等于60分但小于80分是良,大于等于80分是優(yōu)。用IF…ELSE語句選擇。DECLARE@scoreINTSET@score=50IF@score>=60IF@score<80SELECT'良'ELSESELECT'優(yōu)'ELSESELECT'差'GO運行結果如圖7-9所示。當IF…ELSE語句嵌套時,一定要注意IF和ELSE的配對。而且T-SQL語言沒有限定IF…ELSE語句嵌套的層數,但一般嵌套不要超過3層,否則將降低程序的可讀性。7.2.4WHILE、BREAK、CONTINUE語句WHILE語句設置重復執(zhí)行SQL語句或語句塊的條件。只要指定的條件為TRUE,就重復執(zhí)行語句??梢允褂肂REAK和CONTINUE關鍵字在循環(huán)內部控制WHILE循環(huán)中語句的執(zhí)行。BREAK將導致無條件退出WHILE循環(huán),執(zhí)行END(循環(huán)結束標記)后面的任何語句。CONTINUE使WHILE循環(huán)重新開始執(zhí)行,忽略CONTINUE后面的任何語句。其語法格式為:WHILEBoolean_expression /*循環(huán)條件*/{sql_statement|statement_block} /*循環(huán)體語句*/[BREAK] /*無條件退出循環(huán)*/{sql_statement|statement_block} /*循環(huán)體語句*/[CONTINUE] /*重新開始循環(huán)*/{sql_statement|statement_block} /*循環(huán)體語句*/7.2.4WHILE、BREAK、CONTINUE語句【例7-13】
聲明變量數據類型并賦值,用WHILE語句進行判斷,當符合條件時,則重新循環(huán)或退出循環(huán)。DECLARE@iintSET@i=1WHILE@i<=20 /*循環(huán)條件*/BEGINSET@i=@i+1IF@i=10BREAK /*無條件退出循環(huán)*/ELSECONTINUE /*重新循環(huán)*/ENDSELECT@i /*輸出結果*/GOWHILE語句允許嵌套。如果WHILE語句嵌套,則先執(zhí)行最里面的循環(huán),最后執(zhí)行最外邊的循環(huán)。如果在內層循環(huán)中使用了BREAK語句,將無條件退出本層循環(huán)。7.2.5RETURN語句RETURN語句從查詢或過程中無條件退出。RETURN的執(zhí)行是即時且完全的,可在任何時候用于從過程、批處理或語句塊中退出。RETURN之后的語句是不執(zhí)行的。如果用于存儲過程,RETURN不能返回空值。其語法格式為:RETURN[integer_expression]
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 光伏設備生產效率仿真與生產數據采集與分析技術研究考核試卷
- 個性化營銷中的互動式內容策略考核試卷
- 報告編制團隊組建考核試卷
- 城市夜景交通標牌照明美學設計考核試卷
- 光電子器件的柔性制造技術考核試卷
- 衛(wèi)星導航信號傳輸的抗干擾濾波技術考核試卷
- 滬科版高一化學必修一學案:氧化還原反應和離子反應(解析版)
- 集合(七大題型)解析版-2026屆高三數學一輪復習
- 2025至2030年中國電動車租賃行業(yè)市場前景預測及投資戰(zhàn)略研究報告
- 2025至2030年中國復合地板行業(yè)市場全景評估及投資規(guī)劃建議報告
- 《停送電管理辦法》
- 美容行業(yè)的勞務合同范本
- 移動客服崗位試題帶答案
- GB/T 23190-2025雙孢蘑菇
- 扶貧資金管理辦法遼寧
- 高空作業(yè)安全培訓考核試題及答案
- 農貿市場食品安全監(jiān)管與能力提升培訓
- 模具訂單流程管理規(guī)范
- 英語作文初中教學課件
- 干濕垃圾分離培訓
- 2025年全國新高考I卷真題1卷語文+數學+英語試卷(含答案)
評論
0/150
提交評論