数据库技术及应用(SQL Server )2.7_第1页
数据库技术及应用(SQL Server )2.7_第2页
数据库技术及应用(SQL Server )2.7_第3页
数据库技术及应用(SQL Server )2.7_第4页
数据库技术及应用(SQL Server )2.7_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库技术及应用(SQLServer)教学单元2.7第9章

T-SQL编程基础T-SQL编程基础学习导航2T-SQL编程基础知识框架3单元2.7T-SQL编程基础能力目标能够正确应用T-SQL的表达式能够正确应用T-SQL的程序控制语句能够根据数据库应用系统的功能需求编写简单的T-SQL程序能够阅读并熟练书写常用数据类型、函数和控制语句(英文)4单元2.7T-SQL编程基础知识目标T-SQL基础(有效标识符、数据类型、注释)表达式(常量、变量、函数、运算符、小括号)流程控制语句(顺序、分支、循环)CASE多分支表达式素质目标养成严谨、严格的软件编程职业习惯进一步加强自主学习的能力弘扬中国计算机科学家艰苦卓绝的奋斗精神,树立良好的作风和学风。*拓展阅读9-1中国计算机软件系统的开创者5打好数据库编程的基础表达式应用训练流程控制语句训练工作任务单元2.7T-SQL编程基础6单元2.7T-SQL编程基础7T-SQL基础一表达式二流程控制语句三批处理四事务五一、T-SQL基础8常见的对象(除数据库对象)标识符服务器实例、数据类型、变量、参数和函数等命名规则和数据库对象的命名规则相同特殊符号开头的标识符“@”开头:局部变量或是函数的参数“@@”开头:全局变量“#”开头:临时表或是一个存储过程“##”开头:全局的临时数据库对象。1.有效标识符一、T-SQL基础9多行注释:“/*”和“*/”括起来可以连续书写多行的注释语句例如:/*设置读者编号RID为外键,删除主键表行时级联删除从表相应行*/单行注释:“--”表示单行书写注释语句例如:--声明局部变量2.注释一、T-SQL基础10数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。在T-SQL中,表和视图的列、局部变量、函数的参数和返回值、存储过程的参数和返回值(具有返回代码)和表达式等都具有相关的数据类型。3.数据类型一、T-SQL基础11系统数据类型T-SQL常用的系统数据类型有常用的有bit、int、decimal[(p[,s])]、float[(n)]、datetime2、date、time、char[(n)]、nchar[(n)]、binary[(n)]和table等。(前有介绍)3.数据类型-系统一、T-SQL基础12用户定义数据类型以基本数据类型为基础创建的别名数据类型,它提供一种更能清楚地说明对象中值类型的名称并将其应用于数据类型的机制。3.数据类型-用户定义一、T-SQL编程基础13【例9-1】为数据库“EDUC”定义一个基于char型的数据类型“StudentID”,用于说明表中学号列的数据类型。在【对象资源管理器】窗口中:展开“EDUC”→“可编程性”节点,右击“类型”节点,从快捷菜单中选择“新建”→“用户定义数据类型”命令,打开【新建用户定义数据类型】窗口3.数据类型-用户定义一、T-SQL基础14在【新建用户定义数据类型】窗口中:输入类型名称、数据类型等3.数据类型-用户定义一、T-SQL基础15在【对象资源管理器】窗口中:展开数据库下的“用户定义类型节点”3.数据类型-查看用户定义类型一、T-SQL基础16在定义数据库表“Student”或“SC”时,可以用自定义数据类型“StudentID”指明学号“SID”的数据类型,3.数据类型-应用用户定义类型一、T-SQL基础17在变量声明中也可以应用用户自定义类型来定义内存变量的类型的数据类型例:USEEDUCGODECLARE@StuIDStudentID3.数据类型-应用用户定义类型单元2.7T-SQL编程基础18T-SQL编程基础一表达式二流程控制语句三批处理四事务五

二、表达式19常量1变量2日期和时间类型表达式3内置函数4运算符5(一)常量20常量:也称为文字值或标量值,是表示一个特定数据值的符号常量的格式取决于它所表示值的数据类型日期型常量说明:使用SETDATEFORMAT或SETLANGUAGE指定日期和时间常量的格式,注意这两种设置方法只是影响如何把字符串转换为DATETIME类型的值,并不影响其显示形式SETDATEFORMATymd之后,常量’2024/3/243:00PM'合法SETLANGUAGEus_english之后,常量'24March20243:00PM'合法什么是常量(一)常量21常用数据类型的常量表现形式数据类型常量举例bit数字0或1,非0的数字转换为1,字符串'True'转换为1,字符串'False'转换为0int1278、256、23decimal[(p

[,s])]如有定义decimal(5,2),相应常量可为123.45、123.40、1.23、123.00、-123.45等float[(n)]如有定义float(1),相应常量可为5.97237E24、1E-9等date'20240228'、'2024-02-28'、'28February2024'、'02/28/2024'time'14:30:26'、'10:00:00.123'datetime2'2024-02-2814:30:26'datetimeoffset'2024-02-2814:30:26+08:00',表示比协调世界时UTC早8小时(一)常量22常用数据类型的常量表现形式数据类型常量举例char[(n)]varchar[(n|max)]'abc'、'123'、'2

*

6';使用两个单引号表示嵌入的单引号,如I'mastudent.的常量表示为'I''mastudent.'nchar[(n)]

nvarchar[(n|max)]N'数据库技术'uniqueidentifier'FF19966F-868B-11D0-B42D-00C04FC964FF'

0x6F9619FF8B86D011B42D00C04FC96-4FF(二)变量23变量是指在程序运行过程中其值可以改变的量。T-SQL的变量有局部变量和全局变量之分。什么是变量(二)变量24局部变量:局部变量是用户定义的变量,其作用范围仅在程序内部。在程序中通常用来存储从表中查询到的数据或暂存程序执行过程中的数据。变量声明:语法:

DECLARE{@变量名数据类型}[,...n]1.局部变量(

DECLARE声明)(二)变量25说明:变量名必须以@开头,先用DECLARE声明之后才能使用。用DECLARE命令声明之后,所有的变量都被赋予初值NULL。数据类型可以是系统提供的类型、用户定义类型或别名数据类型。变量不能是varchar(MAX)或varbinary(MAX)等数据类型。1.局部变量(

DECLARE声明)(二)变量26SELECT赋值语句:语法:SELECT

{@变量名=表达式}[,...n]说明:

用SELECT命令可以一次给多个变量赋值。当表达式为表的列名时,可使用子查询功能从表中一次返回多个值,而赋值给变量的是其返回的最后一个值。如果子查询没有返回值,则变量被设为NULL。1.局部变量(SELECT赋值)(二)变量27【例9-2】声明一个变长字符型变量@var1,用SELECT赋值语句为它赋予从表“Reader”中查询出编号为'2003216008'的读者姓名,再用SELECT输出语句输出变量@var1的值。代码:USELibraryDECLARE@var1varchar(8)--声明变长字符型局部变量SELECT@var1=Rname

FROMReaderWHERERID='2003216008'--将子查询的结果赋值给局部变量SELECT@var1AS'读者姓名'--显示局部变量结果1.局部变量(SELECT赋值)(二)变量28代码:USELibraryDECLARE@var1varchar(8)--声明变长字符型局部变量SELECT@var1=Rname

FROMReaderWHERERID='2003216008'--将子查询的结果赋值给局部变量SELECT@var1AS'读者姓名'--显示局部变量结果执行结果:1.局部变量(SELECT赋值)(二)变量29【例9-3】用SELECT语句赋值时,在多个返回值中取最后一个。代码:USELibraryDECLARE@var1varchar(8) --声明变长字符型局部变量--将子查询的结果赋值给局部变量SELECT@var1=RnameFROMReader --或:

@var1=(SELECTRnameFROMReader)SELECT@var1AS'读者姓名'--显示局部变量的结果1.局部变量(SELECT赋值)(二)变量30代码:USELibraryDECLARE@var1varchar(8) --声明变长字符型局部变量--将子查询的结果赋值给局部变量SELECT@var1=RnameFROMReader --或:

@var1=(SELECTRnameFROMReader)SELECT@var1AS'读者姓名'--显示局部变量的结果执行结果:1.局部变量(SELECT赋值)(二)变量31SET赋值语句:语法:

SET@变量名=表达式说明:SET赋值语句只能给一个变量赋值。子查询必须是括号括起来的完整SELECT查询语句。1.局部变量(SET赋值)(二)变量32【例9-4】用SET赋值语句为局部变量@no赋值,再用SELECT查询语句查询出读者表中读者号为@no的读者信息。代码:USELibraryDECLARE@nochar(10)--声明变长字符型局部变量SET@no='2004060003' --局部变量赋值SELECTRID,Rname --查询语句FROMReaderWHERERID=@no--查询中引用局部变量1.局部变量(SET赋值)(二)变量33代码:USELibraryDECLARE@nochar(10)--声明变长字符型局部变量SET@no='2004060003' --局部变量赋值SELECTRID,Rname --查询语句FROMReaderWHERERID=@no--查询中引用局部变量查询结果:1.局部变量(SET赋值)(二)变量34【例9-5】用SET赋值语句将学生表“Student”统计查询出的学生总数赋值给局部变量@count,并用SELECT语句输出。代码:USEEDUCGODECLARE@countint--声明整型局部变量--将子查询的结果赋值给局部变量SET@count=(SELECTCOUNT(*)FROMStudent)SELECT@countAS学生总数1.局部变量(SET赋值)(二)变量35代码:USEEDUCGODECLARE@countint--声明整型局部变量--将子查询的结果赋值给局部变量SET@count=(SELECTCOUNT(*)FROMStudent)SELECT@countAS学生总数执行结果:1.局部变量(SET赋值)(二)变量36赋值语句比较SET@count=(SELECTCOUNT(*)FROMStudent)SELECT@var1=RnameFROMReader一般选择约定当执行一个简单的变量赋值时,使用SET赋值语句。当基于查询进行变量赋值时,使用SELECT赋值语句。局部变量赋值语句比较(二)变量37全局变量:全局变量是SQLServer系统提供并赋值的变量。用户不能建立全局变量,也不能用SET赋值语句和SELECT赋值语句修改全局变量的值。通常可以将全局变量的值赋给局部变量,以便保存和处理。全局变量以@@开头,例如,全局变量@@servername提供服务器名,全局变量@@version提供SQLServer的版本信息。2.全局变量(二)变量38【例9-6】显示SQLServer的版本。代码:SELECT@@version执行结果:2.全局变量(三)日期和时间类型表达式39ISO8601国际标准格式:YYYY-MM-DDThh:mm:ss[.mmm]YYYY、MM、DD在字符串中分别表示四位数字的年、两位数字的月和两位数字日,日期之间也可以省略字符“-”。T表示之后为时间,hh为两位数字小时,mm为两位数字分钟,ss为两位数字秒和mmm三位数字的毫秒。

例如:2024-03-23、20240323和2024-03-23T21:25:10.487SQLServer日期时间数据类型值的存储与显示均为“-”号间隔国际标准日期时间格式不受SETDATEFORMAT或

SETLANGUAGE

设置的影响,始终有效建议设计者尽量使用此格式1.国际标准日期和时间格式(三)日期和时间类型表达式40年月日之间也可以使用“/”、“-”或“.”作为分隔符,以满足各个国家日期表达习惯的之需。特殊日期格式的设置SETDATEFORMATformat|@format_var功能:用于解释

date、datetime2

和datetimeoffset

等类型的字符格式字符串“年、月、日”在日期部分的顺序。如果顺序和设置不匹配,这些值将由于超出范围而不会被解释为日期,或者被错误地解释。不影响存储在数据库中的日期数据类型值的显示,也不影响存储格式。2.日期的有效格式说明参数format|@format_var为日期部分的顺序有效字符串为:mdy、dmy、ymd、ydm、myd和dym(三)日期和时间类型表达式41【例9-7】各种日期字符格式字符串的有效格式设置。DECLARE@OLDTimedate --声明日期型变量SETDATEFORMATdmy --设置日月年顺序SELECT@OLDTime=’23/3/2024' --日月年有效日期字符串SELECT’23/3/2024’ASdmy,@OLDTimeAS‘输出格式‘--输出常量变量SETDATEFORMATmdy --设置月日年顺序SELECT@OLDTime='3.23.2024' --月日年有效日期字符串SELECT‘3.23.2012’ASmdy,@OLDTimeAS‘输出格式’--输出常量变量SETDATEFORMATdym --设置日年月顺序SELECT@OLDTime='23/2024/3' --日年月有效日期字符串SELECT‘23/2024/3’ASdym,@OLDTimeAS‘输出格式’--输出常量变量SELECT@OLDTime=‘2024-3-23’--ISO8601有效日期,不受设置影响SELECT‘2024-3-23’AS‘ISO8601’,@OLDTimeAS‘输出格式‘--输出2.日期的有效格式(三)日期和时间类型表达式42会话语言环境设置:SETLANGUAGE[N]'language'|@language_var功能:指定会话的语言环境。会话语言确定日期格式和系统消息,并隐式设置

SETDATEFORMAT

的设置。说明:参数[N]'language'|@language_var是存储在系统中的语言的名称,[N]表示可以使用Unicode的语言。可通过执行sp_helplanguage命令查看各国的语言的信息。3.会话的语言环境设置(三)日期和时间类型表达式43【例9-8】会话中日期语言环境设置。DECLARE@TodayDATESET@Today=‘2024/5/23'SETLANGUAGEItalianSELECTDATENAME(WEEKDAY,@Today)AS'意大利星期'SETLANGUAGEus_englishSELECTDATENAME(WEEKDAY,@Today)AS'英文星期'SETLANGUAGE简体中文SELECTDATENAME(WEEKDAY,@Today)AS'中文星期’3.会话的语言环境设置(四)内置函数44常用聚合函数:COUNT、SUM、AVG、MAX和MIN其他9种:计算标准偏差(STDEV)、方差(VAR)等【例9-9】计算学生表中入学录取成绩的平均分和标准偏差(一种量度数据分布的分散程度之标准,用以衡量数据值偏离算术平均值的程度)。1.聚合函数(列函数)(四)内置函数45代码:USEEDUCGOSELECTAVG(AScores)AS平均分,STDEV(AScores)AS标准偏差FROMStudent执行结果:说明:从统计学的角度来看,在平均分数相同的情况下,标准偏差越大说明学生之间的录取分数差距越大。1.聚合函数(列函数)(四)内置函数462.日期和时间函数——日期元素日期元素缩

写含

义日期元素缩

写含

义yearYYYY年quarterQQ季度数monthMM月hourHH时dayDD日minuteMI分dayofyearDY年的天数secondSS秒weekWK星期数millisecondMS毫秒weekdayDW星期几microsecondMCS微秒(四)内置函数47【例9-10】DATEADD(日期元素,数值,日期)函数可按照“日期元素”给定的日期单位,返回“日期”加上“数值”的新日期。代码:SETLANGUAGEus_english--设置英文语言环境GODECLARE@OLDTimedatetime2--声明日期和时间局部变量SET@OLDTime=‘23March20243:00PM'--局部变量赋值SELECTDATEADD(HH,4,@OldTime)AS'4小时后'执行结果:2.日期和时间函数——DATEADD(四)内置函数48【例9-11】DATEDIFF(日期元素,日期1,日期2)函数返回两个日期间的差值并将其转换为指定日期元素的形式。代码:DECLARE@FirstTimedate,@SecondTimedate--声明类型SET@FirstTime=‘2024-3-23'SET@SecondTime=‘2024-7-27'SELECTDATEDIFF(DD,@FirstTime,@SecondTime)

天数--输出两日期之间相差天数DD的函数值执行结果:2.日期和时间函数——DATEDIFF(四)内置函数49【例9-12】

DATENAME(日期元素,日期)

函数以字符串的形式返回指定时间的星期名称。

代码:SETLANGUAGEus_englishDECLARE@StatementDatedate SET@StatementDate=‘2024-7-27'SELECTDATENAME(DW,@StatementDate)AS'WEEKDAY'--日期的星期名称函数值执行结果:2.日期和时间函数——DATENAME(四)内置函数50【例9-13】DATEPART(日期元素,日期)

函数返回日期元素指定的日期部分的整数。代码:DECLARE@WhatsTheDaydate SET@WhatsTheDay=‘2024/10/01'SELECTCAST(DATEPART(yyyy,@WhatsTheDay)ASchar(4))+'年'+CAST(DATEPART(mm,@WhatsTheDay)ASchar(2))+'月'+CAST(DATEPART(dd,@WhatsTheDay)ASvarchar(2))+'日'AS'国庆节'执行结果:2.日期和时间函数——DATEPART(四)内置函数51【例9-14】

GETDATE()

函数返回当前日期。YEAR(日期)、MONTH(日期)和DAY(日期)

函数返回日期的年、月及天数。假设系统当前日期为2023年2月7日。

代码:SELECTGETDATE()AS当前日期, --返回当前日期YEAR(GETDATE())AS年, --取当前日期的年MONTH(GETDATE())AS月, --取当前日期的月DAY(GETDATE())AS日 --取当前日期的天数执行结果:2.日期和时间函数——GETDATE(四)内置函数52【例9-15】

ASCII(字符表达式)

函数可返回字符表达式中最左侧字符的ASCII码值。

代码:DECLARE@StringTestintSET@StringTest=ASCII('Robin') --取字符'R'的ASCII码SELECT@StringTest执行结果:3.字符串函数——ASCII(四)内置函数53【例9-16】CHAR(整型表达式)函数将整型的ASCII码转换为字符。代码:DECLARE@StringTestintSET@StringTest=ASCII('Robin') --取字符'R'的ASCII码SELECTCHAR(@StringTest)--输出ASCII码值对应的字符'R'执行结果:3.字符串函数——CHAR(四)内置函数54【例9-17】

LEFT(字符表达式,整型表达式)

函数返回字符串中从左边开始的指定个数的字符。假设某图书的国际标准书号ISBN为:978-7-115-19345-9,取前三位表示是图书。代码:DECLARE@StringTestchar(17)--声明定长字符型的变量SET@StringTest='978-7-115-19345-2'SELECTLEFT(@StringTest,3)AS'图书类型'

--函数返回左边三位字符执行结果:3.字符串函数——LEFT(四)内置函数55【例9-18】

RIGHT(字符表达式,整型表达式)

函数返回字符串从右边开始的指定个数的字符。假设某图书的国际标准书号ISBN为:978-7-115-19345-9,取最右一位校验码。

代码:DECLARE@StringTestchar(17)--声明定长字符型的变量SET@StringTest='978-7-115-19345-9'SELECTRIGHT(@StringTest,1)AS‘校验码’--函数返回右边一位字符执行结果:3.字符串函数——RIGHT(四)内置函数56【例9-19】

SUBSTRING(字符表达式,起始点,n)

函数返回字符表达式中从“起始点”开始的n个字符。假设某图书的国际标准书号ISBN为:978-7-115-19345-9,从第七位取三位字符表示出版社编号。

代码:DECLARE@StringTestchar(17)--声明定长字符型的变量SET@StringTest='978-7-115-19345-9'SELECTSUBSTRING(@StringTest,7,3)AS'出版社编号' --函数返回第七位开始的三个字符执行结果:3.字符串函数——SUBSTRING(四)内置函数57【例9-20】

RTRIM(字符表达式)

函数截断所有尾部空格后返回一个字符串。

代码:DECLARE@StringTestchar(10)--声明定长字符型变量SET@StringTest='Robin'--当字符串不够10个的时候,后面自动添加空格SELECT@StringTest+'-End'AS'未截空格',

RTRIM(@StringTest)+'-End'AS'截尾空格' 执行结果:3.字符串函数——RTRIM(四)内置函数58【例9-21】LTRIM(字符表达式)

函数返回删除了前导空格字符后的字符表达式。

代码:DECLARE@StringTestchar(10)--声明定长字符类型变量SET@StringTest='Robin'SELECT'Start-'+@StringTestAS'未截空格','Start-'+LTRIM(@StringTest)AS'删前导空格'执行结果:3.字符串函数——LTRIM(四)内置函数59【例9-22】

STR(浮点表达式[,长度[,小数]])函数返回由数字数据转换来的字符数据。代码:SELECT985.0/6AS数值,--输出浮点小数STR(985.0/6,6,2)AS字符串

--函数返回6个字符宽度,2位小数的字符串执行结果:3.字符串函数——STR(四)内置函数60【例9-23】

LOWER(字符表达式)函数将字符表达式中的大写字母转换为小写字母。代码:DECLARE@StringTestchar(10)SET@StringTest='DATETIME2'SELECTLOWER(LEFT(@StringTest,4))AS小写

--函数返回小写字母字符串执行结果:3.字符串函数——LOWER(四)内置函数61【例9-24】

UPPER(字符表达式)

函数将字符表达式中的小写字符转换为大写字符。代码:DECLARE@StringTestchar(10)SET@StringTest='select'SELECTUPPER(@StringTest)AS大写

--函数返回大写字符串

执行结果:3.字符串函数——UPPER(四)内置函数62【例9-25】

LEN(字符表达式)

函数返回某个指定字符串的长度,不计字符串后的空格。代码:DECLARE@StringTestchar(10)SET@StringTest='SQLServer‘--注意不计后面的空格SELECTLEN(@StringTest)AS字符串长度

--函数返回字符串长度

执行结果:3.字符串函数——LEN(四)内置函数63【例9-25】

LEN(字符表达式)

函数返回某个指定字符串的长度,不计字符串后的空格。代码:DECLARE@StringTestchar(12)SET@StringTest='数据库技术!'--注意汉字的长度SELECTLEN(@StringTest)AS字符串长度

--函数返回字符串长度

执行结果:3.字符串函数——LEN(四)内置函数64【例9-26】

CAST(表达式AS数据类型)函数将表达式的类型转换为指定的数据类型。

代码:DECLARE@StringTestnchar(6),@IntTestintSET@StringTest='数据库成绩:'SET@IntTest=90SELECT@StringTest+CAST(@IntTestASchar(4))AS考试成绩--整型转换为字符型

执行结果:4.数据类型转换函数——CAST(四)内置函数65【例9-27】

CONVERT(数据类型(长度),表达式)函数将表达式的类型转换为指定的数据类型。

代码:DECLARE@StringTestnchar(6),@IntTestintSET@StringTest='数据库成绩:'SET@IntTest=90SELECT@StringTest+CONVERT(char(4),@IntTest)AS考试成绩--整型转换为字符型

执行结果:4.数据类型转换函数——CONVERT(四)内置函数66【例9-28】ISNULL(空值,指定的值)函数为空值置换函数,可以用指定的值代替空值。

代码:USELibrary--如果Lendnum为NULL,则ISNULL(Lendnum,0)的值为0SELECT*,ISNULL(Lendnum,0)AS空值置换FROMReader

执行结果:5.其他内置函数——ISNULL(四)内置函数67用户定义函数是数据库对象,可以像系统函数一样,在查询或存储过程等程序段中使用,也可以像存储过程一样通过EXECUTE命令来执行。详细内容参见教材第10章。6.用户定义函数(五)运算符68T-SQL的运算符优

级运算符类别所包含运算符1一元运算符+(正)、−(负)、~(取反)2算术运算符*(乘)、/(除)、%(取模)3算术字符串运算符+(加)、−(减)、+(连接)4比较运算符=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、<>(或!=,不等于)、!<(不小于)、!>(不大于)5位运算符&(位与)、|(位或)、^(位异或)6逻辑运算符NOT(非)7逻辑运算符AND(与)8逻辑运算符ALL(所有)、ANY(任意一个)、BETWEEN(两者之间)、EXISTS(存在)、IN(在范围内)、LIKE(匹配)、OR(或)、SOME(任意一个)9赋值运算符=(赋值)单元2.7T-SQL编程与应用69T-SQL编程基础一表达式二流程控制语句三批处理四事务五

三、流程控制语句70顺序语句1IF...ELSE分支语句2WHILE循环语句3其他控制语句4CASE多分支表达式5(一)顺序语句71功能:局部变量赋值设定用户执行T-SQL命令时的处理选项SET选项ON:选项开关打开。SET选项OFF:选项开关关闭。SET选项值:设定选项的具体值。1.SET语句(一)顺序语句72例如:--阻止返回可显示受T-SQL语句影响的行数的消息SETNOCOUNT{ON|OFF}--将日期格式设置为年月日格式SETDATEFORMATymd--ChangedlanguagesettingSETLANGUAGEus_englishtous_English--將語言設定變更為繁體中文SETLANGUAGE繁體中文--将语言设定变更为简体中文SETLANGUAGE简体中文1.SET语句(一)顺序语句73语法:SELECT表达式[,...n]2.SELECT输出语句(一)顺序语句74语法:PRINT表达式3.PRINT输出语句三、流程控制语句75顺序语句1IF...ELSE分支语句2WHILE循环语句3其他控制语句4CASE多分支表达式5(二)IF…ELSE分支语句76语法:IF逻辑表达式

<T-SQL语句|语句块>/*逻辑表达式为真时执行*/[ELSE<T-SQL语句|语句块>] /*逻辑表达式为假时执行*/功能:

IF…ELSE用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。说明:“逻辑表达式”可以是各种表达式的组合,但表达式的值必须是逻辑值真或假。ELSE子句任选。IF…ELSE(二)IF…ELSE分支语句77语句块语法:BEGINT-SQL语句 /*语句块*/END说明BEGIN...END语句块允许嵌套。IF…ELSE(二)IF…ELSE分支语句78【例9-29】用IF…ELSE语句查询图书中有没有英语书,如果图书中有英语书,统计其数量,否则显示“没有英语书”。代码:USELibraryGO/*如果图书中有英语书,统计其数量,否则显示没有英语书*/IFEXISTS(SELECT*FROMBookWHEREBnameLIKE'%英语%')SELECTCOUNT(*)AS英语图书数量FROMBookWHEREBnameLIKE'%英语%'ELSEPRINT'没有英语书'IF…ELSE(二)IF…ELSE分支语句79【例9-30】用IF...ELSE语句的嵌套结构进行图书查询。查询图书中有没有英语书,有则统计其册数,否则查询有没有SQLServer2008方面的图书,有则统计其册数。代码:USELibraryGOIF…ELSE(二)IF…ELSE分支语句80IFEXISTS(SELECT*FROMBookWHEREBnameLIKE'%英语%')SELECTCOUNT(*)AS英语图书数量FROMBookWHEREBnameLIKE'%英语%'ELSEIFEXISTS(SELECT*FROMBookWHEREBnameLIKE'%SQLServer2008%')SELECTCOUNT(*)ASSQLServer2008图书数量FROMBookWHEREBnameLIKE'%SQLServer2008%'ELSEPRINT'英语和SQLServer2008两种书都没有!‘执行结果:IF…ELSE(二)IF…ELSE分支语句81【例9-31】

BEGIN…END语句在图书查询中的应用。代码:DECLARE@ebookint,@cbookintIFEXISTS(SELECT*FROMBookWHEREBnamelike'%英语%')BEGINSELECT@ebook=COUNT(*)FROMBookWHEREBnameLIKE'%英语%'PRINT'英语书数量'+RTRIM(CAST(@ebookASchar(4)))+'册'ENDELSEPRINT'英语书没有!’BEGIN…END(二)IF…ELSE分支语句82【例9-31】

BEGIN…END语句在图书查询中的应用。代码:IFEXISTS(SELECT*FROMBookWHEREBnameLIKE'%SQLServer2008%')BEGINSELECT@cbook=COUNT(*)FROMBookWHEREBnameLIKE'%SQLServer2008%'PRINT'SQLServer2008的书'+RTRIM(CAST(@cbookASchar(4)))+'册。'ENDELSEPRINT'SQLServer2008书没有!‘执行结果:BEGIN…END三、流程控制语句83顺序语句1IF...ELSE分支语句2WHILE循环语句3其他控制语句4CASE多分支表达式5(三)WHILE循环语句84语法:WHILE<逻辑表达式>BEGIN<T-SQL语句或语句块>[BREAK] /*退出此循环语句的执行*/[CONTINUE] /*结束一次循环体的执行*/END功能:WHILE命令在设定的条件为真时会重复执行命令行或程序块,除非遇到逻辑表达式为假或遇到BREAK语句才跳出循环。CONTINUE命令可以让程序跳过CONTINUE命令之后的语句,回到WHILE循环的第一行命令。BREAK命令则让程序无条件跳出循环,结束WHILE命令的执行。WHILE(三)WHILE循环语句85【例9-32】一个简单的循环程序。代码:DECLARE@xintSET@x=0WHILE@x<3 --当@x>=3时终止循环BEGINSET@x=@x+1PRINT'x='+CONVERT(char(1),@x)--类型转换函数CONVERTEND执行结果:x=1x=2x=3WHILE

三、流程控制语句86顺序语句1IF...ELSE分支语句2WHILE循环语句3其他控制语句4CASE多分支表达式5(四)其他控制语句87语法:GOTOlabel功能:将执行语句无条件跳转到标签处,并从标签位置继续处理1.GOTO语句(四)其他控制语句88语法:WAITFORDELAY<延时时间> /*设定等待时间*/|TIME<到达时刻> /*设定等待到某一时刻*/

功能:暂停程序执行,直到所设定的等待时间已过或所设定的时间已到才继续往下执行。说明:时间为TIME类型的数据,如“11:46:18”,但不能包括日期。各关键字含义如下:DELAY:用来设定等待的时间,最多可达24小时。TIME:用来设定等待结束的时间点。2.WAITFOR语句(四)其他控制语句89【例9-33】延迟30秒执行查询。代码:USELibraryGOWAITFORDELAY’00:00:30’SELECT*FROMReader2.WAITFOR语句(四)其他控制语句90【例9-34】在时刻09:25:00执行查询。代码:USELibraryGOWAITFORTIME‘09:26:00'SELECT*FROMReader2.WAITFOR语句(四)其他控制语句91语法:RETURN<整型表达式>

功能:RETURN命令用于结束当前程序的执行,并返回到一个调用它的程序,可指定一个返回值。说明:RETURN的执行是即时且完全的,可在任何时候用于从过程、批处理或语句块中退出,RETURN之后的语句不执行。3.RETURN语句(四)其他控制语句92【例9-35】在以下程序段中,RETURN命令返回@x和@y中较大的值。代码:DECLARE@xint,@yint…IF@x>@y --@x>@y返回@xRETURN@xELSE --否则返回@yRETURN@y3.RETURN语句

三、流程控制语句93顺序语句1IF...ELSE分支语句2WHILE循环语句3其他控制语句4CASE多分支表达式5(五)CASE多分支表达式94语法:CASE输入表达式WHEN<when表达式1>THEN结果表达式1WHEN<when表达式2>THEN结果表达式2…ELSE结果表达式nEND功能:首先计算“输入表达式”,然后将其值依次与“when表达式”的值进行比较,当“输入表达式”的值等于“when表达式”的值时,返回第一个满足条件THEN后的“结果表达式”的值。如果比较运算结果都不为真,则返回ELSE后的表达式的值。如果省略此参数并且比较运算的计算结果都不为真,表达式的值为NULL。1.简单CASE表达式(五)CASE多分支表达式95【例9-36】显示各读者可借书的数量。代码:SELECTRnameAS读者名,rt.TypenameAS读者类型,限借阅量=

CASEr.TypeID--根据TypeID的值得到CASE表达式的返回值WHEN1THEN'可以借6本书!'WHEN2THEN'可以借4本书!'WHEN3THEN'可以借3本书!'ELSE'无规定'ENDFROMReaderr,ReaderTypertWHEREr.TypeID=rt.TypeID1.简单CASE表达式(五)CASE多分支表达式96语法:CASEWHEN逻辑表达式1THEN结果表达式1WHEN逻辑表达式2THEN结果表达式2…ELSE结果表达式nEND功能:依次对每个WHEN子句求逻辑表达式的值,当计算结果为真时,表达式的值为第一个满足条件的THEN结果表达式的值。如果运算结果都不为真,则表达式的值为ELSE后结果表达式的值。如果省略此参数并且比较运算的计算结果都不为真,表达式的值为NULL。2.搜索CASE表达式(五)CASE多分支表达式97【例9-37】显示各读者可借书的数量。代码:USELibraryGOSELECTRname,rt.TypenameAS类型,限借阅量=CASE--根据TypeID的值得到CASE表达式的值WHENr.TypeID=1THEN'可以借6本书!'WHENr.TypeID=2THEN'可以借4本书!'WHENr.TypeID=3THEN'可以借3本书!'ELSE'无规定'ENDFROMReaderr,ReaderTypertWHEREr.TypeID=rt.TypeID2.CASE搜索表达式

单元2.7T-SQL编程与应用98T-SQL编程基础一表达式二流程控制语句三批处理四事务五四、批处理99批处理:一个或多个T-SQL语句组成的,应用程序将这些语句作为一个单元提交给SQLServer,并由SQLServer编译成一个执行计划,然后作为一个整体来执行。批处理结束符:GO注意:GO命令本身并不是一个T-SQL语句。对CREATE等数据库DDL语句均要求不能在批处理中与其他语句组合使用,其批处理必须以CREATE语句开始。例:USELibraryGO--表示上一批结束,此处的GO不能省略CREATETABLEBook--此批以CREATE语句开始1.什么是批处理四、批处理100语法错:批处理在编译过程中出现错误提示信息,则编译失败,这时批处理中的语句均无法执行。运行错:如算术溢出或违反约束,则大多数运行错误将停止执行批处理中的当前语句和它之后的语句,少数运行错误(如违反约束)仅停止执行当前语句,而继续执行批处理中其他语句。但是在遇到运行错误之前执行的语句将不受任何影响。2.批处理中的错误提示四、批处理101【例9-38】批处理中的不同错误的结果对比。代码段1:USELibraryGOUSEEDUCSELECTSID,Sname,SexFORMStudent--此处有FROM的语法错误WHERESex='男'GO2.批处理中的错误提示四、批处理102【例9-38】批处理中的不同错误的结果对比。代码段1:USELibraryGOUSEEDUCSELECTSID,Sname,SexFORMStudent--此处有FROM的语法错误WHERESex='男'GO注意:当前数据库为Library,因为在第二个批处理中出现了语法错误,USEEDUC没有得到执行,而第一个批处理USELibrary得到了执行。2.批处理中的错误提示四、批处理103【例9-39】批处理中的不同错误的结果对比。代码段2:USELibraryGOUSEEDUCSELECTSID,Sname,SexFROMStudent_error--此处有表名不存在的运行错误WHERESex='男'GO2.批处理中的错误提示四、批处理104例39:批处理中的不同错误的结果对比。代码段2:USELibraryGOUSEEDUCSELECTSID,Sname,SexFROMStudent_error--此处有表名不存在的运行错误WHERESex='男'GO注意:当前数据库为EDUC,即第二个批处理得到了部分执行,但在第二句中出现了运行错误,该语句以下的语句不再执行。2.批处理中的错误提示

单元2.7T-SQL编程与应用105T-SQL编程基础一表达式二流程控制语句三批处理四事务五五、事务106事务:指一个单元的工作,这些工作要么全做,要么全不做。作为一个逻辑单元,必须具备以下4个属性。原子性(Atomic):必须执行一个完整的工作。一致性(Consistent):必须使所有数据都具有一致的状态。独立性(Isolated):并行事务的修改必须与其他并行事务的修改相互独立。持久性(Durable):事务完成之后,它的影响永久性地存在于系统中,也就是把这种修改写到了数据库中。1.什么是事务五、事务107语法:BEGINTRANSACTION[事务名|事务变量名]WITHMARK['描述符']说明:BEGINTRANSACTION语句执行时,全局变量@@TRANCOUNT的值将加1,@@TRANCOUNT表示当前连接中现有事务的数目。2.事务语句——开始事务五、事务108语法:COMMINTTRANSACTION[事务名|事务变量名]说明:COMMITTRANSACTION语句执行时,全局变量@@TRANCOUNT的值将减1。2.事务语句——提交事务五、事务109【例9-39】开始一个事务,对图书表“Book”中清华大学出版社的图书价格折价90%并查询其折价的结果,再用事务提交语句进行提交。代码:USELibraryGO--******************事务前******************--SELECT'Befor'AS事务前,BID,Bname,Publisher,PriceFROMBookWHEREPublisher='清华大学出版社’2.事务语句五、事务110--**********

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论