版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第5章 T-SQL語言5.1 SQL語言與語言與T-SQL語言語言5.2 常量、變量與數據類型常量、變量與數據類型5.3 運算符與表達式運算符與表達式5.4 流程控制語句流程控制語句5.5 系統內置函數系統內置函數5.6 用戶定義函數用戶定義函數5.1 SQL語言與T-SQL語言b 1什么是什么是SQL語言語言SQL語言的全名是結構化查詢語言(Structured Query Language),是用于數據庫中的標準數據查詢語言,IBM公司最早使用該語言在其開發(fā)的數據庫系統中。1986年10月,美國ANSI對 SQL進行規(guī)范后,以此作為關系數據庫管理系統的標準語言。作為關系數據庫的標準語言,它
2、已被眾多商用數據庫管理系統產品所采用,不過,不同的數據庫管理系統在其實踐過程中都對SQL規(guī)范做了某些改變和擴充。所以,實際上,不同數據庫管理系統之間的SQL語言不能完全通用。例如,微軟公司的MS SQL-Server支持的是T-SQL,而甲骨文公司的Oracle 數據庫所使用的SQL語言則是PL-SQL。b 2什么是什么是T-SQL語言語言T-SQL是SQL語言的一種版本,且只能在微軟MS SQL-Server以及Sybase Adaptive Server系列數據庫上使用。T-SQL是ANSI SQL的擴展加強版語言,除了提供標準的SQL命令之外,T-SQL還對SQL做了許多補充,提供了類似
3、C、BASIC和Pascal的基本功能,如變量說明、流控制語言、功能函數等。b 3T-SQL語言的構成語言的構成在SQL Server數據庫中,T-SQL語言由以下幾部分組成。(1)數據定義語言(DDL)。DDL用于執(zhí)行數據庫的任務,對數據庫以及數據庫中的各種對象進行創(chuàng)建、刪除、修改等操作。如前所述,數據庫對象主要包括表、默認約束、規(guī)則、視圖、觸發(fā)器、存儲過程。DDL包括的主要語句及功能如表5.1所示。語 句功 能說 明CREATE創(chuàng)建數據庫或數據庫對象不同數據庫對象,其CREATE語句的語法形式不同ALTER對數據庫或數據庫對象進行修改不同數據庫對象,其ALTER語句的語法形式不同DROP刪
4、除數據庫或數據庫對象不同數據庫對象,其DROP語句的語法形式不同表5.1 DDL主要語句及功能DDL各語句的語法、使用方法及舉例請參考相關章節(jié)。(2)數據操縱語言(DML)。DML用于操縱數據庫中的各種對象,檢索和修改數據。DML包括的主要語句及功能如表5.2所示。語 句功 能說 明SELECT從表或視圖中檢索數據是使用最頻繁的SQL語句之一INSERT將數據插入到表或視圖中UPDATE修改表或視圖中的數據既可修改表或視圖的一行數據,也可修改一組或全部數據DELETE從表或視圖中刪除數據可根據條件刪除指定的數據表5.2 DML主要語句及功能DML各語句的語法、使用方法及舉例請參考相關章節(jié)。(3
5、)數據控制語言(DCL)。DCL用于安全管理,確定哪些用戶可以查看或修改數據庫中的數據。DCL包括的主要語句及功能如表5.3所示。語 句功 能說 明GRANT授予權限可把語句許可或對象許可的權限授予其他用戶和角色REVOKE收回權限與GRANT的功能相反,但不影響該用戶或角色從其他角色中作為成員繼承許可權限DENY收回權限,并禁止從其他角色繼承許可權限功能與REVOKE相似,不同之處是,除收回權限外,還禁止從其他角色繼承許可權限表5.3 DCL主要語句及功能DCL各語句的語法、使用方法及舉例請參考相關章節(jié)。(4)T-SQL增加的語言元素。這部分不是ANSI SQL所包含的內容,而是微軟為了用戶
6、編程的方便而增加的語言元素。這些語言元素包括變量、運算符、流程控制語句、函數等。這些T-SQL語句都可以在查詢分析器中交互執(zhí)行。本章將介紹這部分增加的語言元素。5.2 常量、變量與數據類型5.2.1 常量常量根據常量值的不同類型,常量分為字符串常量、整型常量、實型常量、日期時間常量、貨幣常量、唯一標識常量。各類常量舉例說明如下。b 1字符串常量字符串常量字符串常量分為ASCII字符串常量和Unicode字符串常量。(1)ASCII字符串常量。ASCII字符串常量是用單引號括起來,由ASCII字符構成的符號串。ASCII字符串常量舉例如下:ChinaHow do you!OBbaar/*如果單引
7、號中的字符串包含引號,可以使用兩個單引號來表示嵌入的單引號。*/5.2.1 常量(2)Unicode 字符串常量。Unicode 字符串常量與ASCII字符串常量相似,但它前面有一個N標識符(N代表 SQL-92標準中的國際語言National Language),N前綴必須為大寫字母。Unicode字符串常量舉例如下:NChina NHow do you!Unicode 數據中的每個字符用兩個字節(jié)存儲,而每個ASCII字符用一個字節(jié)存儲。b 2整型常量整型常量按照不同表示方式,整型常量又分為二進制整型常量、十六進制整型常量和十進制整型常量。十六進制整型常量的表示:前輟 0 x 后跟十六進制數
8、字串。十六進制常量舉例:0 xEBF0 x69048AEFDD010E0 x /*空十六進制常量*/二進制整型常量的表示:即數字 0 或1,并且不使用引號。如果使用一個大于 1 的數字,它將被轉換為1。十進制整型常量即不帶小數點的十進制數,例如,18942+145345234-2147483648b 3實型常量實型常量實型常量有定點表示和浮點表示兩種方式,舉例如下。定點表示:1894.12042.0+145345234.2234-2147483648.10浮點表示:101.5E50.5E-2+123E-3-12E5b 4日期時間常量日期時間常量日期時間常量:用單引號將表示日期時間的字符串括起來
9、構成。SQL Server可以識別如下格式的日期和時間。 字母日期格式,如April 20, 2000;數字日期格式,如4/15/1998,1998-04-15;未分隔的字符串格式,如20001207;以下是時間常量的例子:14:30:2404:24:PM以下是日期時間常量的例子:April 20, 2000 14:30:24b 5money常量常量money常量是以“$”作為前綴的一個整型或實型常量數據。下面是money常量的例子:$12$542023-$45.56+$423456.99b 6uniqueidentifier常量常量uniqueidentifier 常量是用于表示全局唯一標識
10、符(GUID)值的字符串??梢允褂米址蚴M制字符串格式指定。例如,6F9619FF-8A86-D011-B42D-00004FC964FF0 xff19966f868b11d0b42d00c04fc964ff5.2.2 數據類型b 1系統數據類型系統數據類型系統數據類型又稱為基本數據類型。在第3章已詳細地介紹了系統數據類型,此處不再贅述。b 2用戶自定義數據類型用戶自定義數據類型用戶自定義數據類型可看做系統數據類型的別名。在多表操作的情況下,當多個表中的列要存儲相同類型的數據時,往往要確保這些列具有完全相同的數據類型、長度和為空性(數據類型是否允許空值)。用戶自定義數據類型并不是真正的數
11、據類型,它只是提供了一種提高數據庫內部元素和基本數據類型之間一致性的機制。用戶自定義數據類型student_num后,可以重新設計學生成績管理數據庫表XSB、CJB結構中的學號字段,如表5.4、表5.5和表5.6所示。依賴的系統類型值允許的長度為 空 性char6NOT NULL表5.4 自定義類型student_num字 段 名類 型字 段 名類 型學號student_num 學號student_num表5.5 表XSB中學號字段的重新設計 表5.6 表CJB中學號字段的重新設計通過上例可知:要使用用戶自定義類型,首先應定義該類型,然后用這種類型來定義字段或變量。在創(chuàng)建用戶自定義數據類型時首
12、先應考慮如下三個屬性: 數據類型名稱;新數據類型所依據的系統數據類型(又稱為基類型);為空性。如果為空性未明確定義,系統將依據數據庫或連接的ANSI Null 默認設置進行指派。創(chuàng)建用戶自定義數據類型的方法如下。(1)使用對象資源管理器定義。步驟如下。第1步:啟動“SQL Server Management Studio”,在“對象資源管理器”中展開“數據庫PXSCJ可編程性”,右擊“類型”,選擇“新建”選項,再選擇“新建用戶定義數據類型”,彈出“新建用戶定義數據類型”窗口。第2步:在“名稱”文本框中輸入自定義的數據類型名稱,如student_num。在“數據類型”下拉框中選擇自定義數據類型所
13、基于的系統數據類型,如char。在“長度”欄中填寫要定義的數據類型的長度,如6。其他選項使用默認值,如圖5.1所示,單擊“確定”按鈕即可完成創(chuàng)建。圖5.1 “新建用戶定義數據類型屬性”窗口(2)使用命令定義。在SQL Server 2008中,使用CREATE TYPE語句來實現用戶數據類型的定義。語法格式:CREATE TYPE schema_name. type_name FROM base_type ( precision , scale ) NULL | NOT NULL ; 根據上述語法,定義描述學號字段的數據類型的語句如下:CREATE TYPE student_numFROM c
14、har(6) NOT NULL(3)刪除用戶自定義數據類型。在SSMS中刪除用戶自定義數據類型的主要步驟如下:在對象資源管理器中展開數據庫“PXSCJ可編程性類型”,在“用戶定義數據類型”中選擇類型“dbo.student_num”,右擊鼠標,在彈出的快捷菜單中選擇“刪除”菜單項,打開“刪除對象”窗口后單擊“確定”按鈕即可(實際不做操作)。(4)使用命令刪除用戶自定義數據類型。使用命令方式刪除自定義數據類型可以使用DROP TYPE語句。語法格式:DROP TYPE schema_name. type_name ; 例如,刪除前面定義的student_num類型的語句為DROP TYPE st
15、udent_num(5)利用用戶自定義數據類型定義字段。在定義類型后,接著應考慮定義這種類型的字段,同樣可以利用對象資源管理器和T-SQL命令兩種方式實現。讀者可以參照第2章進行定義,不同點只是數據類型為用戶自定義類型,而不是系統類型。例如,在對象資源管理器中對于XSB表學號字段的定義如圖5.2所示。定義 student_num 后, 設計表結構時此 類型可用 圖5.2 使用用戶自定義數據類型定義XSB表利用命令方式定義XSB表結構:CREATE TABLE XSB( 學號 student_num NOT NULL PRIMARY KEY,/*將學號定義為student_num類型*/ 姓名
16、char(8) NOT NULL, 性別bit NULL DEFAULT 1, 出生時間 datetime NULL, 專業(yè) char(12) NULL, 總學分 int NULL, 備注 varchar(500) NULL)b 3用戶自定義表數據類型用戶自定義表數據類型SQL Server 2008還提供了一種新的用戶自定義數據類型,稱為用戶自定義表數據類型(User-defined Table Types)。這種數據類型也由用戶自行定義,可以作為參數提供給語句、存儲過程或者函數。創(chuàng)建自定義表數據類型也使用CREATE TYPE語句,語法格式如下:CREATE TYPE schema_nam
17、e. type_name AS TABLE ( ,.n ) ; 【例例5.1】 創(chuàng)建用戶自定義表數據類型,包含CJB表中的所有列。CREATE TYPE CJB_tabletypeAS TABLE(學號char(6)NOT NULL,課程號char(3)NOT NULL,成績intNOT NULL,PRIMARY KEY(學號, 課程號)5.2.3 變量b 1變量變量變量名必須是一個合法的標識符。(1)標識符。在SQL Server中標識符分為兩類。常規(guī)標識符:以ASCII字母、Unicode字母、下劃線(_)、或#開頭,后續(xù)可跟一個或若干個ASCII字符、Unicode字符、下劃線(_)、美
18、元符號($)、或#,但不能全為下劃線(_)、或#。注意:常規(guī)標識符不能是T-SQL的保留字。常規(guī)標識符中不允許嵌入空格或其他特殊字符。分隔標識符:包含在雙引號()或者方括號( )內的常規(guī)標識符或不符合常規(guī)標識符規(guī)則的標識符。標識符允許的最大長度為128個字符。符合常規(guī)標識符格式規(guī)則的標識符可以分隔,也可以不分隔。對不符合標識符規(guī)則的標識符必須進行分隔。(2)變量的分類。SQL Server中變量可分為兩類。全局變量:全局變量由系統提供且預先聲明,通過在名稱前加兩個“”來區(qū)別于局部變量。T-SQL全局變量作為函數引用。例如,ERROR返回執(zhí)行的上一個T-SQL語句的錯誤號;CONNECTIONS
19、返回自上次啟動SQL Server以來連接或試圖連接的次數。全局變量的意義及使用請參考附錄B。局部變量:局部變量用于保存單個數據值。例如,保存運算的中間結果,作為循環(huán)變量等。當首字母為“”時,表示該標識符為局部變量名;當首字母為“#”時,此標識符為一臨時數據庫對象名,若開頭含一個“#”,表示局部臨時數據庫對象名;若開頭含兩個“#”,表示全局臨時數據庫對象名。b 2局部變量的使用局部變量的使用(1)局部變量的定義與賦值。 局部變量的定義。在批處理或過程中用DECLARE語句聲明局部變量,所有局部變量在聲明后均初始化為NULL。語法格式:DECLARE local_variable data_ty
20、pe = value ,.n說明如下。local_variable:局部變量名,應為常規(guī)標識符。前面的“”表示是局部變量。data_type:數據類型,用于定義局部變量的類型,可為系統類型或自定義類型。=value:為變量賦值,值可以是常量或表達式,但它必須與變量聲明類型匹配。n:表示可定義多個變量,各變量間用逗號隔開。 局部變量的賦值。當聲明局部變量后,可用SET或SELECT語句為其賦值。用SET語句賦值:將DECLARE語句創(chuàng)建的局部變量設置為給定表達式的值。語法格式:SET local_variableexpression【例例5.2】 創(chuàng)建局部變量var1、var2并賦值,然后輸出變
21、量的值。DECLARE var1 char(10) ,var2 char(30)SET var1=中國 /*一個SET語句只能為一個變量賦值*/SET var2=var1+是一個偉大的國家SELECT var1, var2GO執(zhí)行結果如下:【例例5.3】 創(chuàng)建一個名為sex的局部變量,并在SELECT語句中使用該局部變量查找表XSB中所有女同學的學號、姓名。USE PXSCJGO DECLARE sex bitSET sex=0SELECT 學號, 姓名FROM XSBWHERE 性別=sex執(zhí)行結果如下:【例例5.4】 使用查詢?yōu)樽兞抠x值。DECLARE student char(8)SET
22、 student=(SELECT 姓名 FROM XSB WHERE 學號= 081101)SELECT student用SELECT語句賦值:語法格式:SELECT local_variable=expression ,n關于SELECT,需說明以下幾點:lSELECT local_variable 通常用于將單個值返回到變量中。如果expression為列名,則返回多個值,此時將返回的最后一個值賦給變量。l如果SELECT 語句沒有返回行,變量將保留當前值。l如果expression是不返回值的標量子查詢,則將變量設為 NULL。l一個SELECT語句可以初始化多個局部變量?!纠?.5】
23、 使用SELECT語句為局部變量賦值。DECLARE var1 nvarchar(30)SELECT var1 =劉豐SELECT var1 AS NAME執(zhí)行結果如下:【例例5.6】 為局部變量賦空值。DECLARE var1 nvarchar(30)SELECT var1 = 劉豐SELECT var1 =(SELECT 姓名FROM XSBWHERE 學號= 089999)SELECT var1 AS NAME執(zhí)行結果如下:(2)局部游標變量的定義與賦值。 局部游標變量的定義。語法格式:DECLARE cursor_variable_name CURSOR ,.ncursor_varia
24、ble_name是局部游標變量名,應為常規(guī)標識符。前面的“”表示是局部的。CURSOR表示該變量是游標變量。 局部游標變量的賦值。利用SET語句為一個游標變量賦值,有三種情況:將一個已存在的并且賦值的游標變量的值賦給另一個局部游標變量。將一個已聲明的游標名賦給指定的局部游標變量。聲明一個游標,同時將其賦給指定的局部游標變量。上述三種情況的語法描述如下。語法格式:SET cursor_variable = cursor_variable /*將一個已賦值的游標變量的值賦給一個目標游標變量*/ | cursor_name /*將一個已聲明的游標名賦給游標變量*/ | CURSOR 子句 /*游標聲
25、明*/ 游標變量的使用步驟如下。定義游標變量給游標變量賦值打開游標利用游標讀取行(記錄)使用結束后關閉游標刪除游標的引用?!纠?.7】 使用游標變量。USE PXSCJGODECLARE CursorVar CURSOR /*定義游標變量*/SET CursorVar = CURSOR SCROLL DYNAMIC /*為游標變量賦值*/FORSELECT 學號, 姓名FROM XSBWHERE 姓名 LIKE 王%OPEN CursorVar /*打開游標*/FETCH NEXT FROM CursorVarFETCH NEXT FROM CursorVar /*通過游標讀行記錄*/CLO
26、SE CursorVarDEALLOCATE CursorVar /*刪除對游標的引用*/(3)表數據類型變量的定義與賦值。語法格式:DECLARE table_variable_name AS TABLE ( | ,. ) 【例例5.8】 聲明一個表數據類型變量并向變量中插入數據。DECLARE var_table AS TABLE(num char(6) NOT NULL PRIMARY KEY,name char(8) NOT NULL,sex bit NULL)/*聲明變量*/INSERT INTO var_table SELECT 學號,姓名,性別 FROM XSB/*插入數據*/S
27、ELECT * FROM var_table/*查看內容*/5.3 運算符與表達式b 1算術運算符算術運算符算術運算符在兩個表達式上執(zhí)行數學運算,這兩個表達式可以是任何數字數據類型 。b算術運算符有+(加)、-(減)、*(乘)、/(除)和%(求模)5種運算。+(加)和-(減)運算符還可用于對日期時間類型的值進行算術運算。b 2位運算符位運算符位運算符在兩個表達式之間執(zhí)行位操作,這兩個表達式的類型可為整型或與整型兼容的數據類型(如字符型等,但不能為image類型)。位運算符如表5.7所示。 運 算 符運 算 規(guī) 則&兩個位均為1時,結果為1,否則為0|只要一個位為1,則結果為1,否則為0
28、兩個位值不同時,結果為1,否則為0表5.7 位運算符【例例5.9】 在master數據庫中,建立表bitop,并插入一行,然后將a字段和 b字段列上值進行按位與運算。USE masterGOCREATE TABLE bitop( a int NOT NULL,b int NOT NULL)INSERT bitop VALUES (168, 73)SELECT a & b, a | b, a bFROM bitopGO執(zhí)行結果如下:說明:a(168)的二進制表示為0000 0000 1010 1000;b(73)的二進制表示為 0000 0000 0100 1001。在這兩個值之間進行的
29、位運算如下。(a &b): 0000 0000 1010 1000 0000 0000 0100 1001 0000 0000 0000 1000(十進制值為8)(a | b): 0000 0000 1010 1000 0000 0000 0100 1001 0000 0000 1110 1001(十進制值為233)(a b): 0000 0000 1010 1000 0000 0000 0100 1001 0000 0000 1110 0001(十進制值為225)b 3比較運算符比較運算符比較運算符(又稱關系運算符)如表5.8所示,用于測試兩個表達式的值是否相同,其運算結果為邏輯值,
30、可以為TRUE、FALSE 及 UNKNOWN三者之一。運 算 符含 義運 算 符含 義=相等大于、!=不等于小于!=大于等于!不大于表5.8 比較運算符除text、ntext或image類型的數據外,比較運算符可以用于所有的表達式,下面的例子用于查詢指定學號的學生在XSB表中的信息,其中,IF語句為條件判斷語句,將在5.4節(jié)介紹。USE PXSCJGODECLARE student char(10)SET student = 081101IF (student 0)SELECT *FROM XSBWHERE 學號= student執(zhí)行結果如下:b4邏輯運算符邏輯運算符邏輯運算符用于對某個條件
31、進行測試,運算結果為TRUE或FALSE。SQL Server提供的邏輯運算符如表5.9所示。這里的邏輯運算符在SELECT語句的WHERE子句中使用過,此處再做一些補充。運 算 符運 算 規(guī) 則AND如果兩個操作數值都為TRUE,則運算結果為 TRUEOR如果兩個操作數中有一個為TRUE,則運算結果為TRUENOT若一個操作數值為TRUE,則運算結果為FALSE,否則為TRUEALL如果每個操作數值都為TRUE,則運算結果為TRUEANY在一系列操作數中只要有一個為 TRUE,則運算結果為TRUEBETWEEN如果操作數在指定的范圍內,則運算結果為TRUEEXISTS如果子查詢包含一些行,則
32、運算結果為TRUEIN如果操作數值等于表達式列表中的一個,則運算結果為TRUELIKE如果操作數與一種模式相匹配,則運算結果為TRUESOME如果在一系列操作數中,有些值為TRUE,則運算結果為TRUE表5.9 邏輯運算符(1)ANY、SOME、ALL、IN的使用??梢詫LL或ANY關鍵字與比較運算符組合進行子查詢。SOME的用法與ANY相同。以 比較運算符為例:lALL表示大于每一個值,即大于最大值。例如,ALL(5, 2, 3)表示大于5。因此,使用ALL的子查詢也可用MAX集函數實現。lANY表示至少大于一個值,即大于最小值。例如,ANY (7, 2, 3)表示大于2。因此,使用ANY
33、的子查詢也可用MIN集函數實現。l=ANY運算符與IN等效。lALL與NOT IN等效?!纠?.10】 查詢成績高于“林一帆”最高成績的學生姓名、課程名及成績。USE PXSCJGOSELECT 姓名, 課程名, 成績FROM XSB, CJB, KCBWHERE 成績 ALL( SELECT b.成績FROM XSB a, CJB bWHERE a.學號= b.學號 AND a.姓名= 林一帆)AND XSB.學號=CJB.學號AND KCB.課程號=CJB.課程號AND 姓名林一帆(2)BETWEEN的使用。語法格式:test_expression NOT BETWEEN begin_e
34、xpression AND end_expression如果test_expression的值大于或等于begin_expression的值并且小于或等于 end_expression的值,則運算結果為TRUE,否則為FALSE。test_expression為測試表達式,begin_expression和end_expression指定測試范圍,三個表達式的類型必須相同。NOT關鍵字表示對謂詞BETWEEN的運算結果取反?!纠?.11】 查詢總學分在 4050之間的學生學號和姓名。SELECT 學號, 姓名, 總學分FROM XSBWHERE 總學分 BETWEEN 40 AND 50使用
35、 = 和 = 40 AND 總學分, =, =, , !=, !, !b。若表達式的結果是由不同類型數據組成的一行值,則這種表達式叫做行表達式。例如,(學號,王林,計算機,50*10);當學號列的值為081101時,這個行表達式的值就為(081101,王 林,計算機,500)。若表達式的結果為0個、1個或多個行表達式的集合,那么這個表達式就叫做表表達式。表達式一般用在SELECT以及SELECT語句的WHERE子句中。5.4 流程控制語句在設計程序時,常常需要利用各種流程控制語句,改變計算機的執(zhí)行流程以滿足程序設計的需要。在SQL Server中提供了如表5.11所示的流程控制語句???制 語
36、 句說 明控 制 語 句說 明BEGINEND語句塊CONTINUE用于重新開始下一次循環(huán)IFELSE條件語句BREAK用于退出最內層的循環(huán)CASE分支語句RETURN無條件返回GOTO無條件轉移語句WAITFOR為語句的執(zhí)行設置延遲WHILE循環(huán)語句表5.11 SQL Server流程控制語句【例例5.16】 以下程序用于查詢總學分大于42的學生人數。USE PXSCJGODECLARE num intSELECT num=(SELECT COUNT(姓名) FROM XSB WHERE 總學分42)IF num0SELECT num AS 總學分42的人數5.4.1 BEGINEND語句塊
37、在T-SQL中可以定義BEGINEND語句塊。當要執(zhí)行多條T-SQL語句時,就需要使用BEGINEND將這些語句定義成一個語句塊,作為一組語句來執(zhí)行。語法格式如下:BEGIN sql_statement | statement_block END 關鍵字BEGIN是T-SQL語句塊的起始位置,END標識同一個T-SQL語句塊的結尾。sql_statement是語句塊中的T-SQL語句。BEGINEND可以嵌套使用,statement_block表示使用BEGINEND定義的另一個語句塊。例如,USE PXSCJGOBEGINSELECT * FROM XSBSELECT * FROM KCBE
38、ND5.4.2 條件語句在程序中如果要對給定的條件進行判定,當條件為真或假時分別執(zhí)行不同的 T-SQL 語句,可用IFELSE語句實現。語法格式:IF Boolean_expression /*條件表達式*/ sql_statement | statement_block /*條件表達式為真時執(zhí)行*/ ELSE sql_statement | statement_block /*條件表達式為假時執(zhí)行*/由上述語法格式可看出,條件語句分帶ELSE部分和不帶ELSE部分兩種使用形式。(1)帶ELSE部分:IF 條件表達式A /* T-SQL語句或語句塊*/ELSEB /*T-SQL語句或語句塊*/
39、當條件表達式的值為真時執(zhí)行A,然后執(zhí)行IF語句的下一語句;條件表達式的值為假時執(zhí)行B,然后執(zhí)行IF語句的下一語句。(2)不帶ELSE部分:IF 條件表達式A /*T-SQL語句或語句塊*/當條件表達式的值為真時執(zhí)行A,然后執(zhí)行IF語句的下一條語句;當條件表達式的值為假時直接執(zhí)行IF語句的下一條語句。IF語句的執(zhí)行流程如圖5.3所示。圖5.3 IF語句的執(zhí)行流程【例例5.17】 如果“計算機基礎”課程的平均成績高于75分,則顯示“平均成績高于75分”。IF( SELECT AVG(成績) FROM XSB, CJB, KCBWHERE XSB.學號= CJB.學號 AND CJB.課程號=KCB
40、.課程號AND KCB.課程名=計算機基礎 ) 75SELECT 平均成績低于75ELSESELECT 平均成績高于75【例例5.18】 IFELSE語句的嵌套使用。IF( SELECT AVG(成績) FROM XSB, CJB, KCBWHERE XSB.學號= CJB.學號 AND CJB.課程號=KCB.課程號AND KCB.課程名=計算機基礎 ) 75SELECT 平均成績高于755.4.3 CASE語句CASE語句在4.2.1小節(jié)介紹選擇列的時候已經涉及過。這里介紹CASE語句在流程控制中的用法,與之前略有不同。語法格式:CASE input_expression WHEN whe
41、n_expression THEN result_expression .n ELSE else_result_expression END 或者CASE WHEN Boolean_expression THEN result_expression .n ELSE else_result_expression END第一種格式中input_expression是要判斷的值或表達式,接下來是一系列的WHEN-THEN塊,每一塊的when_expression參數指定要與input_expression比較的值,如果為真,就執(zhí)行result_expression中的T-SQL語句。如果前面的每一塊
42、都不匹配,就會執(zhí)行ELSE塊指定的語句。CASE語句最后以END關鍵字結束。第二種格式中CASE關鍵字后面沒有參數,在WHEN-THEN塊中,Boolean_expression指定了一個比較表達式,表達式為真時執(zhí)行THEN后面的語句。與第一種格式相比,這種格式能夠實現更為復雜的條件判斷,使用起來更方便?!纠?.19】 使用第一種格式的CASE語句,根據性別值輸出“男”或“女”。SELECT 學號, 姓名, 專業(yè), SEX= CASE 性別WHEN 1 THEN 男WHEN 0 THEN 女ELSE 無ENDFROM XSBWHERE 總學分48若使用第二種格式的CASE語句則可以使用以下T
43、-SQL語句。SELECT 學號, 姓名, 專業(yè), SEX= CASE WHEN 性別=1 THEN 男WHEN 性別=0 THEN 女ELSE 無ENDFROM XSBWHERE 總學分485.4.4 無條件轉移語句無條件轉移語句將執(zhí)行流程轉移到標號指定的位置。語法格式:GOTO labellabel是指向的語句標號,標號必須符合標識符規(guī)則。標號的定義形式為label : 語句5.4.5 循環(huán)語句b 1WHILE循環(huán)語句循環(huán)語句如果需要重復執(zhí)行程序中的一部分語句,則可使用WHILE循環(huán)語句實現。語法格式:WHILE Boolean_expression /*條件表達式*/ sql_state
44、ment | statement_block /*T-SQL語句序列構成的循環(huán)體*/WHILE語句的執(zhí)行流程如圖5.4所示。圖5.4 WHILE語句的執(zhí)行流程從WHILE循環(huán)的執(zhí)行流程可看出其使用形式:WHILE 條件表達式循環(huán)體 /*T-SQL語句或語句塊*/ 【例例5.20】 將學號為081101的學生的總學分使用循環(huán)修改到60,每次只加2,并判斷循環(huán)了多少次。USE PXSCJGODECLARE num INTSET num=0WHILE (SELECT 總學分 FROM XSB WHERE 學號=081101)60BEGINUPDATE XSB SET 總學分=總學分+2 WHERE
45、學號= 081101SET num=num+1ENDSELECT num AS 循環(huán)次數執(zhí)行結果如下:b 2BREAK語句語句語法格式:BREAKBREAK語句一般用在循環(huán)語句中,用于退出本層循環(huán)。當程序中有多層循環(huán)嵌套時,使用BREAK語句只能退出其所在的這一層循環(huán)。b 3CONTINUE語句語句語法格式:CONTINUECONTINUE語句一般用在循環(huán)語句中,用于結束本次循環(huán),重新轉到下一次循環(huán)條件的判斷。5.4.6 返回語句用于從存儲過程、批處理或語句塊中無條件退出,不執(zhí)行位于RETURN之后的語句。語法格式:RETURN integer_expression 如果不提供integer_
46、expression,則退出程序并返回一個空值;如果用在存儲過程中,則可以返回整型值integer_expression?!纠?.21】 判斷是否存在學號為081128的學生,如果存在則返回,不存在則插入081128號學生的信息。IF EXISTS(SELECT * FROM XSB WHERE 學號=081128)RETURNELSEINSERT INTO XSB VALUES(081128, 張可, 1, 1990-08-12, 計算機,52, NULL)5.4.7 等待語句等待語句指定觸發(fā)語句塊、存儲過程或事務執(zhí)行的時刻或需等待的時間間隔。語法格式:WAITFOR DELAY time
47、_to_pass | TIME time_to_execute 【例例5.22】 如下語句設定在早上8點執(zhí)行查詢語句。BEGINWAITFOR TIME 8:00SELECT * FROM XSBEND5.4.8 錯誤處理語句在SQL Server 2008中,可以使用TRYCATCH語句進行T-SQL語言中的錯誤處理。語法格式:BEGIN TRY sql_statement | statement_block END TRYBEGIN CATCH sql_statement | statement_block END CATCH ; 5.5 系統內置函數5.5.1 系統內置函數介紹系統內置函
48、數介紹b 1行集函數行集函數行集函數是返回值為對象的函數,該對象可在T-SQL語句中作為表引用。所有行集函數都是非確定性的,即每次用一組特定參數調用它們時,所返回的結果不總是相同的。SQL Server 2008主要提供了如下行集函數:(1)CONTAINSTABLE:對于基于字符類型的列,按照一定的搜索條件進行精確或模糊匹配,然后返回一個表,該表可能為空。(2)FREETEXTTABLE:為基于字符類型的列返回一個表,其中的值符合指定文本的含義,但不符合確切的表達方式。(3)OPENDATASOURCE:提供與數據源的連接。(4)OPENQUERY:在指定數據源上執(zhí)行查詢??梢栽诓樵兊?FR
49、OM 子句中像引用基本表一樣引用OPENQUERY函數,雖然查詢可能返回多個記錄,但 OPENQUERY 只返回第一個記錄。(5)OPENROWSET:包含訪問OLE DB數據源中遠程數據所需的全部連接信息。可在查詢的FROM子句中像引用基本表一樣引用OPENROWSET函數,雖然查詢可能返回多個記錄,但OPENROWSET只返回第一個記錄。(6)OPENXML函數:通過XML文檔提供行集視圖。5.5.1 系統內置函數介紹b 2聚合函數聚合函數聚合函數對一組值操作,返回單一的匯總值。聚合函數在以下情況下,允許作為表達式使用:(1)SELECT語句的選擇列表(子查詢或外部查詢)。(2)COMPU
50、TE或COMPUTE BY子句。(3)HAVING子句。T-SQL語言提供的常用聚合函數的應用請參考第4章相關內容。b 3標量函數標量函數標量函數的特點:輸入參數的類型為基本類型,返回值也為基本類型。SQL Server包含如下幾類標量函數:(1)配置函數;(2)系統函數;(3)系統統計函數;(4)數學函數;(5)字符串函數;(6)日期和時間函數;(7)游標函數;(8)文本和圖像函數;(9)元數據函數;(10)安全函數。5.5.2 常用系統標量函數b 1配置函數配置函數配置函數用于返回當前配置選項設置的信息。全局變量是以函數形式使用的,配置函數一般都是全局變量名,詳細介紹請參見附錄B。b 2數
51、學函數數學函數數學函數可對SQL Server提供的數字數據(decimal、integer、float、real、money、smallmoney、smallint 和 tinyint)進行數學運算并返回運算結果。在默認情況下,對float數據類型數據的內置運算的精度為6個小數位。下面給出幾個例子說明數學函數的使用,其他的數學函數請參考附錄B。(1)ABS函數。語法格式:ABS(numeric_expression) 返回給定數字表達式的絕對值。參數numeric_expression為數字型表達式(bit數據類型除外),返回值類型與numeric_expression相同。【例例5.23】
52、 顯示ABS 函數對三個不同數字的效果。SELECT ABS(-5.0), ABS(0.0), ABS(8.0)運行結果如下:(2)RAND函數。語法格式:RAND ( seed ) 返回01之間的一個隨機值。參數seed是指定種子值的整型表達式,返回值類型為float。如果未指定seed,則隨機分配種子值。對于指定的種子值,返回的結果始終相同?!纠?.24】 以下程序通過RAND函數返回隨機值。DECLARE count intSET count = 5SELECT RAND(count) b 3字符串處理函數字符串處理函數字符串函數用于對字符串進行處理。在此介紹一些常用的字符串處理函數,
53、其他的字符串處理函數請參考附錄B。(1)ASCII函數。語法格式:ASCII ( character_expression ) 返回字符表達式最左端字符的ASCII值。參數character_expression的類型為字符型的表達式,返回值為整型?!纠?.25】 查找字符串sql最左端字符的ASCII值。SELECT ASCII(sql)執(zhí)行結果如下:(2)CHAR函數。語法格式:CHAR ( integer_expression ) 將ASCII碼轉換為字符。integer_expression為介于0255之間的整數,返回值為字符型。(3)LEFT函數。語法格式:LEFT ( char
54、acter_expression , integer_expression ) 返回從字符串左邊開始指定個數的字符。參數character_expression為字符型表達式,integer_expression為整型表達式,返回值為varchar型?!纠?.26】 返回課程名最左邊的4個字符。SELECT LEFT(課程名, 4) FROM KCBORDER BY 課程號(4)LTRIM函數。語法格式:LTRIM ( character_expression )刪除character_expression字符串中的前導空格,并返回字符串。【例例5.27】 使用LTRIM字符刪除字符變量中的
55、起始空格。DECLARE string varchar(40)SET string = 中國,一個古老而偉大的國家 SELECT LTRIM(string)SELECT string(5)REPLACE函數。語法格式:REPLACE ( string_expression1 , string_expression2 , string_expression3 )用第三個字符串表達式替換第一個字符串表達式中包含的第二個字符串表達式,并返回替換后的表達式。參數string_expression1、string_expression2和string_expression3均為字符串表達式。返回值為字符
56、型。(6)SUBSTRING函數。語法格式:SUBSTRING ( expression , start , length ) 返回expression中指定的部分數據。參數expression可為字符串、二進制串、text、image字段或表達式;start、length均為整型,前者指定子串的開始位置,后者指定子串的長度(要返回字節(jié)數)。如果expression是字符類型和二進制類型,則返回值類型與expression的類型相同。其他情況參考表5.12。給定的表達式返回值類型給定的表達式返回值類型給定的表達式返回值類型textvarcharimagevarbinaryntextnvarch
57、ar表5.12 SUBSTRING函數返回值不同于給定表達式的情況【例例5.28】 如下程序在一列中返回XSB表中的姓氏,在另一列中返回表中學生姓名。SELECT SUBSTRING(姓名, 1,1), SUBSTRING(姓名, 2, LEN(姓名)-1)FROM XSBORDER BY 姓名【例例5.29】 顯示字符串China中每個字符的ASCII值和字符。DECLARE position int, string char(8)SET position = 1SET string=ChinaWHILE position =50/*使用 CONVERT實現*/SELECT 姓名, 總學分F
58、ROM XSBWHERE CONVERT(char(20), 總學分) LIKE 5_ AND總學分=50(2)COALESCE函數。語法格式:COALESCE ( expression ,.n ) 返回參數表中第一個非空表達式的值,如果所有自變量均為NULL,則COALESCE返回NULL值。參數expression可為任何類型的表達式。n表示可以指定多個表達式。所有表達式必須是相同類型的,或者可以隱性轉換為相同的類型。COALESCE(expression1,.n) 與如下形式的CASE 語句等價:CASE WHEN (expression1 IS NOT NULL) THEN expre
59、ssion1 . WHEN (expressioN IS NOT NULL) THEN expressionN ELSE NULL(3)ISNUMBRIC函數。ISNUMBRIC函數用于判斷一個表達式是否為數值類型。語法格式:ISNUMBRIC(expression)b 5日期時間函數日期時間函數日期時間函數可用在SELECT語句的選擇列表或查詢的WHERE子句中。在附錄B中列出了大多數的日期時間函數。(1)GETDATE函數。語法格式:GETDATE ()按SQL Server標準內部格式返回當前系統日期和時間。返回值類型為datetime。(2)YEAR、MONTH、DAY函數。這三個函數
60、分別返回指定日期的年、月、天部分,返回值都為整數。語法格式:YEAR(date)MONTH(date)DAY(date)b 6游標函數游標函數游標函數用于返回有關游標的信息。主要的游標函數如下。(1)CURSOR_ROWS函數。語法格式:CURSOR_ROWS返回最后打開的游標中當前存在的滿足條件的行數。返回值為0表示游標未打開;為-1表示游標為動態(tài)游標;為-m表示游標被異步填充,返回值(-m)是鍵集中當前的行數;為n表示游標已完全填充,返回值(n)是游標中的總行數。【例例5.31】 聲明一個游標,并用SELECT顯示CURSOR_ROWS 的值。USE PXSCJGOSELECT CURSOR_ROWSDECLA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024美容院客戶投訴處理協議
- 2024年銷售代表就業(yè)協議書3篇
- 二零二五年度現代簡約餐廳裝飾裝修與品牌推廣合同3篇
- 2025年度大米種植與收購金融服務合同3篇
- 2025年度道路施工安全防護及交通疏導協議3篇
- 2024年運輸合同之貨物運輸路線與時間保障
- 2025年度智能調光窗簾系統項目合同書3篇
- 2025年度臨時運輸司機績效考核及獎勵合同4篇
- 2024衣柜墻板吊頂裝修工程款項支付與結算合同
- 2025年度二零二五廠區(qū)生態(tài)修復與綠化養(yǎng)護綜合服務合同3篇
- 2025年中國高純生鐵行業(yè)政策、市場規(guī)模及投資前景研究報告(智研咨詢發(fā)布)
- 湖北省黃石市陽新縣2024-2025學年八年級上學期數學期末考試題 含答案
- 2022-2024年浙江中考英語試題匯編:完形填空(學生版)
- 2025年廣東省廣州市荔灣區(qū)各街道辦事處招聘90人歷年高頻重點提升(共500題)附帶答案詳解
- 中試部培訓資料
- 硝化棉是天然纖維素硝化棉制造行業(yè)分析報告
- 央視網2025亞冬會營銷方案
- 北師大版數學三年級下冊豎式計算題100道
- 計算機網絡技術全套教學課件
- 屋頂分布式光伏發(fā)電項目施工重點難點分析及應對措施
- 胃鏡下超聲穿刺護理配合
評論
0/150
提交評論