SQLServer的程序設計_第1頁
SQLServer的程序設計_第2頁
SQLServer的程序設計_第3頁
SQLServer的程序設計_第4頁
SQLServer的程序設計_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第10章 Transact-SQL程序設計教學目標終極目標: 會利用變量、函數(shù)、流程控制語句編寫Transact-SQL程序實現(xiàn)對數(shù)據(jù)庫系統(tǒng)的操作。促成目標:1. 能正確理解和使用變量 2. 能正確理解和使用函數(shù) 3. 能正確理解和使用流程控制語句 相關知識什么是Transact-SQL? 前面我們已經(jīng)學習了有關SQL的知識,SQL是關系型數(shù)據(jù)庫系統(tǒng)的標準語言,標準的SQL語句幾乎可以在所有的關系型數(shù)據(jù)庫上可以不加修改地使用。但標準的SQL不支持流程控制,僅僅是一些簡單的語句,有時候使用起來不方便。為此,大型的關系型數(shù)據(jù)庫系統(tǒng)都在標準的SQL基礎上,結合自身的特點推出了可以編程的、結構化的SQ

2、L編程語言,比如SQL Server2000的Transact-SQL、Oracle9i的PL/SQL。 可能有同學會問了,SQL不是很好用嗎,我們什么時候需要使用Transact-SQL呢? 如果你的工作僅僅是簡單地查詢SQL Server2000數(shù)據(jù)庫的數(shù)據(jù),那么學習SQL也就夠了。對于一些復雜的查詢,SQL就鞭長莫及了,尤其是如果在查詢過程中需要變量、判斷、循環(huán)等控制時就必須使用Transact-SQL。 建立SQL Server2000數(shù)據(jù)庫的目的還是為了開發(fā)各種應用系統(tǒng),要開發(fā)C/S模式的數(shù)據(jù)庫應用系統(tǒng),往往會用到存儲過程、觸發(fā)器、函數(shù)這樣的編程對象,這時就必須使用Transact-

3、SQL。Transact-SQL程序的結構其實我們前面學習的SQL范例都可以稱為是Transact-SQL程序。下面我們通過一個實例來說明一個稍復雜的Transact-SQL。/*Transact-SQL程序的實例*/use schoolgodeclare avgrade int-判斷成績set avgrade=60if(select avg(grade) from sc where cno='c01')>=avgrade-輸出結果select '課程平均成績超過'+convert(varchar(3),avgrade)else-輸出結果select &#

4、39;課程平均成績不超過'+convert(varchar(3),avgrade)-執(zhí)行批處理go由此可見,Transact-SQL程序主要的語法要素如下:ì 變量ì 注釋符ì 運算符ì 函數(shù)ì 流程控制語句ì 批處理10.1 變量 Transact-SQL 中可以使用兩種變量:局部變量和全局變量。 10.1.1局部變量局部變量是用戶可自定義的變量,它的作用范圍僅在程序內(nèi)部。在程序中通常用來儲存從表中查詢到的數(shù)據(jù),或當作程序執(zhí)行過程中暫存變量使用。局部變量必須以 開頭,而且必須先用DECLARE 命令聲明后才可使用。其說明形式

5、如下:DECLARE 變量名 變量類型,變量名變量類型在使用DECLARE命令聲明以后,所有的變量都被賦予初值NULL例:聲明一個變量Declare i char(5)可以在一個declare 語句中聲明多個變量例: declare i int,j int,k int在Transact-SQL 中不能像在一般的程序語言中一樣使用“變量=變量值”來給變量賦值,必須使用SELECT 或SET 命令來設定變量的值。其語法如下:SELECT 變量名= 變量值SET 變量名= 變量值【注意】:SET與SELECT的區(qū)別下表列出SET與SELECT的區(qū)別: setselect同時對多個變量同時賦值不支持支

6、持表達式返回多個值時出錯將返回的最后一個值賦給變量表達式未返回值變量被賦null值變量保持原值下面以具體示例來說明問題: create table chinadba1( userid int , addr varchar(128) ) insert into chinadba1(userid,addr) values(1, 'addr1') insert into chinadba1(userid,addr) values(2, 'addr2') insert into chinadba1(userid,addr) values(3, 'addr3

7、9;) 1.同時對多個變量同時賦值, 使用set賦值 declare addr1 varchar(60),addr2 varchar(60)set addr1='aaa',addr2='bbb' ',' 附近有語法錯誤。 同時對多個變量同時賦值 , 使用select賦值 declare addr1 varchar(60),addr2 varchar(60)select addr1='aaa',addr2='bbb'2.表達式返回多個值時,使用SET賦值 declare addr varchar(128) set a

8、ddr=(select addr from chinadba1) /* -出錯信息為 服務器: 消息 512,級別 16,狀態(tài) 1,行 2 子查詢返回的值多于一個。當子查詢跟隨在 =、!=、 <、 <=、 >、 >= 之后,或子查詢用作表達式時,這種情況是不允許的。 */ 表達式返回多個值時,使用SELECT賦值 declare addr varchar(128) select addr=addr from chinadba1 print addr -結果集中最后一個 addr 列的值 -結果: addr3 3.表達式未返回值時,使用SET賦值 declare addr

9、 varchar(128) set addr='初始值' set addr= (select addr from chinadba1 where userid=4) print addr 表達式未返回值時,使用SELECT賦值 declare addr varchar(128) set addr='初始值' select addr= addr from chinadba1 where userid=4 print addr -保持原值 例:聲明一個長度為 8個字符的變量id,并賦值。 declare id char(8) 或者 declare id char(8

10、) select id =10010001 set id =10010001 declare id char(8) declare id char(8) Select id=sno set id=(select sno From student From student Where sname=張三 Where sname=張三)不能將SELECT語句的賦值功能和查詢功能同時混合使用,否則系統(tǒng)會產(chǎn)生錯誤。Declare i int,j intselect i=max(grade),j=min(grade)From scDeclare i int,j intselect i=max(grade)

11、,j=min(grade),max(grade)-min(grade)from 產(chǎn)品10.1.2全局變量全局變量是SQL Server 系統(tǒng)內(nèi)部使用的變量,其作用范圍并不局限于某一程序,而是任何程序均可隨時調(diào)用。全局變量通常存儲一些SQL Server 的配置設定值和效能統(tǒng)計數(shù)據(jù)。用戶可在程序中用全局變量來測試系統(tǒng)的設定值或Transact-SQL 命令執(zhí)行后的狀態(tài)值。使用全局變量注意:(1) 全局變量不是由用戶的程序定義的,它們是在服務器級定義的(2) 用戶只能使用預先說明及定義的全局變量。(3)引用全局變量時必須以“”開頭。(4)局部變量的名稱不能與全局變量的名稱相同,否則會在應用中出錯。

12、如:CONNECTIONS:返回自SQL SERVER最近一次啟動以來連接或企圖連接到SQL SERVER的連接數(shù)目。ERROR:返回執(zhí)行T-SQL語句的錯誤代碼。在SQL Server執(zhí)行完一條語句后,如果執(zhí)行成功,則返回ERROR的值為0,如果該語句在執(zhí)行過程中發(fā)生錯誤,則將返回錯誤信息,而ERROR將返回相應的錯誤編號,該編號一直保持下去,直到下一條語句得到執(zhí)行為止。IDENTITY:返回最后插入行的標識列的列值.10.2注釋符- -用于單行注釋與C 語言相同的程序注釋符號,即“/*/”,/* 用于注釋文字的開頭,*/用于注釋文字的結尾,可在程序中標識多行文字為注釋。 10.3運算符10

13、.3.1算數(shù)運算符兩個數(shù)相加。這個加法算術運算符也可以將一個以天為單位的數(shù)字加到日期中。A. 使用加法運算符計算客戶總的可訂購量下面的示例將 產(chǎn)品表中當前庫存量和當前已定購的以及再訂購的所有產(chǎn)品的數(shù)量相加。 select 產(chǎn)品名稱, 庫存量+訂購量+再訂購量 總的可訂購量 from 產(chǎn)品B. 使用加法運算符將天數(shù)加到日期和時間值中下面的示例將若干天數(shù)加到 datetime 日期上。 DECLARE startdate datetime, adddays int SET startdate ='2007-3-12' SET adddays = 5 select startdate

14、 startdate,startdate+adddays adddateC. 將字符和整型數(shù)據(jù)類型相加本示例通過將字符數(shù)據(jù)類型轉換為 int,將 int 數(shù)據(jù)類型值與字符值相加。如果在 char 字符串中有無效的字符,則 SQL Server 將返回錯誤。DECLARE addvalue int SET addvalue = 15 SELECT '125127' + addvalue 下面是結果集:125142 10.3.2賦值運算符賦值運算符只有一個,即=(等號),用于為字段或變量賦值。例:下面的語句先定義一個int變量xyz,然后將其值賦為123。 declare xyz

15、int set xyz=12310.3.3位運算符位運算符用于在兩個數(shù)之間執(zhí)行位操作,T-SQL的位運算符如表所示。位運算符的操作數(shù)可以是整型或二進制數(shù)據(jù)類型(binary和varbinary,但不包括image數(shù)據(jù)類型)的任何數(shù)據(jù),并且,兩個操作數(shù)不能同時是二進制數(shù)據(jù)。下表列出了位運算支持的操作數(shù)數(shù)據(jù)類型。位運算支持的操作數(shù)數(shù)據(jù)類型10.3.4比較運算符 比較運算符用于測試兩個表達式是否相等,除了text、ntext或image數(shù)據(jù)類型的表達式外,比較運算符還可用于其他所有類型的表達式。比較運算符運算結果為布爾數(shù)據(jù)(TRUE或FALSE)下表列出了比較運算符及其含義。10.3.5邏輯運算符邏

16、輯運算符用于對某個條件進行測試,和比較運算符一樣,邏輯運算的運算結果為布爾數(shù)據(jù)(TRUE或FALSE)。下表列出了邏輯運算符及其含義。10.3.6字符串串聯(lián)連接符字符串連接運算是指使用加號(+)將兩個字符串連接成一個字符串,加號作為字符串連接符。例:'abc' +'123'結果為'abc123'。10.3.7運算符的優(yōu)先順序 如果一個表達式中使用了多種運算符,則運算符的優(yōu)先順序決定計算的先后次序。計算時,從左向右計算,先計算優(yōu)先級高的運算,再計算優(yōu)先級低的運算。 下面列出了運算符的順序。括號 算術運算符比較運算符按位運算符邏輯運算符賦值運算符10

17、.4 函數(shù)10.4.1數(shù)學函數(shù)數(shù)學函數(shù)通常對作為參數(shù)提供的輸入值執(zhí)行計算,并返回一個數(shù)字值。常用的數(shù)學函數(shù)(1)取近似值函數(shù)CEILING 返回>=表達式的最小整數(shù),返回的數(shù)據(jù)類型與表達式相同.語法: CEILING (numeric表達式) 例:ceiling(123.45) 124ceiling(-123.45) -123ceiling(123) 123FLOOR 返回<=表達式的最大整數(shù),返回的數(shù)據(jù)類型與表達式相同.語法: FLOOR(numeric表達式) floor(123.45) 123 floor(-123.45) -124 floor(123) 123ROUND 返

18、回數(shù)字表達式并四舍五入為指定的長度或精度. 返回與表達式相同的類型。語法:ROUND (numeric表達式 , length , function ) 參數(shù):length是 numeric表達式將要四舍五入的精度。當 length 為正數(shù)時,numeric表達式四舍五入為 length 所指定的小數(shù)位數(shù)。當 length 為負數(shù)時,numeric表達式則按 length 所指定的在小數(shù)點的左邊四舍五入。function是要執(zhí)行的操作類型。function 必須是 tinyint、smallint 或 int。如果省略 function 或 function 的值為 0(默認),numeric

19、表達式 將四舍五入。當指定 0 以外的值時,將截斷 numeric表達式。例:ROUND(748.58,1) 748.60 ROUND(748.58,2) 748.58ROUND(748.58,3) 748.58ROUND(748.58,-1) 750.00 ROUND(748.58,-2) 700.00ROUND(748.58,-3) 1000.00如果 length 是負數(shù)且大于小數(shù)點前的數(shù)字個數(shù),ROUND 將返回 0。例:ROUND(748.58,-4) 0.00ROUND(534.56, 1) -結果為ROUND(534.56, -1) -結果為ROUND(534.56, -2) -

20、結果為ROUND(534.56, -3) -結果為ROUND(534.56, -4) -結果為ROUND(123.9995, 3) -結果為使用 ROUND 截斷 下例使用兩個 SELECT 語句說明四舍五入和截斷之間的區(qū)別。例:ROUND(150.75,1) 150.80ROUND(150.75,1,0) 150.80 -四舍五入結果ROUND(150.75,1,1) 150.70 -截斷結果 (2)取絕對值函數(shù)ABS 返回給定數(shù)字表達式的絕對值。返回與表達式相同的類型。語法:ABS (表達式 ) 例:ABS(-1.0) 1.0ABS(0.0) 0.0ABS(1.0) 1.0(3)隨機函數(shù)R

21、AND 返回 0 到1 之間的隨機float 值。不包括0和1。語法: RAND ( seed ) Seed 是給出種子值整型表達式(tinyint、smallint 或 int)。隨機數(shù)種子是用來打亂隨機數(shù)的,沒有它,你的隨機數(shù)并不真正隨機數(shù).種子與結果的關系是:     對于不同的種子,有不同的隨機數(shù)    對于相同的種子,具有相同的隨機數(shù)產(chǎn)生指定范圍的隨機整數(shù)的公式為:Y = FLOOR(RAND() * (上限 下限 1 ) 下限例如:產(chǎn)生1030之間的隨機整數(shù)(包括10和30)的公式為:Y = FLOOR(RAND() *(30-10+1) 1

22、0(4)其它函數(shù)POWER 返回給定表達式乘指定次方的值。返回類型與 numeric表達式相同。語法: POWER ( numeric表達式 , y ) y 可以是精確數(shù)字或近似數(shù)字數(shù)據(jù)類型類別的表達式(bit 數(shù)據(jù)類型除外)。例:power(2,2) 4power(2,3) 8SQUARE 返回給定表達式的平方。返回float類型。語法: SQUARE ( float表達式) 例:下例返回半徑為 1 英寸、高為 5 英寸的圓柱容積。DECLARE h float, r floatSET h = 5SET r = 1SELECT PI()* SQUARE(r)* h 容積SQRT 返回給定表達

23、式的平方根。語法: SQRT ( float_表達式 ) 例:完成PI返回 PI 的常量值。返回float類型。語法: PI ( ) 10.4.2字符串函數(shù)(1)字符轉換函數(shù)ASCII() ASCII()函數(shù)返回字符表達式最左端字符的ASCII 碼值。語法: ASCII(character_expression ) 在ASCII 函數(shù)中,純數(shù)字的字符串可不用 括起來,但含其它字符的字符串必須用 括起來使用,否則會出錯。例: ASCII(123) 等價于 SELECT ASCII('123') SELECT ASCII(ABC) 會提示 列名 ABC 無效的錯誤例:ASCII(&

24、#39;abc') 97ASCII('ABC') 65CHAR() CHAR()函數(shù)用于將ASCII 碼轉換為字符。語法:CHAR(character_expression)如果沒有輸入0 255 之間的ASCII 碼值,CHAR()函數(shù)會返回一個NULL 值。CHAR(65) ACHAR(97) a注釋:CHAR 可用于將控制字符插入字符串中。下表顯示了一些常用的控制字符。 換行符和回車的區(qū)別? 回車是回到本行最前面, 換行是換到下一行去。一般情況下, 回車換行同時用, 就是到下一行的頭上去.這個東西的說法來自打字機,以前的打字機要新起一行的時候有兩步: 1. 打字的

25、機頭回到開始位置,這就是回車 2. 紙張往上推進一行,這就是換行 現(xiàn)在電腦上的 回車換行 其實已經(jīng)是個整體的概念了例:declare x int, y intset x=4set y=5if x<y print 'X<Y'+char(13)+ '你好'Else if x>y print 'X>y'+char(13)+ '你不好'LOWER() LOWER()函數(shù)把字符串全部轉換為小寫。語法:LOWER(character_expression)例:lower('djjAAAAjdj')UPP

26、ER() UPPER()函數(shù)把字符串全部轉換為大寫。語法:UPPER(character_expression)例:upper('djjAAAAjdj')STR() STR()函數(shù)把數(shù)值型數(shù)據(jù)轉換為字符型數(shù)據(jù)。語法: STR(<float_ expression> ,length, <decimal>)length 指定返回的字符串的長度。是總長度,包括小數(shù)點、符號、數(shù)字或空格。如果沒 有指定長度,默認值為 10。必須是非負值。 指定長度應大于或等于數(shù)字的符號位數(shù)+小數(shù)點前的位數(shù)+小數(shù)點位數(shù)+小數(shù)點后的位數(shù)。decimal 指定返回的小數(shù)位數(shù),即小數(shù)點右

27、邊的位數(shù) ,默認為0,必須是非負值。 小數(shù)位數(shù)大于decimal 值時,STR()函數(shù)將其下一位四舍五入。如果<float _表達式>小數(shù)點前的位數(shù)超過了指定的長度,則返回指定長度的*。-普通的轉換declare i floatset i=12.1245print '看看結果'+str(i) 結果:12declare i floatset i=12.45print '看看結果'+str(i,6,4)結果:12.450-小數(shù)的四舍五入declare i floatset i=12.456789print '看看結果'+str(i,6,4

28、)結果:12.457declare i floatset i=12345.45789print '看看結果'+str(i,3,4)結果:* 小數(shù)點前的位數(shù)有5位,超過的總長度3,*的個數(shù)由總長度3決定(2)去空格函數(shù)LTRIM() LTRIM()函數(shù)把字符串頭部的空格去掉。語法: LTRIM (character_expression )例:select ltrim(' kdjj jjjjj')例:DECLARE string_to_trim varchar(60)SET string_to_trim = ' Hello world!'print

29、 'The beginning:'+LTRIM(string_to_trim)RTRIM() RTRIM()函數(shù)把字符串尾部的空格去掉。語法: RTRIM (character_expression )(3)取子串函數(shù)LEFT() LEFT()函數(shù)返回部分字符串。語法:LEFT(character_expression,integer_expression) LEFT()函數(shù)返回的子串是從字符串最左邊起到第integer_expression 個字符的部分。若integer_expression 為負值,則返回錯誤。例:declare i varchar(100),j ints

30、et i='從查詢或過程中無條件退出后的語句'set j=5print left(i,j)RIGHT()RIGHT()函數(shù)返回部分字符串。語法:RIGHT<character_expression>,<integer_expression>) RIGHT()函數(shù)返回的子串是從字符串右邊第integer_expression 個字符起到最后一個字符的部分。若integer_expression 為負值,則返回錯誤。SUBSTRINGSUBSTRING()函數(shù)返回部分字符串。語法:SUBSTRING (expression ,starting_ positi

31、on, length)SUBSTRING()函數(shù)返回的子串是從字符串左邊第starting_ position 個字符起length個字符的部分。其中表達式可以是字符串或二進制串或含字段名的表達式。SUBSTRING()函數(shù)不能用于TEXT 和IMAGE 數(shù)據(jù)類型。例:select substring('abcdefghijk',2,5) 返回字符串“abcdefghijk”的左邊第2個字符起5個字符的部分(4)字符串比較函數(shù)CHARINDEX()CHARINDEX()函數(shù)返回字符串中某個指定的子串出現(xiàn)的開始位置。返回類型為int.語法:CHARINDEX (<subst

32、ring_expression>,<expression>)其中,substring _expression 是所要查找的字符串表達式。expression 為字符串也可為列名表達式。如果沒有發(fā)現(xiàn)子串,則返回0 值。例:charindex('w','jhhwhhw') 4例:declare i varchar(500),j varchar(10),k intset i='從查詢或過程候用于從過程、批處理或語句塊中退出'set j='中'set k=charindex(j,i)print kprint substr

33、ing(i,k,2)PATINDEX() PATINDEX()函數(shù)返回字符串中某個指定的子串出現(xiàn)的開始位置。語法:PATINDEX (<%substring _expression%>,<expression>) 其中,子串表達式前后必須有百分號“%” ,否則返回值為0。與CHARINDEX()函數(shù)不同的是,PATINDEX()函數(shù)的子串中可以使用通配符,且此函數(shù)可用于CHAR、VARCHAR和TEXT 數(shù)據(jù)類型。例:patindex('w','jhhwhhw') 0patindex('%w%','jhhwhhw&

34、#39;) 4(5)字符串操作函數(shù)QUOTENAME() QUOTENAME()函數(shù)返回被特定字符括起來的字符串。其語法如下:語法:QUOTENAME (<character_expression>,quote_ character) 特定字符可以是單引號,左括號(或右括號),中括號或者雙引號。如果未指定 quote_character,則使用中括號。quotename('abc')quotename('abc','<')quotename('abc','>')quotename('

35、abc','<>')quotename('abc','(')quotename('abc',')')quotename('abc','()')quotename('abc','"')quotename('abc','""')quotename('abc','''') -單引號特殊,出現(xiàn)的時候必須成對出現(xiàn)REPLICATE()

36、 以指定的次數(shù)重復字符表達式 。語法:REPLICATE (character_expression,integer_expression) 如果integer_expression 值為負值,則REPLICATE 函數(shù)返回NULL 串。例:replicate('重復',3)replicate('重復',-3) -結果: NULLREVERSE()REVERSE()函數(shù)將指定的字符串的字符排列順序顛倒。語法:REVERSE (character_expression) 其中,character_expression 可以是字符串常數(shù)或一個列的值。例: rever

37、se('abcdef')REPLACE() REPLACE()函數(shù)返回被替換了指定子串的字符串。其語法如下:語法:REPLACE <string_expression1>,<string_expression2>,<string_expression3>)REPLACE()函數(shù)用string_expression3 替換在string_expression1 中的子串string_expression2。例:replace('acdeicde','cde','xxx') - -用 xxx 替換

38、acdeicde中的字符串 cde。STUFF() STUFF()函數(shù)用另一子串替換字符串指定位置長度的子串。語法:STUFF(<character_表達式1>,<start_position>,<length>,<character_表達式2>) 如果起始位置為負或長度值為負,或者起始位置大于character_expression1 的長度,則STUFF()函數(shù)返回NULL 值。 如果length 長度大于character_表達式1 的長度,則character_表達式1 只保留首字符。 例: STUFF('abcdef',

39、 2, 3, 'ijklmn')-用ijklmn替換第一個字符串 (abcdef) 中從第二個位置(字符 b)開始的三個字符,并返回一個字符串。 start_position是一個整數(shù),指定刪除和插入的開始位置。如果 start_position 或 length 是負數(shù),則返回空字符串。如果 start_position 比第一個 character_表達式長,則返回空字符串。STUFF('abcdef',-2, 3, 'ijklmn') -結果為:NULLSTUFF('abcdef',7, 3, 'ijklmn'

40、;) -結果為:NULLSPACE() SPACE()函數(shù)返回由指定空格組成的字符串。 語法: SPACE (int_表達式) 如果int_表達式的值為負值,則SPACE 函數(shù)返回NULL 串。'abc'+space(2)+'def -結果:abc def'abc'+space(-2)+'def -結果:NULL例: 把整理的姓氏串聯(lián)一個逗號、兩個空格和整理的名字。USE pubsGOSELECT RTRIM(au_lname) + ',' + SPACE(2) + LTRIM(au_fname)FROM authorsLEN()

41、 返回給定字符串表達式的字符(而不是字節(jié))個數(shù),其中不包含尾隨空格。 語法:LEN ( 字符串表達式 )例:len('dccv ')len(' dccv ')len(' dc cv ')10.4 流程控制語句Transact-SQL 語言使用的流程控制命令與常見的程序設計語言類似,主要有以下幾種控制命令。10.5.1BEGINEND語法:BEGIN <程序塊>END BEGINEND關鍵詞對用來將一個SQL語句塊組織在一起,以達到一起執(zhí)行的目的。任何時候當要執(zhí)行一個包含兩條或兩條以上的語句時,就可以使用BEGINEND。 BEGINE

42、ND 用來設定一個程序塊,將在BEGINEND 內(nèi)的所有程序視為一個單元執(zhí)行。 它可以和許多其他的流控制關鍵詞一起使用, BEGINEND 經(jīng)常在條件語句(如IFELSE)中使用。 在BEGINEND 中可嵌套另外的BEGINEND 來定義另一程序塊。10.5.2 IF ELSE語法:IF <條件表達式式> <命令行或程序塊塊>ELSE 條件表達式式 <命令行或程序塊塊>其中:條件表達式用來判別條件是否滿足,接下來根據(jù)條件,或是執(zhí)行IF語句后的語句,或是執(zhí)行ELSE后的語句。如果沒有ELSE語句而且IF條件不成立,SQL Server將跳過IF語句后的代碼段

43、,繼續(xù)執(zhí)行后面的程序<條件表達式>可以是各種表達式的組合,但表達式的值必須是邏輯值“真”或“假”。ELSE 子句是可選的,最簡單的IF 語句沒有ELSE 子句部分。如果不使用程序塊,IF 或ELSE 只能執(zhí)行一條命令。IF ELSE 可以進行嵌套,在Transact-SQL 中最多可嵌套32 級。 例1:從SC數(shù)據(jù)表中求出學號為S1同學的平均成績,如果此平均成績大于或等于60分,則輸出“pass”信息。if (select avg(grade) from sc where sno='95001')>=60 begin print 'pass'

44、end 例2 :聲明兩個int型的變量,變量名分別為X,Y,給變量X和Y分別賦值為4和5,如果X小于Y,則輸出“X<Y”,并且輸出“你好”;如果X大于Y,則輸出“X>Y”,并且輸出“你不好”declare x int, y intset x=4set y=5if x<y begin print 'X<Y' print '你好' endElse if x>y begin print 'X>y' print '你不好' end10.5.3 CASE CASE結構提供比IFELSE結構更多的選擇和判斷

45、的機會。使用CASE表達式可以很方便的實現(xiàn)多重選擇的情況,從而可以避免編寫多重的IFELSE嵌套循環(huán) CASE具有兩種格式:1.簡單CASE表達式將某個表達式與一組簡單表達式進行比較以確定結果.2.CASE搜索表達式計算一組邏輯表達式以確定結果.格式1:CASE <表達式> WHEN <表達式> THEN <表達式> WHEN <表達式> THEN <表達式> ELSE <表達式> END該語句的執(zhí)行過程是:將CASE后面表達式的值與各WHEN子句中的表達式的值進行比較,如果二者相等,則返回THEN后的表達式的值,然后跳出

46、CASE語句,否則返回ELSE子句中的表達式的值。ELSE子句是可選項。當CASE語句中不包含ELSE子句時,如果所有比較失敗時,CASE語句將返回NULL。 例1:從學生表Student中,選取SNO,SEX,如果SEX為“男”則輸出“M”,如果為“女”輸出“F”。SELECT Sno, Ssex, CASE Ssex WHEN '男' THEN 'M' WHEN '女' THEN 'F' ENDFROM Student例2 :使用Northwind的中文數(shù)據(jù)庫,從產(chǎn)品表中選取產(chǎn)品ID,產(chǎn)品名稱,類別ID,如果類別ID為1時,則

47、輸出“飲料”;如果類別ID為2時,則輸出“調(diào)味品”;如果類別ID為3時,則輸出“點心”;如果類別ID為4時,則輸出“日用品”;如果類別ID為5時,則輸出“谷類/麥片”;如果類別ID為6時,則輸出“肉/家禽”;如果類別ID為7時,則輸出“特制品”;如果類別ID為8時,則輸出“ 海鮮”select 產(chǎn)品ID,產(chǎn)品名稱,類別ID,case 類別ID when 1 then '飲料'when 2 then '調(diào)味品'when 3 then '點心'when 4 then '日用品'when 5 then '谷類/麥片'wh

48、en 6 then '肉/家禽'when 7 then '特制品'when 8 then '海鮮'endfrom 產(chǎn)品例3:使用Northwind的中文數(shù)據(jù)庫,從運貨商表中選取運貨商編號,運貨商編號為”1”時,輸出”急速快遞”;運貨商編號為”2”時,輸出”統(tǒng)一包裹”;運貨商編號為”3”時,輸出”聯(lián)邦貨運格式2:CASEWHEN <條件表達式> THEN <表達式>WHEN <條件表達式> THEN <表達式>ELSE <表達式>END該語句的執(zhí)行過程是:首先測試WHEN后的表達式的值,如

49、果其值為真,則返回THEN后面的表達式的值,否則測試下一個WHEN子句中的表達式的值如果所有WHEN子句后的表達式的值都為假,則返回ELSE后的表達式的值。如果在CASE語句中沒有ELSE子句,則CASE表達式返回NULL。 例1:從SC表中查詢所有同學選課成績情況,凡成績?yōu)榭照咻敵觥拔纯肌?、小?0分輸出“不及格”、60分至70分輸出“及格”、70分至90分輸出“良好”、大于或等于90分時輸出“優(yōu)秀”。SELECT SNO,CNO,SCORE,SCORE=CASE WHEN SCORE IS NULL THEN '未考' WHEN SCORE<60 THEN '

50、不及格' WHEN SCORE>=60 AND SCORE<70 THEN '及格' WHEN SCORE>=70 AND SCORE<90 THEN '良好' WHEN SCORE>=90 THEN '優(yōu)秀' ENDFROM SC 例2:使用Northwind的中文數(shù)據(jù)庫,從產(chǎn)品表中選取產(chǎn)品ID,產(chǎn)品名稱,供應商ID,庫存量,如果庫存量大于或等于30時為輸出"安全庫存"如果庫存量大于或等于20并且小于30時輸出"臨危庫存"小于20時輸出"危險庫存"

51、select 產(chǎn)品ID,產(chǎn)品名稱,供應商ID,庫存量,case when 庫存量>=30 then '安全庫存'when 庫存量>=20 and 庫存量<30 then '臨危庫存'when 庫存量<20 then '臨危庫存'end from 產(chǎn)品10.5.4 WHILECONTINUEBREAK其語法如下:WHILE <條件表達式> BEGIN <程序塊> BREAK CONTINUE 程序塊 ENDØ WHILE 命令在設定的條件成立時,會重復執(zhí)行命令行或程序塊。Ø CONTINUE 命令可以讓程序跳過CONTINUE 命令之后的語句,回到WHIL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論