第5章T-SQL语言5.1常量、变量与数据类型5.2运算符与表达式5.3流程控制语句5.4系统内置函数5.5用户自定义函数Transact-SQL语言主要组成部分数据定义语言(DDL,DataDefinitionLanguage)数据操纵语言(DML,DataManipularionLanguage)数据控制语言(DCL,DataControlLanguage)系统存储过程(SystemStoredProcedure)一些附加的语言元素T-SQL语言(1)数据定义语言(DDL)数据定义语言是指用来定义和管理数据库以及数据库中的各种对象的语句,这些语句包括CREATE、ALTER和DROP等语句。在SQLServer2000中,数据库对象包括表、视图、触发器、存储过程、规则、缺省、用户自定义的数据类型等。这些对象的创建、修改和删除等都可以通过使用CREATE、ALTER、DROP等语句来完成。T-SQL语言T-SQL语言(2)数据操纵语言(DML)数据操纵语言是指用来查询、添加、修改和删除数据库中数据的语句,这些语句包括SELECT、INSERT、UPDATE、DELETE等。在默认情况下,只有sysadmin、dbcreator、db_owner或db_datawriter等角色的成员才有权利执行数据操纵语言。T-SQL语言(3)数据控制语言(DCL)数据控制语言(DCL)是用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT、DENY、REVOKE等语句,在默认状态下,只有sysadmin、dbcreator、db_owner或db_securityadmin等角色的成员才有权利执行数据控制语言。T-SQL语言(4)系统存储过程系统存储过程是SQLServer系统创建的存储过程,它的目的在于能够方便地从系统表中查询信息,或者完成与更新数据库表相关的管理任务或其它的系统管理任务。系统存储过程可以在任意一个数据库中执行。系统存储过程创建并存放于系统数据库master中,并且名称以sp_或者xp_开头。T-SQL语言(5)其它语言元素注释变量运算符函数流程控制语句T-SQL语言注释注释是程序代码中不执行的文本字符串(也称为注解)。在SQLServer中,可以使用两种类型的注释字符:一种是ANSI标准的注释符“--”,它用于单行注释;另一种是与C语言相同的程序注释符号,即“/*(注释开始)、*/(注释结束)”。5.1常量、变量与数据类型常量指在程序运行过程中值不变的量.常量又称为字面值或标量值.常量的使用格式取决于值的数据类型:1.字符串常量分为ASCII字符串常量和Unicode字符串常量.ASCII字符串常量是用单引号括起来,由ASCII字符构成的字符串.例:‘WANG’、‘NAME’、‘计算机’Unicode字符串常量与ASCII字符串常量相似,但在串前面有一个大写的N.例:N‘WANG’、N‘NAME’、N‘计算机’5.1.1常量5.1.1常量2.整型常量分为:(1)二进制整型常量:既由来0或1构成的串,不使用引号.如果使用了大于1的数字,则转换为1.(2)十六进制整型常量:前缀0x后跟十六进制数字串.例:0xEBF、0x12FF、0x(3)十进制整型常量:即不带小数点的十进制数.例:1984、3、1232、-1233.实型常量分为:(1)定点表示:例:1984.123、+3.1415926、-1232.111(2)浮点表示:例:101.5E5、+0.5E-2、-12E45.1.1常量4.日期时间常量用单引号括起来的日期时间的字符串,SQLServer可识别的格式:(1)字母日期格式:例:‘April20,2000’(2)数字日期格式:例:‘4/20/2000’(3)未分隔的字符串格式:例:‘20000420’常见的时间常量:‘14:30:24’、‘04:24:23’常见的日期时间常量:‘April20,200014:30:24’5.1.1常量5.货币常量以$为前缀的整型或实型常量数据.例:$112、$1984.123、$3.14159265.1.1常量5.1.3变量变量是一种语言中必不可少的组成部分。它用于临时存放数据,随程序的运行而变化,变量有名字及其类型两个属性.变量名标识该变量,变量类型确定了该变量值的格式及允许的运算.Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。变量名必须是一个合法的标识符,分为:1.常规标识符:以ASCII字母、Unicode字母、下划线(_)、@或#开头,后跟ASCII字符、Unicode字符、美元符号($)、下划线(_)、@或#构成.最大长度为128个字符.但不能全是下划线(_)、@或#.注意:常规标识符不能是T-SQL的保留字、也不允许嵌入空格或其他特殊字符。2.分隔标识符:包含在双引号(“)或方括号内的常规标识符或不符合常规标识符的标识符.5.1.3变量1.局部变量局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部变量还可以保存数据值,以供控制流语句测试以及保存由存储过程返回的数据值等。局部变量被引用时要在其名称前加上标志“@”,而且必须先用DECLARE命令定义后才可以使用。5.1.3变量DECLARE命令的语法格式:DECLARE{@局部变量名数据类型}[,…n]给局部变量赋值可使用SET或SELECT语句完成.1.用SET语句赋值语法格式:SET@局部变量名=表达式功能:将DECLARE语句定义的局部变量设置为给定表达式的值.[例5.1]创建局部变量@ver1、@ver2,并赋值,然后输出变量的值.DECLARE@ver1char(20),@ver2char(20)SET@ver1='中华'SET@ver2='人民代表大会'SELECT@ver1,@ver2GO5.1.3变量[例5.2]创建一个名为SEX的局部变量,并在SELECT语句中使用,查找表XS中所有女同学的学号、姓名.UsexscjDECLARE@SEXbitSET@SEX=0SELECT学号,姓名FROMXSWHERE性别=@SEXGO[例5.3]使用查询给变量赋值.UsexscjDECLARE@studendchar(8)SET@studend=(SELECT姓名FROMXSWHERE学号='001101')SELECT@studend姓名GO5.1.3变量2.用SELECT语句赋值语法格式:SELECT{@局部变量名=表达式}[,…n]说明:(1)SELECT通常将单个值返回到变量中.如果表达式为列名,将返回最后一个值给变量;(2)如果没有返回值,变量的值不变;(3)如果表达式是不返回值的子查询,变量的值设为NULL(4)一个SELECT语句可以初始化多个局部变量.[例5.4]在XS表中查找学号为‘101101’的同学的姓名(没有返回值).DECLARE@ver1nvarchar(30)SELECT@ver1='刘丰'SELECT@ver1=姓名FROMXSWHERE学号='101101'SELECT@ver1AS姓名GO5.1.3变量[例5.5]在XS表中查找学号为‘101101’的同学的姓名(使用子查询返回值为空).DECLARE@ver1nvarchar(30)SELECT@ver1='刘丰'SELECT@ver1=(SELECT姓名FROMXSWHERE学号='101101')SELECT@ver1AS姓名GO5.1.3变量2.全局变量全局变量是SQLServer系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局变量通常存储一些SQLServer的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是Transact-SQL命令执行后的状态值。使用全局变量时应该注意以下几点:①全局变量不是由用户的程序定义的,它们是在服务器级定义的。②用户只能使用预先定义的全局变量。③引用全局变量时,必须以标记符“@@”开头。④局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。5.1.3变量5.2运算符与表达式5.2.1运算符运算符是一些符号,它们能够用来执行算术运算、字符串连接、赋值以及在字段、常量和变量之间进行比较。在SQLServer2000中,运算符主要有以下七大类:算术运算符赋值运算符比较运算符位运算符逻辑运算符字符串串联运算符一元运算符5.2.1运算符1.算术运算符算术运算符可以在两个表达式上执行数学运算,这两个表达式可以是数字数据类型分类的任何数据类型。算术运算符包括加(+)、减(—)、乘(*)、除(/)和取模(%).加(+)、减(—)运算符也可对日期时间型值进行算术运算.[例5.7]求学生的年龄.SETNOCOUNTON/*当SETNOCOUNT为ON时,不返回计数(表示受Transact-SQL语句影响的行数)。当SETNOCOUNT为OFF时,返回计数。*/DECLARE@startdateintSELECT@startdate=year(getdate())SELECT@startdate-year(出生时间)AS年龄FROMXSGO5.2.1运算符2.赋值运算符T-SQL中只有一个赋值运算符,即等号(=).赋值运算符使我们能够将数据值指派给特定的对象。另外,还可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。5.2.1运算符3.位运算符位运算符使我们能够在整型数据或者二进制数据(image图型数据类型除外)之间执行位操作。此外,在位运算符左右两侧的操作数不能同时是二进制数据。运算符含义&(按位AND)按位AND(两个操作数)。|(按位OR)按位OR(两个操作数)。^(按位互斥OR)按位互斥OR(两个操作数)。5.2.1运算符[例5.8]在XSCJ数据库中建立表bitop,并插入一行,然后将错就错a字段和b字段列的值进行位运算.UsexscjCREATETABLEbitop(aintNOTNULL,bintNOTNULL)INSERTbitopVALUES(170,75)SELECTa&b,a|b,a^bFROMbitopgo5.2.1运算符4.比较运算符比较运算符用于比较两个表达式的大小或是否相同,其比较的结果是布尔值,即TRUE(表示比较的结果为真)、FALSE(表示比较的结果为假)以及UNKNOWN。除了text、ntext或image数据类型的表达式外,比较运算符可以用于所有的表达式。5.2.1运算符5.逻辑运算符逻辑运算符可以把多个逻辑表达式连接起来。逻辑运算符包括AND、OR和NOT等运算符。逻辑运算符和比较运算符一样,返回带有TRUE或FALSE值的布尔数据类型。5.2.1运算符6.字符串串联运算符字符串串联运算符允许通过加号(+)进行字符串串联,这个加号即被称为字符串串联运算符。例如对于语句SELECT‘abc’+’def’,其结果为abcdef。5.2.1运算符7.一元运算符一元运算符有+(正)、-(负)和~(按位取反).按位取反例:设a的值为12(0000000000001100),~a的值为1111111111110011运算符的优先等级从高到低如下所示括号:();乘、除、求模运算符:*、/、%;加减运算符:+、-;比较运算符:=、、、=、=、、!=、!、!;位运算符:^、&、|;逻辑运算符:NOT;逻辑运算符:AND;逻辑运算符:OR。5.2.1运算符5.2.2表达式表达式是由运算符连结运算量而构成的式子.5.3流程控制语句流程控制语句是指那些用来控制程序执行和流程分支的命令,在SQLServer2000中,流程控制语句主要用来控制SQL语句、语句块或者存储过程的执行流程。[例5.17]如下程序用于查询总学分大于40的学生人数.U