1、第第5 5章章 T-SQLT-SQL语言语言T-SQL语言T-SQL语言T-SQL语言由以下几部分组成。(1)数据定义语言(DDL)。DDL用于执行数据库的任务,对数据库以及数据库中的各种对象进行创建、删除、修改等操作。如前所述,数据库对象主要包括表、默认约束、规则、视图、触发器、存储过程。DDL包括的主要语句及功能如表5.1所示。语句功能说明CREATE创建数据库或数据库对象不同数据库对象,其CREATE语句的语法形式不同ALTER对数据库或数据库对象进行修改不同数据库对象,其ALTER语句的语法形式不同DROP删除数据库或数据库对象不同数据库对象,其DROP语句的语法形式不同T-SQL语言
2、(2)数据操纵语言(DML)。DML用于操纵数据库中的各种对象,检索和修改数据。DML包括的主要语句及功能如表5.2所示。语句功能说明SELECT从表或视图中检索数据是使用最频繁的SQL语句之一INSERT将数据插入到表或视图中UPDATE修改表或视图中的数据既可修改表或视图的一行数据,也可修改一组或全部数据DELETE从表或视图中删除数据可根据条件删除指定的数据T-SQL语言(3)数据控制语言(DCL)。DCL用于安全管理,确定哪些用户可以查看或修改数据库中的数据。DCL包括的主要语句及功能如表5.3所示。语句功能说明GRANT授予权限可把语句许可或对象许可的权限授予其他用户和角色REVOK
3、E收回权限与GRANT的功能相反,但不影响该用户或角色从其他角色中作为成员继承许可权限DENY收回权限,并禁止从其他角色继承许可权限功能与REVOKE相似,不同之处:除收回权限外,还禁止从其他角色继承许可权限(4)T-SQL增加的语言元素。这部分不是ANSISQL所包含的内容,而是微软为了用户编程的方便而增加的语言元素。这些语言元素包括变量、运算符、流程控制语句、函数等。这些T-SQL语句都可以在查询分析器中交互执行。本章会介绍这部分增加的语言元素。第第5 5章章 T-SQLT-SQL语言语言常量、自定义数据类型与变量01常 量1字符串常量2整型常量3实型常量4日期时间常量5货币(money)
4、常量6唯一标识(uniqueidentifier)常量1字符串常量字符串常量分为ASCII字符串常量和Unicode字符串常量。(1)ASCII字符串常量。ASCII字符串常量是用单引号括起来,由ASCII字符构成的符号串。ASCII字符串常量举例:ChinaHowdoyou!OBbaar/*如果单引号中的字符串包含引号,可以使用两个单引号来表示嵌入的单引号。*/(2)Unicode字符串常量。Unicode字符串常量与ASCII字符串常量相似,但它前面有一个N标识符(N代表SQL-92标准中的国际语言NationalLanguage),N前缀必须为大写字母。Unicode字符串常量举例:NC
5、hinaNHowdoyou!Unicode数据中的每个字符用两个字节存储,而每个ASCII字符用一个字节存储。2整型常量十六进制整型常量的表示:前辍0 x后跟十六进制数字串。十六进制常量举例:0 xEBF0 x69048AEFDD010E0 x/*空十六进制常量*/二进制整型常量的表示:即数字0或1,并且不使用引号。如果使用一个大于1的数字,它将被转换为1。十进制整型常量即不带小数点的十进制数,例如:18942+145345234-21474836483实型常量实型常量有定点表示和浮点表示两种方式,举例如下。定点表示:1894.12042.0+145345234.2234-2147483648
6、.10浮点表示:101.5E50.5E-2+123E-3-12E54日期时间常量日期时间常量:用单引号将表示日期时间的字符串括起来。SQLServer可以识别如下格式的日期和时间。字母日期格式,例如:April20,2000数字日期格式,例如:4/15/1998,1998-04-15未分隔的字符串格式,例如:20001207如下是时间常量的例子:14:30:2404:24:PM如下是日期时间常量的例子:April20,200014:30:245货币(money)常量money常量是以“$”作为前缀的一个整型或实型常量数据。下面是money常量的例子:$12$542023-$45.56+$423
7、456.996唯一标识(uniqueidentifier)常量uniqueidentifier常量是用于表示全局唯一标识符(GUID)值的字符串,可以使用字符串或十六进制字符串格式指定。例如:6F9619FF-8A86-D011-B42D-00004FC964FF0 xff19966f868b11d0b42d00c04fc964ff02自定义数据类型1用户自定义数据类型2数据类型的定义3数据类型的使用4数据类型的删除5用户自定义表数据类型1用户自定义数据类型用户自定义数据类型可看作系统数据类型的别名。在多表操作的情况下,当多个表中的列要存储相同类型的数据时,往往要确保这些列具有完全相同的数据类
8、型、长度和为空性(数据类型是否允许空值)。用户自定义数据类型并不是真正的数据类型,它只是提供了一种提高数据库内部元素和基本数据类型之间一致性的机制。例如,对于学生成绩管理数据库(xscj),创建了xsb、kcb、cjb3张表。从表结构中可看出:表xsb中的学号字段值与表cjb中的学号字段值应有相同的类型,均为字符型值,长度可定义为6,并且不允许为空值。为了确保这一点,可以先定义一个数据类型,命名为STUDENT_num,用于描述学号字段的这些属性,然后将表xsb中的学号字段和表cjb中的学号字段定义为STUDENT_num数据类型。2数据类型的定义创建用户自定义数据类型的方法如下。(1)使用界
9、面方式定义在“对象资源管理器”中展开“数据库”“xscj”“可编程性”“类型”“用户定义数据类型”,单击鼠标右键,在快捷菜单中选择“新建用户定义数据类型”,系统进入新建用户定义数据类型窗口。在“名称”文本框中输入自定义的数据类型名称,如STUDENT_num;在“数据类型”下拉框中选择自定义数据类型所基于的系统数据类型,如char;在“长度”栏中填写要定义的数据类型的长度,如6。其他选项使用默认值,单击“确定”按钮即可完成创建。如果允许自定义数据类型为空,则在“允许NULL值”复选框中打勾。2数据类型的定义(2)使用命令定义在SQLServer中,使用CREATETYPE语句来实现用户数据类型
10、的定义。语法格式如下:CREATETYPE架构名.类型名FROM基类型(精度,位数)NULL|NOTNULL根据上述语法,定义描述学号字段的数据类型的语句如下:CREATETYPESTUDENT_numFROMchar(6)NOTNULL3数据类型的使用在用户定义类型后,就可在“对象资源管理器”和T-SQL命令方式中应用这种用户自定义类型了。(1)在“对象资源管理器”中应用举例例如,对xsb表学号字段的定义如图5.1所示。3数据类型的使用(2)T-SQL应用举例利用命令方式定义xsb表结构:CREATETABLExsb(学号STUDENT_numNOTNULLPRIMARYKEY,/*将学号定
11、义为STUDENT_num类型*/姓名char(8)NOTNULL,性别bitNULLDEFAULT1,出生时间datetimeNULL,专业char(12)NULL,总学分intNULL,备注varchar(500)NULL)4数据类型的删除删除用户自定义数据类型的方法如下。(1)使用“对象资源管理器”删除。在SSMS中删除,主要操作如下:在“对象资源管理器”中展开数据库“xscj”“可编程性”“类型”,在“用户定义数据类型”中选择类型“dbo.STUDENT_num”,右键单击鼠标,在弹出的快捷菜单中选择“删除”菜单项,打开“删除对象”窗口后单击“确定”按钮即可(实际不做操作)。(2)使用
12、命令删除。使用命令方式删除自定义数据类型可以使用DROPTYPE语句。语法格式如下:DROPTYPE架构名.类型名例如,删除前面定义的STUDENT_num类型的语句为:DROPTYPESTUDENT_num以上语句实际不做操作。5用户自定义表数据类型用户自定义表数据类型(User-definedTableTypes)也由用户自行定义,可以作为参数提供给语句、存储过程或者函数。创建自定义表数据类型也使用CREATETYPE语句,语法格式如下:CREATETYPE架构名.类型名ASTABLE(,.)【例5.1】创建用户自定义表数据类型,包含cjb表中的所有列。CREATETYPEcjb_tabl
13、etypeASTABLE(学号char(6)NOTNULL,课程号char(3)NOTNULL,成绩intNOTNULL,PRIMARYKEY(学号,课程号)用户自定义表数据类型的删除与自定义数据类型类似,可以在“对象资源管理器”中使用界面方式删除,也可以使用DROPTYPE语句删除。03变量:DECLARE/SET/SELECT1变量及其分类2局部变量3局部游标变量4表数据类型变量1变量及其分类(1)标识符常规标识符:以ASCII字母、Unicode字母、下画线(_)、或#开头,后续可跟一个或若干个ASCII字符、Unicode字符、下画线(_)、美元符号($)、或#,但不能全为下画线(_)
14、、或#。分隔标识符:包含在双引号()或者方括号()内的常规标识符或不符合常规标识符规则的标识符。标识符允许的最大长度为128个字符。符合常规标识符格式规则的标识符可以分隔,也可以不分隔。对不符合标识符规则的标识符必须进行分隔。(2)变量的分类全局变量:全局变量由系统提供且预先声明,通过在名称前加两个“”来区别于局部变量。T-SQL全局变量作为函数引用。例如,ERROR返回执行的上一个T-SQL语句的错误号;CONNECTIONS返回自上次启动SQLServer以来连接或试图连接的次数。局部变量:局部变量用于保存单个数据值。例如,保存运算的中间结果,作为循环变量等。当首字母为“”时,表示该标识符
15、为局部变量名;当首字母为“#”时,此标识符为一临时数据库对象名,若开头含一个“#”,表示局部临时数据库对象名,若开头含两个“#”,表示全局临时数据库对象名。2局部变量(1)局部变量的定义在批处理或过程中用DECLARE语句声明局部变量,所有局部变量在声明后均初始化为NULL。语法格式:DECLARE局部变量数据类型=值,.(2)局部变量的赋值当声明局部变量后,可用SET或SELECT语句为其赋值。用SET语句赋值。将DECLARE语句创建的局部变量设置为给定表达式的值。语法格式:SETl局部变量表达式SETl局部变量表达式2局部变量【例5.2】创建局部变量var1、var2并赋值,然后输出变量
16、的值。DECLAREvar1char(10),var2char(30)SETvar1=中国/*一个SET语句只能为一个变量赋值*/SETvar2=var1+是一个伟大的国家SELECTvar1,var2GO执行结果如图5.2所示。2局部变量【例5.3】创建一个名为sex的局部变量,并在SELECT语句中使用该局部变量查找表xsb中所有女同学的学号、姓名。USExscjGODECLAREsexbitSETsex=0SELECT学号,姓名FROMxsbWHERE性别=sex【例5.4】使用查询为变量赋值。DECLAREstudentchar(8)SETstudent=(SELECT姓名FROMxs
17、bWHERE学号=191301)SELECTstudent2局部变量用SELECT语句赋值。语法格式:SELECT局部变量=表达式,说明:“SELECT局部变量”通常用于将单个值返回到变量中。如果“表达式”为列名,则返回多个值,此时将返回的最后一个值赋给变量。如果SELECT语句没有返回行,变量将保留当前值。如果“表达式”是不返回值的变量查询,则将变量设为NULL。一个SELECT语句可以初始化多个局部变量。2局部变量【例5.5】使用SELECT语句为局部变量赋值。DECLAREvar1nvarchar(30)SELECTvar1=刘丰SELECTvar1ASNAME【例5.6】为局部变量赋空
18、值。DECLAREvar1nvarchar(30)SELECTvar1=刘丰SELECTvar1=(SELECT姓名FROMxsbWHERE学号=191399)SELECTvar1ASNAME3局部游标变量(1)局部游标变量的定义语法格式:DECLARE游标变量名CURSOR,.游标变量名”是局部游标变量名,应为常规标识符。前面的“”表示是局部的。CURSOR表示该变量是游标变量。(2)局部游标变量的赋值利用SET语句为一个游标变量赋值,有3种情况:将一个已存在的并且赋值的游标变量的值赋给另一个局部游标变量;将一个已声明的游标名赋给指定的局部游标变量;声明一个游标,同时将其赋给指定的局部游标变
19、量。3局部游标变量上述3种情况的语法描述如下。语法格式:SET游标变量=游标变量/*将一个已赋值的游标变量的值赋给一个目标游标变量*/|游标名/*将一个已声明的游标名赋给游标变量*/|CURSOR子句/*游标声明*/3局部游标变量(3)游标变量的使用步骤如下:定义游标变量给游标变量赋值打开游标利用游标读取行(记录)使用结束后关闭游标删除游标的引用。【例5.7】使用游标变量。USExscjGODECLARECursorVarCURSOR/*定义游标变量*/SETCursorVar=CURSORSCROLLDYNAMIC/*为游标变量赋值*/FORSELECT学号,姓名FROMxsbWHERE姓名
20、LIKE王%OPENCursorVar/*打开游标*/FETCHNEXTFROMCursorVarFETCHNEXTFROMCursorVar/*通过游标读行记录*/CLOSECursorVarDEALLOCATECursorVar/*删除对游标的引用*/执行结果如图5.3所示。4表数据类型变量语法格式:DECLARE表变量名ASTABLE(|,.)【例5.8】声明一个表数据类型变量并向变量中插入数据。DECLAREvar_tableASTABLE(numchar(6)NOTNULLPRIMARYKEY,namechar(8)NOTNULL,sexbitNULL)/*声明变量*/INSERTI
21、NTOvar_tableSELECT学号,姓名,性别FROMxsb/*插入数据*/SELECTTOP(4)*FROMvar_tableWHERE备注=NOTNULL/*查看内容*/执行结果如图5.4所示。第第5 5章章 T-SQLT-SQL语言语言运算符与表达式运算符与表达式1算术运算符算术运算符用于对两个表达式执行数学运算,这两个表达式可以是任何数字数据类型。算术运算符有+(加)、-(减)、*(乘)、/(除)和%(求模)5种运算。+(加)和-(减)运算符还可用于对日期时间类型的值进行算术运算。2位运算符位运算符在两个表达式之间执行位操作,这两个表达式的类型可为整型或与整型兼容的数据类型(如字
22、符型等,但不能为image类型)。位运算符如表5.4所示。运算符运算规则&两个位均为1时,结果为1,否则为0|只要一个位为1,结果为1,否则为0两个位值不同时,结果为1,否则为0运算符与表达式【例5.9】在test1数据库中,建立表bitop,并插入一行,然后将a字段和b字段列上值进行按位与运算。USEtest1GOCREATETABLEbitop(aintNOTNULL,bintNOTNULL)INSERTbitopVALUES(168,73)SELECTa&b,a|b,abFROMbitopGO执行结果如图5.5所示。运算符与表达式说明:a(168)用二进制表示为0000000010101
23、000,b(73)用二进制表示为0000000001001001。在这两个值之间进行的位运算如下:(a&b):000000001010100000000000010010010000000000001000(十进制值为8)(a|b):000000001010100000000000010010010000000011101001(十进制值为233)(ab):000000001010100000000000010010010000000011100001(十进制值为225)运算符与表达式3比较运算符比较运算符(又称关系运算符)如表5.5所示,用于测试两个表达式的值是否相同,其运算结果为逻辑值,可
24、以为TRUE、FALSE及UNKNOWN三者之一。运算符含义运算符含义=相等大于、!=不等于小于!=大于等于!不大于运算符与表达式4逻辑运算符逻辑运算符用于对某个条件进行测试,运算结果为TRUE或FALSE。SQLServer提供的逻辑运算符如表5.6所示。这里的逻辑运算符在SELECT语句的WHERE子句中介绍过,此处再做一些补充。运算符运算规则AND如果两个操作数值都为TRUE,则运算结果为TRUEOR如果两个操作数中有一个为TRUE,则运算结果为TRUENOT若一个操作数值为TRUE,则运算结果为FALSE,否则为TRUEALL如果每个操作数值都为TRUE,则运算结果为TRUEANY在一
25、系列操作数中只要有一个为TRUE,则运算结果为TRUEBETWEEN如果操作数在指定的范围内,则运算结果为TRUEEXISTS如果子查询包含一些行,则运算结果为TRUEIN如果操作数值等于表达式列表中的一个,则运算结果为TRUELIKE如果操作数与一种模式相匹配,则运算结果为TRUESOME如果在一系列操作数中,有些值为TRUE,则运算结果为TRUE运算符与表达式(1)ANY、SOME、ALL、IN的使用可以将ALL或ANY关键字与比较运算符组合进行子查询。SOME的用法与ANY相同。以比较运算符为例:ALL表示大于每一个值,即大于最大值。例如,ALL(5,2,3)表示大于5。因此,使用ALL
26、的子查询也可用MAX集函数实现。ANY表示至少大于一个值,即大于最小值。例如,ANY(7,2,3)表示大于2。因此,使用ANY的子查询也可用MIN集函数实现。=ANY运算符与IN等效。ALL与NOTIN等效。运算符与表达式【例5.10】查询成绩高于“林一帆”最高成绩的学生姓名、课程名及成绩。USExscjGOSELECT姓名,课程名,成绩FROMxsb,cjb,kcbWHERE成绩ALL(SELECTb.成绩FROMxsba,cjbbWHEREa.学号=b.学号ANDa.姓名=林一帆)ANDxsb.学号=cjb.学号ANDkcb.课程号=cjb.课程号AND姓名林一帆运算符与表达式(2)BET
27、WEEN的使用语法格式:测试表达式NOTBETWEEN起始表达式AND结束表达式如果“测试表达式”的值大于或等于“起始表达式”的值并且小于或等于“结束表达式”的值,则运算结果为TRUE,否则为FALSE。“起始表达式”和“结束表达式”指定测试范围,3个表达式的类型必须相同。NOT关键字表示对谓词BETWEEN的运算结果取反。运算符与表达式SELECT学号,姓名,总学分FROMxsbWHERE总学分BETWEEN40AND50【例5.11】查询总学分在4050的学生学号和姓名。使用=和=40AND总学分,=,=,!=,!,!b。若表达式的结果是由不同类型数据组成的一行值,则这种表达式叫作行表达式
28、。例如,(学号,王林,计算机,50*10),当学号列的值为191301时,这个行表达式的值就为(191301,王林,计算机,500)。第第5 5章章 T-SQLT-SQL语言语言流程控制语句流程控制语句在设计程序时,常常需要利用各种流程控制语句,改变计算机的执行流程以满足程序设计的需要。在SQLServer中提供的流程控制语句如表5.8所示。控制语句说明控制语句说明BEGINEND语句块CONTINUE用于重新开始下一次循环IFELSE条件语句BREAK用于退出最内层的循环CASE分支语句RETURN无条件返回GOTO无条件转移语句WAITFOR为语句的执行设置延迟WHILE循环语句【例5.1
29、6】如下程序用于查询总学分大于42的学生人数。USExscjGODECLAREnumintSELECTnum=(SELECTCOUNT(姓名)FROMxsbWHERE总学分42)IFnum0SELECTnumAS总学分42的人数01语句块:BEGINEND语句块:BEGINEND在T-SQL中可以定义BEGINEND语句块。当要执行多条T-SQL语句时,就需要使用BEGINEND将这些语句定义成一个语句块,作为一组语句来执行。语法格式如下:BEGINSQL语句|语句块END关键字BEGIN是T-SQL语句块的起始位置,END标识同一个T-SQL语句块的结尾。“SQL语句”是语句块中的T-SQL
30、语句。BEGINEND可以嵌套使用,“语句块”表示使用BEGINEND定义的另一个语句块。例如:USExscjGOBEGINSELECT*FROMxsbSELECT*FROMkcbEND02条件语句:IFELSE条件语句:IFELSE在程序中如果要对给定的条件进行判定,当条件为真或假时分别执行不同的T-SQL语句,可用IFELSE语句实现。语法格式:IF条件表达式SQL语句|语句块/*条件表达式为真时执行*/ELSESQL语句|语句块/*条件表达式为假时执行*/说明:如果“条件表达式”中含有SELECT语句,则必须用圆括号将SELECT语句括起来,运算结果为TRUE(真)或FALSE(假)。条
31、件语句:IFELSE由上述语法格式可看出,条件语句分带ELSE部分和不带ELSE部分两种使用形式。(1)带ELSE部分IF条件表达式A/*T-SQL语句或语句块*/ELSEB/*T-SQL语句或语句块*/当条件表达式的值为真时执行A,然后执行IF语句的下一语句;条件表达式的值为假时执行B,然后执行IF语句的下一语句。条件语句:IFELSE(2)不带ELSE部分IF条件表达式A/*T-SQL语句或语句块*/当条件表达式的值为真时执行A,然后执行IF语句的下一条语句;当条件表达式的值为假时直接执行IF语句的下一条语句。IF语句的执行流程如图5.7所示。条件语句:IFELSEIFELSE语句可用在批
32、处理、存储过程(经常使用这种结构测试是否存在着某个参数)及特殊查询中。可在IF区或ELSE区嵌套另一个IF语句,嵌套层数不限。【例5.17】如果“计算机基础”课程的平均成绩高于75分,则显示“平均成绩高于75分”。IF(SELECTAVG(成绩)FROMxsb,cjb,kcbWHERExsb.学号=cjb.学号ANDcjb.课程号=kcb.课程号ANDkcb.课程名=计算机基础)75SELECT平均成绩低于75ELSESELECT平均成绩高于75条件语句:IFELSE【例5.18】IFELSE语句的嵌套使用。IF(SELECTAVG(成绩)FROMxsb,cjb,kcbWHERExsb.学号=
33、cjb.学号ANDcjb.课程号=kcb.课程号ANDkcb.课程名=计算机基础)75SELECT平均成绩高于7503多重分支:CASE条件语句:IFELSECASE语句可进行流程控制,可根据多重条件分支。语法格式:CASE输入表达式WHEN表达式THEN结果表达式.ELSE结果表达式END或者:CASEWHEN布尔表达式THEN结果表达式.ELSE结果表达式END条件语句:IFELSE第一种格式中“输入表达式”是要判断的值或表达式,接下来是一系列的WHEN-THEN块,每一块的“WHEN表达式”参数指定要与“输入表达式”比较的值,如果为真,就执行“结果表达式”中的T-SQL语句。如果前面的每
34、一个块都不匹配,就会执行ELSE块指定的语句。CASE语句最后以END关键字结束。第二种格式中CASE关键字后面没有参数,在WHEN-THEN块中,“布尔表达式”指定了一个比较表达式,表达式为真时执行THEN后面的语句。与第一种格式相比,这种格式能够实现更为复杂的条件判断,使用起来更方便。条件语句:IFELSE【例5.19】使用第一种格式的CASE语句,根据性别值输出“男”或“女”。SELECT学号,姓名,专业,SEX=CASE性别WHEN1THEN男WHEN0THEN女ELSE无ENDFROMxsbWHERE总学分48使用第二种格式的CASE语句,可以使用以下T-SQL语句:SELECT学号
35、,姓名,专业,SEX=CASEWHEN性别=1THEN男WHEN性别=0THEN女ELSE无ENDFROMxsbWHERE总学分4804无条件转移语句:GOTO无条件转移语句:GOTO无条件转移语句将执行流程转移到标号指定的位置。语法格式:GOTO标号“标号”是指向的语句标号,标号必须符合标识符规则。标号的定义形式为:标号:语句03循环语句:WHILE/BREAK/CONTINUE1WHILE循环语句2BREAK语句3CONTINUE语句1WHILE循环语句如果需要重复执行程序中的一部分语句,则可使用WHILE循环语句实现。语法格式:WHILE条件表达式SQL语句|语句块/*T-SQL语句序列
36、构成的循环体*/WHILE语句的执行流程如图5.8所示。1WHILE循环语句从WHILE循环的执行流程可看出其使用形式如下:WHILE条件表达式循环体/*T-SQL语句或语句块*/当条件表达式值为真时,执行构成循环体的T-SQL语句或语句块,然后再进行条件判断,重复上述操作,直至条件表达式的值为假,退出循环体的执行。【例5.20】将学号为191301的学生的总学分使用循环修改到60,每次只加2,并判断循环了多少次。USExscjGODECLAREnumINTSETnum=0WHILE(SELECT总学分FROMxsbWHERE学号=191301)60BEGINUPDATExsbSET总学分=总
37、学分+2WHERE学号=191301SETnum=num+1ENDSELECTnumAS循环次数执行结果:循环次数为5。2BREAK语句语法格式:BREAKBREAK语句一般用在循环语句中,用于退出本层循环。当程序中有多层循环嵌套时,使用BREAK语句只能退出其所在的这一层循环。3CONTINUE语句语法格式:CONTINUECONTINUE语句一般用在循环语句中,用于结束本次循环,重新转到下一次循环条件的判断。06返回语句:RETURN返回语句:RETURN返回语句用于从存储过程、批处理或语句块中的无条件退出,不执行位于RETURN之后的语句。语法格式:RETURN整数表达式如果不提供“整数
38、表达式”,则退出程序并返回一个空值;如果用在存储过程中,则可以返回整型值的“整数表达式”。【例5.21】判断是否存在学号为191328的学生,如果存在则返回,不存在则插入191328号学生的信息。IFEXISTS(SELECT*FROMxsbWHERE学号=191328)RETURNELSEINSERTINTOxsbVALUES(191328,张可,1,1990-08-12,计算机,52,NULL)07等待语句:WAITFOR DELAY/TIME等待语句:WAITFOR DELAY/TIME等待语句指定触发语句块、存储过程或事务执行的时刻或需等待的时间间隔。语法格式:WAITFORDELAY
39、等待时间|TIME执行时间说明:(1)DELAY等待时间:指定运行批处理、存储过程和事务必须等待的时间,最长可达24小时。“等待时间”可以用datetime数据格式指定,用单引号括起来,但在值中不允许有日期部分。也可以用局部变量指定参数。(2)TIME执行时间:指定运行批处理、存储过程和事务的时间,“执行时间”表示WAITFOR语句完成的时间,值的指定同上。【例5.22】如下语句设定在早上8点执行查询语句。BEGINWAITFORTIME8:00SELECT*FROMxsbEND08错误处理语句:TRYCATCH错误处理语句:TRYCATCH在SQLServer中,可以使用TRYCATCH语句
40、进行T-SQL语言中的错误处理。语法格式:BEGINTRYSQL语句|语句块ENDTRYBEGINCATCHSQL语句|语句块ENDCATCH说明:要进行错误处理,T-SQL语句组可以包含在TRY块中。如果TRY块内部发生错误,则会将控制传递给CATCH块中包含的另一个语句组。TRYCATCH构造可对严重程度高于10但不关闭数据库连接的所有执行错误进行缓存。第第5 5章章 T-SQLT-SQL语言语言系统内置函数01系统内置函数介绍1行集函数2聚合函数3标量函数1行集函数SQLServer主要提供了以下行集函数。(1)CONTAINSTABLE:对于基于字符类型的列,按照一定的搜索条件进行精确
41、或模糊匹配,然后返回一个表,该表可能为空。(2)FREETEXTTABLE:为基于字符类型的列返回一个表,其中的值符合指定文本的含义,但不符合确切的表达方式。(3)OPENDATASOURCE:提供与数据源的连接。(4)OPENQUERY:在指定数据源上执行查询。可以在查询的FROM子句中像引用基本表一样引用OPENQUERY函数,虽然查询可能返回多个记录,但OPENQUERY只返回第一个记录。(5)OPENROWSET:包含访问OLEDB数据源中远程数据所需的全部连接信息。可在查询的FROM子句中像引用基本表一样引用OPENROWSET函数,虽然查询可能返回多个记录,但OPENROWSET只
42、返回第一个记录。(6)OPENXML函数:通过XML文档提供行集视图。2聚合函数聚合函数对一组值操作,返回单一的汇总值。聚合函数在以下情况下,允许作为表达式使用:(1)SELECT语句的选择列表(子查询或外部查询);(2)COMPUTE或COMPUTEBY子句;(3)HAVING子句。T-SQL语言提供的常用聚合函数的应用请参考第4章相关内容。3标量函数标量函数的特点:输入参数的类型为基本类型,返回值也为基本类型。02常用系统标量函数1配置函数2数学函数3字符串处理函数4系统函数5日期时间函数6游标函数7元数据函数1配置函数配置函数用于返回当前配置选项设置的信息。全局变量是以函数形式使用的,配
43、置函数一般都是全局变量名,详细介绍请参见有关文档。2数学函数下面给出几个例子说明数学函数的使用,其他的数学函数请参考有关文档。(1)ABS函数语法格式:ABS(数字表达式)返回给定数字表达式的绝对值。参数为数字型表达式(bit数据类型除外),返回值类型与“数字表达式”相同。例如,显示ABS函数对3个不同数字的效果。SELECTABS(5.0),ABS(0.0),ABS(8.0)2数学函数(2)RAND函数语法格式:RAND(种子)返回01的一个随机值。参数“种子”是指定种子值的整型表达式,返回值类型为float。如果未指定“种子”,则随机分配种子值。对于指定的种子值,返回的结果始终相同。例如,
44、如下程序通过RAND函数返回随机值。DECLAREcountintSETcount=5SELECTRAND(count)3字符串处理函数字符串函数用于对字符串进行处理。在此介绍一些常用的字符串处理函数,其他的字符串处理函数请参考有关文档。(1)ASCII函数语法格式:ASCII(字符表达式)返回字符表达式最左端字符的ASCII值。参数“字符表达式”的类型为字符型的表达式,返回值为整型。例如,查找字符串sql最左端字符的ASCII值。SELECTASCII(sql)执行结果为115,它是小写s的ASCII值。(2)CHAR函数语法格式:CHAR(整型表达式)将ASCII码转换为字符。“整型表达式
45、”为0255的整数,返回值为字符型。3字符串处理函数(3)LEFT函数语法格式:LEFT(字符表达式,整型表达式)返回从字符串左边开始指定个数的字符,返回值为varchar型。例如,返回课程名最左边的4个字符。SELECTLEFT(课程名,4)FROMkcbORDERBY课程号又例如:SELECT学号,姓名FROMxsbWHERELEFT(学号,2)=19DECLAREstringvarchar(40)SETstring=中国,一个古老而伟大的国家SELECTLTRIM(string)SELECTstring3字符串处理函数(4)LTRIM函数语法格式:LTRIM(字符表达式)删除“字符表达式
46、”字符串中的前导空格,并返回字符串。例如,使用LTRIM函数删除字符变量中的起始空格。3字符串处理函数(5)REPLACE函数语法格式:REPLACE(字符串表达式1,字符串表达式2,字符串表达式3)用“字符串表达式3”替换“字符串表达式1”中包含的“字符串表达式2”,并返回替换后的表达式(返回值为字符型)。(6)SUBSTRING函数语法格式:SUBSTRING(表达式,起始,长度)返回“表达式”中从“起始”位置开始,由“长度”指定的字节的数据。参数“表达式”可为字符串、二进制串、text、image字段或表达式;“起始”“长度”均为整型。如果“表达式”是字符类型和二进制类型,则返回值类型与
47、“表达式”的类型相同。其他情况如表5.9所示。给定的表达式返回值类型给定的表达式返回值类型给定的表达式返回值类型textvarcharimagevarbinaryntextnvarchar3字符串处理函数【例5.23】如下程序第1列为xsb表中的姓,另两列为学生名。SELECTTOP(4)SUBSTRING(姓名,1,1),SUBSTRING(姓名,2,LEN(姓名)-1)FROMxsbORDERBY姓名执行结果如图5.9所示。3字符串处理函数【例5.24】显示字符串“China”中每个字符的ASCII值和字符。DECLAREpositionint,stringchar(8)SETpositi
48、on=1SETstring=ChinaWHILEposition=DATALENGTH(string)BEGINSELECTASCII(SUBSTRING(string,position,1)ASASCII码,CHAR(ASCII(SUBSTRING(string,position,1)AS字符SETposition=position+1END执行结果如图5.10所示。4系统函数(1)CAST和CONVERT函数CAST、CONVERT这两个函数的功能都是实现数据类型的转换,但CONVERT的功能更强一些。常用的类型转换有以下几种情况:日期型字符型、字符型日期型、数值型字符型。语法格式:CAS
49、T(表达式AS数据类型(长度)CONVERT(数据类型(长度),表达式,类型)说明:这两个函数将表达式的类型转换为“数据类型”所指定的类型。参数“表达式”可为任何有效的表达式,“数据类型”可为系统提供的基本类型,不能为用户自定义类型,当为nchar、nvarchar、char、varchar、binary或varbinary等数据类型时,可以通过“长度”参数指定长度。对于不同的表达式类型转换,参数“类型”的取值不同。“类型”的常用取值及其作用如表5.10表5.12所示。4系统函数不带世纪数位(yy)带世纪数位(yyyy)标准输入/输出0或100默认值monddyyyyhh:miAM(或PM)1
50、101美国mm/dd/yyyy2102ANSIyy.mm.dd9或109默认值+毫秒monddyyyyhh:mi:ss:mmmAM(或PM)10110美国mm-dd-yy12112ISOyymmddstyle值输出0(默认值)根据需要使用科学记数法,长度最多为61使用科学记数法,长度为82使用科学记数法,长度为16表5.10日期型与字符型转换时“类型”的常用取值及其作用表5.11float或real转换为字符型数据时“类型”的取值表5.12从money或smallmoney转换为字符数据时“类型”的取值值输出0(默认值)小数点左侧每3位数字之间不以逗号分隔,小数点右侧取2位数,例如4235.9