第5章数据库PPT讲稿.ppt
第第5章数据章数据库第1页,共142页,编辑于2022年,星期一第第5章章 SQL Server 2008高级应用高级应用5.1 T-SQL程序设计程序设计5.2 存储过程存储过程5.3 触发器触发器5.4 用户自定义函数用户自定义函数第2页,共142页,编辑于2022年,星期一5.1T-SQL程序设计程序设计v1什么是什么是SQL语言语言SQL语言的全名是结构化查询语言(语言的全名是结构化查询语言(StructuredQueryLanguage),),是用于数据库中的标准数据查询语言,是用于数据库中的标准数据查询语言,IBM公司最早使用该语言在其公司最早使用该语言在其开发的数据库系统中。开发的数据库系统中。1986年年10月,美国月,美国ANSI对对SQL进行规范后,进行规范后,以此作为关系数据库管理系统的标准语言。以此作为关系数据库管理系统的标准语言。不同的数据库管理系统在其实践过程中都对不同的数据库管理系统在其实践过程中都对SQL规范做了某些改规范做了某些改变和扩充。所以,实际上,不同数据库管理系统之间的变和扩充。所以,实际上,不同数据库管理系统之间的SQL语言语言不能完全通用。例如,微软公司的不能完全通用。例如,微软公司的MSSQL-Server支持的是支持的是T-SQL,而甲,而甲骨文公司的骨文公司的Oracle数据库所使用的数据库所使用的SQL语言则是语言则是PL-SQL。第3页,共142页,编辑于2022年,星期一5.1T-SQL程序设计程序设计v2什么是什么是T-SQL语言语言T-SQL是是SQL语言的一种版本,且只能在微软语言的一种版本,且只能在微软MSSQL-Server以及以及SybaseAdaptiveServer系列数据库上使用。系列数据库上使用。T-SQL是是ANSISQL的扩展加强版语言,除了提供标准的的扩展加强版语言,除了提供标准的SQL命令命令之外,之外,T-SQL还对还对SQL做了许多补充,提供了类似做了许多补充,提供了类似C、BASIC和和Pascal的的基本功能,如变量说明、流控制语言、功能函数等。基本功能,如变量说明、流控制语言、功能函数等。第4页,共142页,编辑于2022年,星期一5.1.1T-SQL程序结构程序结构一个一个Transact-SQL程序结构有如下要素组成:程序结构有如下要素组成:注释注释批处理批处理程序中使用的变量程序中使用的变量流程控制语句流程控制语句错误和消息的处理错误和消息的处理第5页,共142页,编辑于2022年,星期一5.1.2T-SQL程序的批处理程序的批处理批处理是从客户机传递到服务器上的一组完整的数据和批处理是从客户机传递到服务器上的一组完整的数据和SQL指令。指令。在一个批处理中,可以包含一条在一个批处理中,可以包含一条SQL指令,也可以包含多条指令,也可以包含多条SQL指指令。令。所有的批处理命令都使用所有的批处理命令都使用GO作为结束的标志。当作为结束的标志。当SQLServer编译编译器读到器读到GO时,他就会把时,他就会把GO前面所有的语句当做一个批处理而打包成前面所有的语句当做一个批处理而打包成一个数据包发送给服务器。一个数据包发送给服务器。SQLServer会将一批会将一批T-SQL语句当成一个执语句当成一个执行单元,将其编译后一次执行,而不是将一个个行单元,将其编译后一次执行,而不是将一个个T-SQL语句编译后在一个语句编译后在一个个执行。个执行。第6页,共142页,编辑于2022年,星期一5.1.3数据类型数据类型v1系统数据类型系统数据类型系统数据类型又称为基本数据类型。在第系统数据类型又称为基本数据类型。在第4章已详细地介绍了系章已详细地介绍了系统数据类型,此处不再赘述。统数据类型,此处不再赘述。v2用户自定义数据类型用户自定义数据类型用户自定义数据类型可看做系统数据类型的别名。用户自定义数据类型可看做系统数据类型的别名。在多表操作的情况下,当多个表中的列要存储相同类型的数据时,在多表操作的情况下,当多个表中的列要存储相同类型的数据时,往往要确保这些列具有完全相同的数据类型、长度和为空性(数据类往往要确保这些列具有完全相同的数据类型、长度和为空性(数据类型是否允许空值)。用户自定义数据类型并不是真正的数据类型,它型是否允许空值)。用户自定义数据类型并不是真正的数据类型,它只是提供了一种提高数据库内部元素和基本数据类型之间一致性的机只是提供了一种提高数据库内部元素和基本数据类型之间一致性的机制。制。第7页,共142页,编辑于2022年,星期一5.1.4常量、变量与数据类型常量、变量与数据类型根据常量值的不同类型,常量分为字符串常量、整型常量、根据常量值的不同类型,常量分为字符串常量、整型常量、实型常量、日期时间常量、货币常量、唯一标识常量。各类常实型常量、日期时间常量、货币常量、唯一标识常量。各类常量举例说明如下。量举例说明如下。v1字符串常量字符串常量字符串常量分为字符串常量分为ASCII字符串常量和字符串常量和Unicode字符串常量。字符串常量。(1)ASCII字符串常量。字符串常量。ASCII字符串常量是用单引号括起来,由字符串常量是用单引号括起来,由ASCII字符构成的符号串。字符构成的符号串。ASCII字符串常量举例如下:字符串常量举例如下:ChinaHowdoyou!OBbaar/*如果单引号中的字符串包含引号,可以使用两个单引号来表示如果单引号中的字符串包含引号,可以使用两个单引号来表示嵌入的单引号。嵌入的单引号。*/第8页,共142页,编辑于2022年,星期一5.1.4常量常量(2)Unicode字符串常量。字符串常量。Unicode字符串常量与字符串常量与ASCII字符串常字符串常量相似,但它前面有一个量相似,但它前面有一个N标识符(标识符(N代表代表SQL-92标准中的国际语言标准中的国际语言NationalLanguage),),N前缀必须为大写字母。前缀必须为大写字母。Unicode字符串常量举例如下:字符串常量举例如下:NChinaNHowdoyou!Unicode数据中的每个字符用两个字节存储,而每个数据中的每个字符用两个字节存储,而每个ASCII字符用一字符用一个字节存储。个字节存储。第9页,共142页,编辑于2022年,星期一5.1.4常量常量v2整型常量整型常量按照不同表示方式,整型常量又分为二进制整型常量、十六进制整型常量和按照不同表示方式,整型常量又分为二进制整型常量、十六进制整型常量和十进制整型常量。十进制整型常量。十六进制整型常量的表示:前辍十六进制整型常量的表示:前辍0 x后跟十六进制数字串。后跟十六进制数字串。十六进制常量举例:十六进制常量举例:0 xEBF0 x69048AEFDD010E0 x/*空十六进制常量空十六进制常量*/二进制整型常量的表示:即数字二进制整型常量的表示:即数字0或或1,并且不使用引号。如果使用一个大,并且不使用引号。如果使用一个大于于1的数字,它将被转换为的数字,它将被转换为1。十进制整型常量即不带小数点的十进制数,例如,十进制整型常量即不带小数点的十进制数,例如,18942+145345234-2147483648第10页,共142页,编辑于2022年,星期一5.1.4常量常量v3实型常量实型常量实型常量有定点表示和浮点表示两种方式,举例如下。实型常量有定点表示和浮点表示两种方式,举例如下。定点表示:定点表示:1894.12042.0+145345234.2234-2147483648.10浮点表示:浮点表示:101.5E50.5E-2+123E-3-12E5第11页,共142页,编辑于2022年,星期一5.1.4常量常量v4日期时间常量日期时间常量日期时间常量:用单引号将表示日期时间的字符串括起来构成。日期时间常量:用单引号将表示日期时间的字符串括起来构成。SQLServer可以识别如下格式的日期和时间。可以识别如下格式的日期和时间。字母日期格式,如字母日期格式,如April20,2000;数字日期格式,如数字日期格式,如4/15/1998,1998-04-15;未分隔的字符串格式,如未分隔的字符串格式,如20001207;以下是时间常量的例子:以下是时间常量的例子:14:30:2404:24:PM以下是日期时间常量的例子:以下是日期时间常量的例子:April20,200014:30:24第12页,共142页,编辑于2022年,星期一5.1.4常量常量v5money常量常量money常量是以常量是以“$”作为前缀的一个整型或实型常量数据。下面作为前缀的一个整型或实型常量数据。下面是是money常量的例子:常量的例子:$12$542023-$45.56+$423456.99v6uniqueidentifier常量常量uniqueidentifier常量是用于表示全局唯一标识符(常量是用于表示全局唯一标识符(GUID)值的)值的字符串。可以使用字符串或十六进制字符串格式指定。例如,字符串。可以使用字符串或十六进制字符串格式指定。例如,6F9619FF-8A86-D011-B42D-00004FC964FF0 xff19966f868b11d0b42d00c04fc964ff第13页,共142页,编辑于2022年,星期一5.1.4变量变量变量名必须是一个合法的标识符。变量名必须是一个合法的标识符。(1)标识符。在)标识符。在SQLServer中标识符分为两类。中标识符分为两类。常规标识符:以常规标识符:以ASCII字母、字母、Unicode字母、下划线(字母、下划线(_)、)、或或#开头,后续可跟一个或若干个开头,后续可跟一个或若干个ASCII字符、字符、Unicode字符、下划线(字符、下划线(_)、)、美元符号(美元符号($)、)、或或#,但不能全为下划线(,但不能全为下划线(_)、)、或或#。注意:常规标识符不能是注意:常规标识符不能是T-SQL的保留字。常规标识符中不允许的保留字。常规标识符中不允许嵌入空格或其他特殊字符。嵌入空格或其他特殊字符。分隔标识符:包含在双引号(分隔标识符:包含在双引号()或者方括号()或者方括号()内的常规标识)内的常规标识符或不符合常规标识符规则的标识符。符或不符合常规标识符规则的标识符。标识符允许的最大长度为标识符允许的最大长度为128个字符。符合常规标识符格式规则的个字符。符合常规标识符格式规则的标识符可以分隔,也可以不分隔。对不符合标识符规则的标识符必须标识符可以分隔,也可以不分隔。对不符合标识符规则的标识符必须进行分隔。进行分隔。第14页,共142页,编辑于2022年,星期一5.1.4变量变量(2)变量的分类。)变量的分类。SQLServer中变量可分为两类。中变量可分为两类。全局变量:全局变量由系统提供且预先声明,通过在名称前加两全局变量:全局变量由系统提供且预先声明,通过在名称前加两个个“”来区别于局部变量。来区别于局部变量。T-SQL全局变量作为函数引用。例如,全局变量作为函数引用。例如,ERROR返回执行的上一个返回执行的上一个T-SQL语句的错误号;语句的错误号;CONNECTIONS返回自上次启动返回自上次启动SQLServer以来连接或试图连接的次数。全局变量的意义以来连接或试图连接的次数。全局变量的意义及使用请参考附录及使用请参考附录B。局部变量:局部变量用于保存单个数据值。例如,保存运算的中局部变量:局部变量用于保存单个数据值。例如,保存运算的中间结果,作为循环变量等。间结果,作为循环变量等。当首字母为当首字母为“”时,表示该标识符为局部变量名;当首字母为时,表示该标识符为局部变量名;当首字母为“#”时,此标识符为一临时数据库对象名,若开头含一个时,此标识符为一临时数据库对象名,若开头含一个“#”,表示,表示局部临时数据库对象名;若开头含两个局部临时数据库对象名;若开头含两个“#”,表示全局临时数据库对,表示全局临时数据库对象名。象名。第15页,共142页,编辑于2022年,星期一5.2.3变量变量v2局部变量的使用局部变量的使用(1)局部变量的定义与赋值。)局部变量的定义与赋值。局部变量的定义。在批处理或过程中用局部变量的定义。在批处理或过程中用DECLARE语句声明局部变量,所有局部变量在语句声明局部变量,所有局部变量在声明后均初始化为声明后均初始化为NULL。语法格式:。语法格式:DECLARElocal_variabledata_type=value,.n说明如下。说明如下。local_variable:局部变量名,应为常规标识符。前面的:局部变量名,应为常规标识符。前面的“”表示是局部变量。表示是局部变量。data_type:数据类型,用于定义局部变量的类型,可为系统类型或自定义类型。:数据类型,用于定义局部变量的类型,可为系统类型或自定义类型。=value:为变量赋值,值可以是常量或表达式,但它必须与变量声明类型匹配。:为变量赋值,值可以是常量或表达式,但它必须与变量声明类型匹配。n:表示可定义多个变量,各变量间用逗号隔开。:表示可定义多个变量,各变量间用逗号隔开。局部变量的赋值。当声明局部变量后,可用局部变量的赋值。当声明局部变量后,可用SET或或SELECT语句为其赋值。语句为其赋值。用用SET语句赋值:语句赋值:将将DECLARE语句创建的局部变量设置为给定表达式的值。语法格式:语句创建的局部变量设置为给定表达式的值。语法格式:SETlocal_variableexpression第16页,共142页,编辑于2022年,星期一5.1.4变量变量【例例5.2】创建局部变量创建局部变量var1、var2并赋值,然后输出变量的值。并赋值,然后输出变量的值。DECLAREvar1char(10),var2char(30)SETvar1=中国中国/*一个一个SET语句只能为一个变量赋值语句只能为一个变量赋值*/SETvar2=var1+是一个伟大的国家是一个伟大的国家SELECTvar1,var2GO执行结果如下:执行结果如下:第17页,共142页,编辑于2022年,星期一5.1.4变量变量【例例5.3】创建一个名为创建一个名为sex的局部变量,并在的局部变量,并在SELECT语句中使用该局部变量查找表语句中使用该局部变量查找表XSB中所中所有女同学的学号、姓名。有女同学的学号、姓名。USEPXSCJGODECLAREsexbitSETsex=0SELECT学号学号,姓名姓名FROMXSBWHERE性别性别=sex执行结果如下:执行结果如下:第18页,共142页,编辑于2022年,星期一5.1.4变量变量【例例5.4】使用查询为变量赋值。使用查询为变量赋值。DECLAREstudentchar(8)SETstudent=(SELECT姓名姓名FROMXSBWHERE学号学号=081101)SELECTstudent用用SELECT语句赋值:语句赋值:语法格式:语法格式:SELECTlocal_variable=expression,n关于关于SELECT,需说明以下几点:,需说明以下几点:vSELECTlocal_variable通常用于将单个值返回到变量中。如果通常用于将单个值返回到变量中。如果expression为列名,为列名,则返回多个值,此时将返回的最后一个值赋给变量。则返回多个值,此时将返回的最后一个值赋给变量。v如果如果SELECT语句没有返回行,变量将保留当前值。语句没有返回行,变量将保留当前值。v如果如果expression是不返回值的标量子查询,则将变量设为是不返回值的标量子查询,则将变量设为NULL。v一个一个SELECT语句可以初始化多个局部变量。语句可以初始化多个局部变量。第19页,共142页,编辑于2022年,星期一5.1.4变量变量【例例5.5】使用使用SELECT语句为局部变量赋值。语句为局部变量赋值。DECLAREvar1nvarchar(30)SELECTvar1=刘丰刘丰SELECTvar1ASNAME执行结果如下:执行结果如下:第20页,共142页,编辑于2022年,星期一5.1.4变量变量【例例5.6】为局部变量赋空值。为局部变量赋空值。DECLAREvar1nvarchar(30)SELECTvar1=刘丰刘丰SELECTvar1=(SELECT姓名姓名FROMXSBWHERE学号学号=089999)SELECTvar1ASNAME执行结果如下:执行结果如下:第21页,共142页,编辑于2022年,星期一5.1.4变量变量(2)局部游标变量的定义与赋值。)局部游标变量的定义与赋值。局部游标变量的定义。局部游标变量的定义。语法格式:语法格式:DECLAREcursor_variable_nameCURSOR,.ncursor_variable_name是局部游标变量名,应为常规标识符。前是局部游标变量名,应为常规标识符。前面的面的“”表示是局部的。表示是局部的。CURSOR表示该变量是游标变量。表示该变量是游标变量。局部游标变量的赋值。利用局部游标变量的赋值。利用SET语句为一个游标变量赋值,语句为一个游标变量赋值,有三种情况:有三种情况:将一个已存在的并且赋值的游标变量的值赋给另一个局部游将一个已存在的并且赋值的游标变量的值赋给另一个局部游标变量。标变量。将一个已声明的游标名赋给指定的局部游标变量。将一个已声明的游标名赋给指定的局部游标变量。声明一个游标,同时将其赋给指定的局部游标变量。声明一个游标,同时将其赋给指定的局部游标变量。第22页,共142页,编辑于2022年,星期一5.1.4变量变量上述三种情况的语法描述如下。上述三种情况的语法描述如下。语法格式:语法格式:SETcursor_variable=cursor_variable/*将一个已赋值的游标变量的值赋给将一个已赋值的游标变量的值赋给一个目标游标变量一个目标游标变量*/|cursor_name/*将一个已声明的游标名赋给游标变量将一个已声明的游标名赋给游标变量*/|CURSOR子句子句/*游标声明游标声明*/第23页,共142页,编辑于2022年,星期一5.1.4变量变量游标变量的使用步骤如下。游标变量的使用步骤如下。定义游标变量定义游标变量给游标变量赋值给游标变量赋值打开游标打开游标利用游标读取行(记录)利用游标读取行(记录)使用结束后关闭游使用结束后关闭游标标删除游标的引用。删除游标的引用。【例例5.7】使用游标变量。使用游标变量。USEPXSCJGODECLARECursorVarCURSOR/*定义游标变量定义游标变量*/SETCursorVar=CURSORSCROLLDYNAMIC/*为游标变量赋值为游标变量赋值*/FORSELECT学号学号,姓名姓名FROMXSBWHERE姓名姓名LIKE王王%OPENCursorVar/*打开游标打开游标*/FETCHNEXTFROMCursorVarFETCHNEXTFROMCursorVar/*通过游标读行记录通过游标读行记录*/CLOSECursorVarDEALLOCATECursorVar/*删除对游标的引用删除对游标的引用*/第24页,共142页,编辑于2022年,星期一5.1.4变量变量(3)表数据类型变量的定义与赋值。)表数据类型变量的定义与赋值。语法格式:语法格式:DECLAREtable_variable_nameASTABLE(|,.)【例例5.8】声明一个表数据类型变量并向变量中插入数据。声明一个表数据类型变量并向变量中插入数据。DECLAREvar_tableASTABLE(numchar(6)NOTNULLPRIMARYKEY,namechar(8)NOTNULL,sexbitNULL)/*声明变量声明变量*/INSERTINTOvar_tableSELECT学号学号,姓名姓名,性别性别FROMXSB/*插入数据插入数据*/SELECT*FROMvar_table/*查看内容查看内容*/第25页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式v1算术运算符算术运算符算术运算符在两个表达式上执行数学运算,这两个表达式可以是任何数字数据类型算术运算符在两个表达式上执行数学运算,这两个表达式可以是任何数字数据类型。v算术运算符有算术运算符有+(加)、(加)、-(减)、(减)、*(乘)、(乘)、/(除)和(除)和%(求模)(求模)5种运算。种运算。+(加)和(加)和-(减)运算符还可用于对日期时间类型的值进行算术运算。(减)运算符还可用于对日期时间类型的值进行算术运算。v2位运算符位运算符位运算符在两个表达式之间执行位操作,这两个表达式的类型可为整型或与整型位运算符在两个表达式之间执行位操作,这两个表达式的类型可为整型或与整型兼容的数据类型(如字符型等,但不能为兼容的数据类型(如字符型等,但不能为image类型)。位运算符如表类型)。位运算符如表5.7所示。所示。运算符运 算 规 则&两个位均为1时,结果为1,否则为0|只要一个位为1,则结果为1,否则为0两个位值不同时,结果为1,否则为0表表5.7 位运算符位运算符第26页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式【例例5.9】在在master数据库中,建立表数据库中,建立表bitop,并插入一行,然后将,并插入一行,然后将a字段和字段和b字段列上值进字段列上值进行按位与运算。行按位与运算。USEmasterGOCREATETABLEbitop(aintNOTNULL,bintNOTNULL)INSERTbitopVALUES(168,73)SELECTa&b,a|b,abFROMbitopGO执行结果如下:执行结果如下:第27页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式说明:说明:a(168)的二进制表示为的二进制表示为0000000010101000;b(73)的二进制表示为的二进制表示为0000000001001001。在这两个值之间进行的位运算如下。在这两个值之间进行的位运算如下。(a&b):000000001010100000000000010010010000000000001000(十进制值为(十进制值为8)(a|b):000000001010100000000000010010010000000011101001(十进制值为(十进制值为233)(ab):000000001010100000000000010010010000000011100001(十进制值为(十进制值为225)第28页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式v3比较运算符比较运算符比较运算符(又称关系运算符)如表比较运算符(又称关系运算符)如表5.8所示,用于测试两个表达式的值是否相同,其运算结果所示,用于测试两个表达式的值是否相同,其运算结果为逻辑值,可以为为逻辑值,可以为TRUE、FALSE及及UNKNOWN三者之一。三者之一。运算符含义运算符含义=相等大于、!=不等于小于!=大于等于!不大于表表5.8 比较运算符比较运算符第29页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式除除text、ntext或或image类型的数据外,比较运算符可以用于所有的表达式,下面的例类型的数据外,比较运算符可以用于所有的表达式,下面的例子用于查询指定学号的学生在子用于查询指定学号的学生在XSB表中的信息,其中,表中的信息,其中,IF语句为条件判断语句,将在语句为条件判断语句,将在5.4节节介绍。介绍。USEPXSCJGODECLAREstudentchar(10)SETstudent=081101IF(student0)SELECT*FROMXSBWHERE学号学号=student执行结果如下:执行结果如下:第30页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式v4逻辑运算符逻辑运算符逻辑运算符用于对某个条件进行测试,运算结果为逻辑运算符用于对某个条件进行测试,运算结果为TRUE或或FALSE。SQLServer提供的逻辑提供的逻辑运算符如表运算符如表5.9所示。这里的逻辑运算符在所示。这里的逻辑运算符在SELECT语句的语句的WHERE子句中使用过,此处再做一些子句中使用过,此处再做一些补充。补充。运算符运 算 规 则AND如果两个操作数值都为TRUE,则运算结果为TRUEOR如果两个操作数中有一个为TRUE,则运算结果为TRUENOT若一个操作数值为TRUE,则运算结果为FALSE,否则为TRUEALL如果每个操作数值都为TRUE,则运算结果为TRUEANY在一系列操作数中只要有一个为TRUE,则运算结果为TRUEBETWEEN如果操作数在指定的范围内,则运算结果为TRUEEXISTS如果子查询包含一些行,则运算结果为TRUEIN如果操作数值等于表达式列表中的一个,则运算结果为TRUELIKE如果操作数与一种模式相匹配,则运算结果为TRUESOME如果在一系列操作数中,有些值为TRUE,则运算结果为TRUE表表5.9 逻辑运算符逻辑运算符第31页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式(1)ANY、SOME、ALL、IN的使用。的使用。可以将可以将ALL或或ANY关键字与比较运算符组合进行子查询。关键字与比较运算符组合进行子查询。SOME的用法与的用法与ANY相同。以相同。以比比较运算符为例:较运算符为例:vALL表示大于每一个值,即大于最大值。例如,表示大于每一个值,即大于最大值。例如,ALL(5,2,3)表示大于表示大于5。因此,使用。因此,使用ALL的子查询也可用的子查询也可用MAX集函数实现。集函数实现。vANY表示至少大于一个值,即大于最小值。例如,表示至少大于一个值,即大于最小值。例如,ANY(7,2,3)表示大于表示大于2。因此,使用。因此,使用ANY的子查询也可用的子查询也可用MIN集函数实现。集函数实现。v=ANY运算符与运算符与IN等效。等效。vALL与与NOTIN等效。等效。第32页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式【例例5.10】查询成绩高于查询成绩高于“林一帆林一帆”最高成绩的学生姓名、课程名及成绩。最高成绩的学生姓名、课程名及成绩。USEPXSCJGOSELECT姓名姓名,课程名课程名,成绩成绩FROMXSB,CJB,KCBWHERE成绩成绩ALL(SELECTb.成绩成绩FROMXSBa,CJBbWHEREa.学号学号=b.学号学号ANDa.姓名姓名=林一帆林一帆)ANDXSB.学号学号=CJB.学号学号ANDKCB.课程号课程号=CJB.课程号课程号AND姓名姓名林一帆林一帆第33页,共142页,编辑于2022年,星期一5.1.5运算符与表达式运算符与表达式(2)BETWEEN的使用。的使用。语法格式:语法格式:test_expressionNOTBETWEENbegin_expressionANDend_expression如果如果test_expression的值大于或等于的值大于或等于begin_expression的值并且小于或等于的值并且小于或等于end_expression的的值,则运算结果为值,则运算结果为TRUE,否则为,否则为FALSE。test_expression为测试表达式,为测试表达式,begin_expression和和end_expression指定测试范围,三个表达式的类型必须相同。指定测试范围,三个表达式的类型必须相同。NOT关键字表示对谓词关键字表示对谓词BETWEEN的运算结果取反。的运算结果取反。【例例5.11】查询总学分在查询总学分在4050之间的学生学号和姓名。之间的学生学号和姓名。SELECT学号学号,姓名姓名,总学分总学分FROMXSBWHERE总学分总学分BETWEEN40AND50使用使用=和和=40AND总学分总学分,=,=,!=,!,!b。若表达式的结果是由不同类型数据组成的一行值,则这种表达式叫做行表达式。例如,(学若表达式的结果是由不同类型数据组成的一行值,则这种表达式叫做行表达式。例如,(学号,号,王林王林,计算机计算机,50*10);当学号列的值为);当学号列的值为081101时,这个行表达式的值就为(时,这个行表达式的值就为(081101,王王林林,计算机计算机,500)。)。若表达式的结果为若表达式的结果为0个、个、1个或多个行表达式的集合,那么这个表达式就叫做表表达式。个或多个行表达式的集合,那么这个表达式就叫做表表达式。表达式一般用在表达式一般用在SELECT以及以及SELECT语句的语句的WHERE子句中。子句中。第40页,共142页,编辑于2022年,星期一5.1.6系统内置函数系统内置函数v1行集函数行集函数行集函数是返回值为对象的函数,该对象可在行集函数是返回值为对象的函数,该对象可在T-SQL语句中作为表引用。所有行集函数都是非确语句中作为表引用。所有行集函数都是非确定性的,即每次用一组特定参数调用它们时,所返回的结果不总是相同的。定性的,即每次用一组特定参数调用它们时,所返回的结果不总是相同的。SQLServer2008主要提供了如下行集函数:主要提供了如下行集函数:(1)CONTAINSTABLE:对于基于字符类型的列,按照一定的搜索条件进行精确或模糊匹配,:对于基于字符类型的列,按照一定的搜索条件进行精确或模糊匹配,然后返回一个表,该表可能为空。然后返回一个表,该表可能为空。(2)FREETEXTTABLE:为基于字符类型的列返回一个表,其中的值符合指定文本的含义,:为基于字符类型的列返回一个表,其中的值符合指定文本的含义,但不符合确切的表达方式。但不符合确切的表达方式。(3)OPENDATASOURCE:提供与数据源的连接。:提供与数据源的连接。(4)OPENQUERY:在指定数据源上执行查询。可以在查询的:在指定数据源上执行查询。可以在查询的FROM子句中像引用基本表一样子句中像引用基本表一样引用引用OPENQUERY函数,虽然查询可能返回多个记录,但函数,虽然查询可能返回多个记录,但OPENQUERY只返回第一个记录。只返回第一个记录。(5)OPENROWSET:包含访问:包含访问OLEDB数据源中远程数据所需的全部连接信息。可在查询数据源中远程数据所需的全部连接信息。可在查询的的FROM子句中像引用基本表一样引用子句中像引用基本表一样引用OPENROWSET函数,虽然查询可能返回多个记录,但函数,虽然查询可能返回多个记录,但OPENROWSET只返回第一个记录。只返回第一个记录。(6)OPENXML函数:通过函数:通过XML文档提供行集视图。文档提供行集视图。第41页,共142页,编辑于2022年,星期一5.1.6系统内置函数介绍系统内置函数介绍v2聚合函数聚合函数聚合函数对一组值操作,返回单一的汇总值。聚合函数在以下聚合函数对一组值操作,返回单一的汇总值。聚合函数在以下情况下,允许作为表达式使用:情况下,允许作为表达式使用:(1)SELECT语句的选择列表(子查询或外部查询)。语句的选择列表(子查询或外部查询)。(2)COMPUTE或或COMPUTEBY子句。子句。(3)HAVING子句。子句。T-SQL语言提供的常用聚合函数的应用请参考第语言提供的常用聚合函数的应用请参考第4章相关内容。章相关内容。第42页,共142页,编辑于2022年,星期一v3标量函数标量函数标量函数的特点:输入参数的类型为基本类型,返回值也为基本类型。标量函数的特点:输入参数的类型为基本类型,返回值也为基本类型。SQLServer包含包含如下几类标量函数:如下几类标量函数:(1)配置函数;)配置函数;(2)系统函数;)系统函数;(3)系统统计函数;)系统统计函数;(4)数学函数;)数学函数;(5)字符串函数;)字符串函数;(6)日期和时间函数;)日期和时间函数;(7)游标函数;)游标函数;(8)文本和图像函数;)文本和图像函数;(9)元数据函数;)元数据函数;(10)安全函数。)安全函数。5.1.6系统内置函数介绍系统内置函数介绍第43页,共142页,编辑于2022年,星期一5.1.6常用系统标量函数常用系统标量函数v1配置函数配置函数配置函数用于返回当前配置选项设置的信息。全局变量是以函数形式使用的,配置函数一般都是配置函数用于返回当前配置选项设置的信息。全局变量是以函数形式使用的,配置函数一般都是全局变量名,详细介绍请参见附录全局变量名,详细介绍请参见附录B。v2数学函数数学函数数学函数可对数学函数可对SQLServer提供的数字数据(提供的数字数据(decimal、integer、float、real、money、smallmoney、smallint和和tinyint)进行数学运算并返回运算结果。在默认情况下,对)进行数学运算并返回运算结果。在默认情况下,对float数据类型数据的内置运算的精度为数据类型数据的内置运算的精度为6个小数位。个小数位。下面给出几个例子说明数学函数的使用,其他的数学函数请参考附录下面给出几个例子说明数学函数的使用,其他的数学函数请参考附录B。(1)ABS函数。语法格式:函数。语法格式:ABS(numeric_expression)返回给定数字表达式的绝对值。参数返回给定数字表达式的绝对值。参数numeric_expression为数字型表达式(为数字型表达式(bit数据类型除数据类型除外),返回值类型与外),返回值类型与numeric_expression相同。相同。【例例5.23】显示显示ABS函数对三个不同数字的效果。函数对三个不同数字的效果。SELECTABS(-5.0),ABS(0.0),ABS(8.0)运行结果如下:运行结果如下:第44页,共142页,编辑于2022年,星期一(2)RAND函数。语法格式:函数。语法格式:RAND(seed)返回返回01之间的一个随机值。参数之间的一个随机值。参数seed是指定种子值的整型表达式,返回值类型为是指定种子值的整型表达式,返回值类型为float。如果未指定如果未指定seed,则随机分配种子值。对于指定的种子值,返回的结果始终相同。,则随机分配种子值。对于指定的种子值,返回的结果始终相同。【例例5.24】以下程序通过以下程序通过RAND函数返回随机值。函数返回随机值。DECLAREcountintSETcount=5SELECTRAND(count)5.1.6系统内置函数介绍系统内置函数介绍第45页,共142页,编辑于2022年,星期一v3字符串处理函数字符串处理函数字符串函数用于对字符串进行处理。在此介绍一些常用的字符串处理函数,其他的字符串字符串函数用于对字符串进行处理。在此介绍一些常用的字符串处理函数,其他的字符串处理函数请参考附录处理函数请参考附录B。(1)ASCII函数。语法格式:函数。语法格式:ASCII(character_expression)返回字符表达式最左端字符的返回字符表达式最左端字符的ASCII值。参数值。参数character_expression的类型为字符型的的类型为字符型的表达式,返回值为整型。表达式,返回值为整型。【例例5.25】查找字符串查找字符串sql最左端字符的最左端字符的ASCII值。值。SELECTASCII(sql)执行结果如下:执行结果如下:5.1.6系统内置函数介绍系统内置函数介绍第46页,共142页,编辑于2022年,星期一(2)CHAR函数。语法格式:函数。语法格式:CHAR(integer_expression)将将ASCII码转换为字符。码转换为字符。integer_expression为介于为介于0255之间的整数,返回值为字符型。之间的整数,返回值为字符型。(3)LEFT函数。语法格式:函数。语法格式:LEFT(character_expression,int