SQL第3章Transact-SQL語言.ppt
第3章 Transact-SQL程序設(shè)計(jì),3.1 SQL 語言簡介 3.2 數(shù)據(jù)類型 3.3 局部變量與全局變量 3.4 運(yùn)算符及優(yōu)先級 3.5 函數(shù) 3.6 簡單的SELECT 語句 3.7 批處理與流程控制語句,返回目錄,2,3.1 SQL 語言簡介,SQL (Structure Query Language) 語言是一種在關(guān)系型數(shù)據(jù)庫中定義、查詢、操縱和控制數(shù)據(jù)的標(biāo)準(zhǔn)語句。 大多數(shù)據(jù)庫廠商都在SQL-92標(biāo)準(zhǔn)的基礎(chǔ)上對SQL又進(jìn)行了一定的擴(kuò)充,產(chǎn)生了事務(wù)化的SQL語言,即Transact SQL語言,簡稱T-SQL語言。,3,語言簡介,SQL 語言是一種面向集合的數(shù)據(jù)庫語言,其主要特點(diǎn)是: 類似于英語,直觀、簡單易學(xué); SQL語言只是提出要“干什么”,“怎么辦”則由DBMS來完成。 SQL語句分為四類:數(shù)據(jù)查詢語句、數(shù)據(jù)操縱語句、數(shù)據(jù)定義語句和數(shù)據(jù)控制語句; SQL語句既可以獨(dú)立,也可以嵌入到另外一種語句中使用的語句,即具有自含型和縮主型兩種特征。自含型特征可以用于所有用戶,縮主型適合于應(yīng)用程序員開發(fā)數(shù)據(jù)庫應(yīng)用程序。,4,語言簡介,數(shù)據(jù)操作語句 select、 insert 、 delete 、 update 數(shù)據(jù)定義語句 create table 、 drop table 、 alter table create view 、 drop view create index 、drop index create procedure 、 alter procedure 、 drop procedure create trigger 、 alter trigger、 drop trigger 數(shù)據(jù)訪問控制 grant 、 revoke 事務(wù)控制語句 begin transaction/commit 、 rollback 、 set transaction 編程語句 declare 、 open 、fetch、 close、execute,5,數(shù)據(jù)庫管理員和應(yīng)用系統(tǒng)開發(fā)人員用SQL語言可以做以下事情: 創(chuàng)建主鍵、外鍵、約束、規(guī)則、觸發(fā)器、事務(wù),用以實(shí)現(xiàn)數(shù)據(jù)完整性; 查詢、更新、刪除數(shù)據(jù)庫中的信息; 對各種數(shù)據(jù)庫對象設(shè)置不同的權(quán)限、實(shí)現(xiàn)數(shù)據(jù)庫的安全性; 進(jìn)行分布式數(shù)據(jù)處理,實(shí)現(xiàn)數(shù)據(jù)庫間的數(shù)據(jù)復(fù)制、傳遞和執(zhí)行分布式查詢; 可以創(chuàng)建批處理、存儲過程、視圖,方便應(yīng)用程序訪問數(shù)據(jù)庫中的數(shù)據(jù); 實(shí)現(xiàn)數(shù)據(jù)倉庫,從聯(lián)機(jī)事務(wù)處理系統(tǒng)中提取數(shù)據(jù),對數(shù)據(jù)匯總進(jìn)行決策支持分析; 其他功能。,本章首頁,6,3.2 數(shù)據(jù)類型,數(shù)據(jù)類型是指數(shù)據(jù)所代表的信息的類型。每一種語言都定義了自己的數(shù)據(jù)類型。 SQL Server 2000中定義了25種數(shù)據(jù)類型,同時(shí)允許用戶自己定義數(shù)據(jù)類型。 系統(tǒng)定義的數(shù)據(jù)類型有: binary(n) 、varbinary(n)、char(n)、varchar(n)、nchar(n)、nvarchar(n)、datetime、smalldatetime、decimalp(,s)、numericp(,s)、float(n)、real、int 、smallint、tinyint 、money、smallymoney、 bit、cursor、sysname、timestamp、uniqueidentifier、 text、image 和ntext;,7,3.2.1 二進(jìn)制數(shù)據(jù)類型 二進(jìn)制數(shù)據(jù)類型包括三種:binary 、varbinary和image。 binary (n):固定長度的n個(gè)字節(jié)二進(jìn)制數(shù)據(jù)。n必須是1到8000。存儲空間大小為n+4字節(jié)。 varbinary(n):n個(gè)字節(jié)可變長二進(jìn)制數(shù)據(jù)。n必須從1到8000。存儲空間大小為實(shí)際數(shù)據(jù)長度+4個(gè)字節(jié),而不是n個(gè)字節(jié)。 image:可變長度的二進(jìn)制,其最大長度為231-1個(gè)字節(jié)。 3.2.2 數(shù)字?jǐn)?shù)據(jù)類型 數(shù)字?jǐn)?shù)據(jù)類型包括精確數(shù)字、近似數(shù)字兩種。精確數(shù)字又分為精確整數(shù)和精確小數(shù)。 1.精確整數(shù) 精確整數(shù)數(shù)據(jù)類型有四種,它們是bigint 、int、smallint、tinyint。 bigint:從-263到263-1的整型數(shù)據(jù)。存儲大小為8個(gè)字節(jié)。 int:從-231到231-1的整型數(shù)據(jù)。存儲大小為4個(gè)字節(jié)。,8,smallint:從-215到215-1的整數(shù)數(shù)據(jù)。存儲大小為2個(gè)字節(jié)。 tinyint:從0到255的整數(shù)數(shù)據(jù)。存儲大小為1個(gè)字節(jié)。 bigint 的存儲范圍大大于int 的存儲范圍,int 的存儲范圍大于Smallint 的存儲范圍,Smallint的存儲范圍大于tinyint的存儲范圍。 2.精確小數(shù) 精確小數(shù)數(shù)據(jù)類型有兩種:它們是decimal和numeric。 decimal :帶定點(diǎn)精度和小數(shù)位數(shù)的numeric數(shù)據(jù)類型,從-1038+1到1038-1。 numeric:功能上等同decimal。 3.近似數(shù)字 近似小數(shù)數(shù)據(jù)類型有兩種:float 和 real 。 float:從-1.79E+308到1.79E+308的浮點(diǎn)精度數(shù)字。 real:從-3.04E+38到3.04E+38的浮點(diǎn)精度數(shù)字。,9,3.2.3 字符數(shù)據(jù)類型 字符數(shù)據(jù)是用一對單引號括起來由字母、數(shù)字、和符號組合而成的數(shù)據(jù),在內(nèi)存中占用一個(gè)字節(jié)。例Nanjing、3.23、&*op都是合法的字符數(shù)據(jù)。字符數(shù)據(jù)類型有char、varchar和text三種。 char:固定長度的非unicode字符數(shù)據(jù),最大長度為8000個(gè)字符; varchar:可變長度的非unicode 字符數(shù)據(jù),最大長度為8000個(gè)字符; text:可變長度的非unicode 字符數(shù)據(jù),最大長度為231-1個(gè)字符; 如果沒有在數(shù)據(jù)定義或變量聲明語句中指定n,則默認(rèn)長度為1。,10,3.2.4 unicode 數(shù)據(jù)類型 對于用單個(gè)字節(jié)編碼每個(gè)字符的數(shù)據(jù)類型,存在的問題就是此數(shù)據(jù)類型只能表示256個(gè)不同的字符。象漢字、日文或韓國文字這樣具有數(shù)千個(gè)字符的字母表就不可能處理了。 unicode標(biāo)準(zhǔn)每個(gè)字符用兩個(gè)字節(jié)來編碼,所以在系統(tǒng)中使用unicode數(shù)據(jù)類型,就可以解決大字母表的字符問題了。 unicode數(shù)據(jù)類型包括nchar、nvarchar和ntext。 nchar:固定長度的unicode 數(shù)據(jù),最大長度為4000個(gè)字符。 nvarchar:可變長度的unicode數(shù)據(jù),其最大長度為4000字符。 ntext:可孌長度的unicoce數(shù)據(jù),其最大長度為230-1個(gè)字符。 當(dāng)列的長度固定不變時(shí),使用nchar數(shù)據(jù)類型;當(dāng)列的長度變化時(shí),使用nvarchar數(shù)據(jù)類型;如果需要存儲的字符數(shù)多于4000個(gè)時(shí),應(yīng)使用ntext數(shù)據(jù)類型存儲。,11,3.2.5 日期和時(shí)間數(shù)據(jù)類型 日期和時(shí)間數(shù)據(jù)類型包括datetime 和smalldatetime兩種數(shù)據(jù)類型。 datetime:存儲從1753年1月1日到9999年12月31日的日期和時(shí)間數(shù)據(jù),每一個(gè)值要求8個(gè)字節(jié),精確到百分之三秒(或3.33毫秒)。 smalldatime:存儲從1900年1月1日到2079年12月31日的日期和時(shí)間數(shù)據(jù),每一個(gè)值要求4個(gè)字節(jié),精確到分鐘。 設(shè)置日期格式的命令如下: set dateformat format |format_var 其中,format | format 是日期的格式。有效參數(shù)包括MDY、DMY、YMD、YDM、MYD、DYM。默認(rèn)格式為MDY。 例3-1 設(shè)置日期格式 set dateformat mdy go declare datevar datetime set datevar =06/03/2006 select datevar,12,3.2.6 貨幣數(shù)據(jù)類型 貨幣數(shù)據(jù)類型表示貨幣數(shù)量,貨幣數(shù)據(jù)類型包括money和smallmoney。 money: 貨幣數(shù)值介于-263與263-1之間,精確到貨幣單位的千分之十,money數(shù)據(jù)類型要求個(gè)存儲字節(jié)。 smallmoney:貨幣數(shù)值介于-214748.3648與+214748.3647之間,精確到貨幣單位的千分之十,smallmoney數(shù)據(jù)類型要求4個(gè)存儲字節(jié)。 3.2.7特殊數(shù)據(jù)類型 在SQL中特殊的數(shù)據(jù)類型有三種:bit、timestamp和uniqueidentifier。 bit:由1和0組成,使用bit數(shù)據(jù)類型可以表示真、假或on、off,不能對bit的列使用索引。 timestamp:以二進(jìn)制格式表示SQL Server活動的先后順序。在數(shù)據(jù)庫范圍內(nèi),timestamp是唯一的,每次更新行時(shí)進(jìn)行更新。 uniqueidentifer:全局唯一標(biāo)識符(GUID),以十六進(jìn)制數(shù)字表示一個(gè)全局惟一的標(biāo)識。,13,3.2.8 用戶自定義數(shù)據(jù)類型 在SQL Server中,用戶可以根據(jù)需要自定義數(shù)據(jù)類型。用戶可以用SQL語言或企業(yè)管理器來自定義數(shù)據(jù)類型。 自定義數(shù)據(jù)類型定義后,與系統(tǒng)數(shù)據(jù)類型一樣使用。 創(chuàng)建自定義數(shù)據(jù)類型的好處: 利用自定義數(shù)據(jù)類型可使不同表不重復(fù)出現(xiàn)的各列數(shù)據(jù)具有相同的特性。 1.創(chuàng)建用戶自定義數(shù)據(jù)類型 ()使用SQL 語句創(chuàng)建 使用系統(tǒng)存儲過程sp_addtype創(chuàng)建,語法如下: sp_addtype type_name ,phystype(length)|(precision,scale),null | not null | identity,14,其中: type_name:是用戶定義的數(shù)據(jù)類型的名字。 Phystype:是用戶自定義數(shù)據(jù)類型所基于的系統(tǒng)數(shù)據(jù)類型,可以包括長度、精度、標(biāo)度。 null | not null | identity :用戶自定義數(shù)據(jù)類型的性質(zhì),分別為允許空值、不允許為空值、具有標(biāo)識列性質(zhì)。如果不指定列的性質(zhì),默認(rèn)為not null 。,15,例3-2 創(chuàng)建兩個(gè)自定義數(shù)據(jù)類型 use jwgl go exec sp_addtype a0 ,varchar(15),null exec sp_addtype postalcode,char(6),not null (2)使用企業(yè)管理器創(chuàng)建自定義數(shù)據(jù)類型 進(jìn)入企業(yè)管理器進(jìn)入JWGL數(shù)據(jù)庫右擊“用戶自定義數(shù)據(jù)類型”點(diǎn)擊“新建用戶自定義數(shù)據(jù)類型” 后出現(xiàn)“用戶自定義數(shù)據(jù)類型”窗口輸入要定義的數(shù)據(jù)名稱,選擇數(shù)據(jù)類型,輸入數(shù)據(jù)長度,確定是否允許為空點(diǎn)擊“確定”。,16,2.查看用戶自定義數(shù)據(jù)類型 可以用系統(tǒng)存儲過程sp_help或企業(yè)管理器來查看用戶定義的數(shù)據(jù)類型的特征。語法格式: exec sp_help 自定義數(shù)據(jù)類型名稱 3.重命名用戶自定義數(shù)據(jù)類型 使用過程sp_rename 可以很方便地重新命名一個(gè)用戶自定義數(shù)據(jù)類型。語法格式: exec sp_rename 舊名稱 , 新名稱 4.刪除用戶定義數(shù)據(jù)類型 使用過程sp_droptype 來刪除一個(gè)已經(jīng)定義且未被使用的用戶自定義數(shù)據(jù)類型。語法格式: exec sp_droptype 自定義數(shù)據(jù)類型名 必須注意不能刪除正在被表或其他數(shù)據(jù)庫使用的用戶自定義數(shù)據(jù)類型。,本章首頁,17,3.3 局部變量與全局變量,從變量的作用范圍來區(qū)分,SQL Server提供兩種形式的變量:局部變量和全局變量。 1. 局部變量 局部變量一般在批處理中被聲明、定義、賦值和引用,批處理結(jié)束后,局部變量就消失了。 利用局部變量還可以保存程序執(zhí)行過程中的中間數(shù)據(jù)值,保存由存儲過程返回的數(shù)據(jù)值等。 (1)局部變量的定義 必須先用DECLARE命令定義后才可以使用。 DECLAER local_variable data_type ,n (2) 局部變量的賦值方法 SET local_variable = expression 或者 SELECT local_variable = expression ,.n ,18,expression:與局部定義的數(shù)據(jù)類型相匹配的表達(dá)式。 賦值前變量默認(rèn)值為 NULL。 (3) 局部變量的顯示 select variable_name 例3-3 定義一個(gè)整型局部變量和一個(gè)可變長字符型局部變量并賦值。 DECLARE local_variable_int int,local_variable_char nvarchar(9) SELECT local_variable_int=40 SET local_variable_char = Welcom to Nanjing SELECT local_variable_int SELECT local_variable_char GO,19,注意: 1) 如果被賦值的長度超過DECLAER語句中聲明的長度,將此值賦值給局部變量時(shí),超過的部分將被截去。如上例,局部變量 local_variable_char定義的長度為9,而給其賦的值是“Welcom to Nanjing”,最后局部變量 local_variable_char的值為“Welcom to”。 2) 也可以用SELECT語句從表中查詢出的結(jié)果給局部變量賦值,但要保證查詢出的值的惟一性,否則不能保證給局部變量賦值的準(zhǔn)確性。 3) 在定義局部變量時(shí)容易發(fā)生數(shù)據(jù)類型不匹配的錯誤。即:使用DECLARE語句定義的局部變量與賦給局部變量的值的數(shù)據(jù)類型不匹配。如果發(fā)生這種情況,SQL Server總是試圖隱式地將被賦的值的數(shù)據(jù)類型轉(zhuǎn)化為局部變量的數(shù)據(jù)類型。,20,2. 全局變量 全局變量在整個(gè)SQL Server系統(tǒng)內(nèi)使用。存儲的通常是一些SQL Server的配置設(shè)定值和統(tǒng)計(jì)數(shù)據(jù)。 在使用全局變量時(shí)應(yīng)該注意以下幾點(diǎn): 全局變量是在服務(wù)器級定義的。 SQL Server提供的全局變量分為兩類: 1) 與SQL Server 連接有關(guān)的全局變量。如:rowcount表示受最近一個(gè)語句影響的行數(shù)。 2) 關(guān)于系統(tǒng)內(nèi)部信息有關(guān)的全局變量。如:version表示SQL Server的版本號。 全局變量反映的是服務(wù)器當(dāng)前的狀態(tài),SQL Server 2000提供了30多個(gè)全局變量,下面介紹幾個(gè)常用的全局變量: connections:返回自上次啟動SQL Server 以來連接或試圖連接的次數(shù)。 rowcount:返回上一條T-SQL語句影響到的數(shù)據(jù)行數(shù)。,21,error:返回上一條T-SQL語句執(zhí)行后的錯誤號。 procid:返回當(dāng)前存儲過程的ID標(biāo)識。 remserver:返回登錄記錄中遠(yuǎn)程服務(wù)器的名字。 spid:返回當(dāng)前服務(wù)器進(jìn)程的ID標(biāo)識。 version:返回當(dāng)前SQLServer服務(wù)器的版本。 3. 局部變量與全局變量的顯示 使用SELECT語句可以顯示局部變量和全局變量。語句形式為: 顯示局部變量:SELECT variable_name 顯示全局變量:SELECT variable_name,本章首頁,22,3.4 運(yùn)算符,3.4.1 算術(shù)運(yùn)算符 算術(shù)運(yùn)算符包括加(+)、減()、乘(*)、除(/)和取模(%)(select 10%4,4%10) 3.4.2 賦值運(yùn)算符 Transact-SQL中只有一個(gè)賦值運(yùn)算符,即等號(=) 3.4.3 位運(yùn)算符 位運(yùn)算符包括按位與(&)、按位或(|)、按位異或()和求反()。 位運(yùn)算符用來對整型數(shù)據(jù)或者二進(jìn)制數(shù)據(jù)(image數(shù)據(jù)類型除外)之間執(zhí)行位操作。要求在位運(yùn)算符左右兩側(cè)的操作數(shù)不能同時(shí)是二進(jìn)制數(shù)據(jù)。 例 select 2,2, 23,2|4,2&4(由同學(xué)自己去思考),23,3.4 運(yùn)算符,3.4.4 比較運(yùn)算符 比較運(yùn)算符包括:等于(=)、大于(>)、大于或等于(>=)、小于(或!=)、不小于(!)。 3.4.5 邏輯運(yùn)算符 邏輯運(yùn)算符包括與(AND)、或(OR)和非(NOT)等運(yùn)算符。 關(guān)系運(yùn)算和邏輯運(yùn)算返回布爾值,值為TRUE或FALSE。這種值不能參于運(yùn)算及輸出. 例 select 5>3 (是錯誤的,由同學(xué)去完成) 3.4.6 字符串連接運(yùn)算符 (+) 字符串運(yùn)算符加號(+)將兩個(gè)以上的字符串(不作任何處理、直接)相聯(lián)。 例如 北京2008 + + 奧運(yùn)會 連接后結(jié)果為 北京2008 奧運(yùn)會,24,3.4.7 運(yùn)算符的優(yōu)先級 () (括號) (按位取反) 正、負(fù)、 乘、除、取模:*、/、%(取模) 加、連接符、減 比較符:=, >, =, NOT (非) AND (與) OR (或) = (賦值),本章首頁,3.4 運(yùn)算符,25,3.5 函數(shù),輸出函數(shù)值要用select 命令 3.5.1 數(shù)學(xué)函數(shù) P52 3.5.2 字符串函數(shù) P53 3.5.3 轉(zhuǎn)換函數(shù) P55 CAST ( expression AS data_type ) CONVERT (data_type(length), expression ,style) 3.5.4 日期和時(shí)間函數(shù) P56 3.5.5 系統(tǒng)函數(shù) P58 3.5.6 集合函數(shù) P58 count()、avg()、max()、min(),本章首頁,26,3.6 簡單的SELECT 語句,select語句是數(shù)據(jù)SQL中最重要的語句,其功能強(qiáng)大,使用靈活。 SELECT語句有豐富的子句,其最簡單的用法是: select from where 列名表可以用 星號(*)、表達(dá)式、列表、變量等,其中 * 表示表中所有的列項(xiàng)。 例1 select au_lname,au_fname,phone,city ,state from authors 例2 select au_lname,au_fname,phone,city ,state from authors where state =CA,本章首頁,27,3.7 批處理和 流程控制語句,通常,服務(wù)器端的程序使用SQL語句來編寫,一般而言,一個(gè)服務(wù)器端的程序是由以下一些成分組成: 批; 注釋; 程序中使用的變量; 改變批中語句的執(zhí)行順序的控制語句; 錯誤和消息的處理。 3.7.1 批和腳本 1.批(batch) 兩個(gè)GO之間的SQL語句作為一個(gè)批處理。在一個(gè)批處理中可以包含一條或多條Transact-SQL語句,成為一個(gè)語句組。這樣的語句組從應(yīng)用程序一次性地發(fā)送到SQL Server服務(wù)器進(jìn)行執(zhí)行。SQL Server服務(wù)器將批處理編譯成一個(gè)可執(zhí)行單元,稱為執(zhí)行計(jì)劃。這樣處理可以節(jié)省系統(tǒng)開銷。,28,使用批時(shí)有如下限制: 1) 并不是所有語句都可以和其他語句在一個(gè)組合成批。下列語句不能組合在同一個(gè)批中: create procedure create rule create defaul create trigger create view 2)規(guī)則和缺省不能在同一個(gè)批中既綁定到列又被使用。 3)CHECK約束不能在同一個(gè)批中既定義又使用。 4)在同一個(gè)批中不能刪除對象又重新它。 5)用SET語句改變的選項(xiàng)在批結(jié)束時(shí)生效。 6)在同一個(gè)批中不能改變一個(gè)表再立即引用其新列。 另外當(dāng)一外含有多個(gè)批的SQL腳本提交執(zhí)行時(shí)發(fā)生錯誤,SQL服務(wù)器顯示出的錯誤行提示是錯誤語句所在批中的行號,而不是該語句在整個(gè)SQL腳本中的行號。 2. 腳本 腳本是一系列順序提交的批。,29,3.7.2 流程控制語句 流程控制語言是Transact - SQL對ANSI-92 SQL標(biāo)準(zhǔn)的擴(kuò)充。它可以控制SQL語句執(zhí)行的順序,在存儲過程、觸發(fā)器和批中很有用。具體包括: IF. . . ELSE 條件執(zhí)行命令; CASE語句 多條件分支選擇語句; GOTO語句 無條件轉(zhuǎn)移語句; BEGIN . . . END 將一組SQL語句作為一個(gè)語句塊; WHILE 循環(huán)執(zhí)行相同的語句; RETURN 無條件返回; PRINT 在屏幕上顯示信息; RAISERROR 將錯誤信息顯示在屏幕上,同時(shí)也可以記錄在NT日志中; WAITFOR 等待語句。,3.7.2 流程控制語句,30,1. RETURN RETURN的作用是無條件退出所在的批、存儲過程和觸發(fā)器。退出時(shí),可以返回狀態(tài)信息。在RETURN語句后面的任何語句不被執(zhí)行。 RETURN語句的語法形式: RETURN integer_expression 其中,integer_expression 是一個(gè)表示過程返回的狀態(tài)值。系統(tǒng)保留0為成功。小于0為有錯誤。,31,2. RAISERROR和PRINT PRINT語句 PRINT語句的作用是在屏幕上顯示用戶信息。PRINT語句的語法形式如下: PRINT string | local_variable | local_variable 其中,string代表一個(gè)不超過255字節(jié)的字符串。local_variable 代表一個(gè)局部變量,該局部變量必須是CHAR或VARCHAR類型。 local_variable代表能被轉(zhuǎn)化為char或varchar 類型的全局變量。 【例3-14】將 GETDATE 函數(shù)的結(jié)果轉(zhuǎn)換為 varchar 數(shù)據(jù)類型,并將其與 PRINT 要返回的文本“本信息打印的時(shí)間是”。 PRINT 本信息打印的時(shí)間是 + RTRIM(CONVERT(varchar(30), GETDATE() + .,32, RAISERROR語句 RAISERROR語句的作用是將錯誤信息顯示在屏幕上,同時(shí)也可以記錄在NT日志中。RAISERROR 語句的語法形式: RAISERROR error_number msg_id | msg_str,SEVERITY, STATE , argument1 , . . . n 其中: error_number:是指錯誤號。 msg_id | msg_str:是指錯誤信息。 SEVERITY:是指錯誤的嚴(yán)重級別。 STATE:是指發(fā)生錯誤時(shí)的狀態(tài)信息。,33,3. CASE 表達(dá)式 在Microsoft SQL Server 2005中CASE語句有三種形式:簡單型CASE語句、搜索型CASE語句、CASE關(guān)系函數(shù)。本書只介紹簡單型CASE語句和搜索型CASE語句。 (1)簡單型CASE語句 簡單型CASE語句的語法形式: CASE expression WHEN expression THEN result ,.n ELSE result END 其中: expression :可以是常量、列名、函數(shù)、算術(shù)運(yùn)算符等。 簡單型CASE語句是根據(jù)表達(dá)式expression 的值與WHEN后面的表達(dá)式逐一比較,如果兩者相等,返回THEN后面的表達(dá)式result的值,否則返回ELSE后面表達(dá)式result的值。,34,【例3-15】將PUBS庫中表titles里的 pub_id號為“0736”和“1839”記錄顯示出來,其余的用“OTHER”顯示。 use pubs go select title,pub_id= case pub_id when 0736 then 0736 when 1389 then 1389 else OTHER end from titles,35,(2)搜索型CASE語句 搜索型CASE語句的語法形式: CASE WHEN Boolean_expression THEN result ,.n ELSE result END 其中: Boolean_expression :CASE語句要判斷的邏輯表達(dá)式。 搜索型CASE語句是判斷邏輯表達(dá)式Boolean_expression為真,則返回THEN后面表達(dá)式result的值,然后判斷下一個(gè)邏輯表達(dá)式,如果所有邏輯表達(dá)式都為假,則返回ELSE后面表達(dá)式result的值。,36,【例3-16】將PUBS庫中表titles里的price大于10的記錄對應(yīng)的price_level顯示“HIGH”,price小于10的記錄對應(yīng)的price_level顯示“LOW”,其余的顯示“EQ10”。 use pubs go select title,price level= case when price > 10 then HIGH when price < 10 then LOW else EQ10 end from titles,37,4. BEGIN. . . END 當(dāng)需要將一個(gè)以上的SQL語句作為一組對待時(shí),可以使用BEGIN和END將它們括起來形成一個(gè)SQL語句塊,以達(dá)到一起執(zhí)行的目的。 BEGIN. . . END語句的語法形式: BEGIN Sql_statement END Sql_statement:是要執(zhí)行的任何合法的SQL語句或語句組,需要用戶加以注意的是它必須包含在一個(gè)單獨(dú)的批中。,38,5. IF. . . ELSE IF. . . ELSE語句的語法形式: IF Boolean_expression Sql_statement ELSE IF Boolean_expression Sql_statement 其中: Boolean_ expression:是布爾表達(dá)式,其值是TRUE或FALSE。 Sql_statement:是要執(zhí)行的SQL語句。這既可以是單個(gè)SQL語句,也可以是一組SQL語句。如果在IF或ELSE語句后面有多條SQL語句,必須把它們放在BEGIN . . . END塊中。,39,【例3-17】定義一個(gè)整形變量,如賦值為1,顯示“I am a student”,否則顯示“I am a teacher”。 declare a int select a=2 if a=1 begin print I am print a student end else print I am a teacher go,40,6. WHILE 結(jié)構(gòu) WHILE語句的作用是為重復(fù)執(zhí)行某一語句或語句塊設(shè)置條件。當(dāng)指定條件為TRUE時(shí),執(zhí)行這些語句,直到為FALSE為止。 WHILE語句的語法形式: WHILE boolean- expression Sql_statement BREAK Sql_statement CONTINUE Sql_statement ,41,其中: boolean- expression:是布爾表達(dá)式,其值是TRUE或FALSE。 Sql_statement:是要執(zhí)行的SQL語句。既可以是單個(gè)SQL語句,也可以是一組SQL語句。如果在WHILE語句后面有多條SQL語句,必須把它們放在BEGIN . . . END塊中。 BREAK:是退出所在的循環(huán)。 CONTINUE:是使循環(huán)跳過CONTINUE之后的語句重新開始。,42,【例3-18】輸出字符串“School” 中每一個(gè)字符的ASCII值和字符。 declare position int,string char(6) set position =1 set string =School while position<=datalength(string) begin select ascii(substring( string,position,1) as asccode, char(ascii(substring( string,position,1) as ascchar set position= position+1 end,43,7. GOTO語句 使用GOTO語句可以使SQL語句的執(zhí)行流程無條件地轉(zhuǎn)移到指定的標(biāo)號位置。GOTO語句和標(biāo)號可以用在語句塊、批處理和存儲過程中,標(biāo)號的命名要符合標(biāo)識符命名規(guī)則。GOTO語句經(jīng)常用在WHILE和IF語句中以跳出循環(huán)或分支處理。 GO語句的語法形式: Label: GOTO label,44,【例3-19】使用IF語句求1到10之間的累加和并輸出結(jié)果 declare sum int,count int select sum=0,count=1 label: select sum=sum+count select count=count+ 1 if count<=10 goto label select sum,count,45,8. WAITFOR語句 使用WAITFOR語句可以在某一個(gè)時(shí)刻或某一個(gè)時(shí)間間隔后執(zhí)行SQL語句或語句組。 WAITFOR語句語法形式: WAITFOR DELAY time|TIME time 其中: DELAY 指定時(shí)間間隔,TIME指定在某一個(gè)時(shí)刻。TIME參數(shù)的數(shù)據(jù)類型為datetime,格式為hh:mm:ss。,46,【例3-20】設(shè)置在9:00進(jìn)行一次查詢操作。 use pubs go begin waitfor time 9:00 select * from titles end,47,【例3-21】設(shè)置在5分鐘后進(jìn)行一次查詢操作。 use pubs go begin waitfor delay 00:05 select * from titles end,48,9.注釋語句 注釋語句是起說明代碼含義,增加腳本的可讀性,是不執(zhí)行的,有兩種用法: (1)/*/ 該方法可以注釋多行。 (2)- -(兩個(gè)減號) 用于一行的注釋。,本章首頁,