第9章 T-SQL程序设计_第1页
第9章 T-SQL程序设计_第2页
第9章 T-SQL程序设计_第3页
第9章 T-SQL程序设计_第4页
第9章 T-SQL程序设计_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

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

文档简介

第9章T-SQL程序设计本章概述本章的学习目标主要内容1概述1986年,美国国家标准化组织正式发表了编号为X3.135-1986的SQL标准,并且在1987年获得了国际标准化组织(ISO)组织的认可,被命名为ISO9075-1987。后来这个标准在1992、1999、2001、2003年等不断地得到了扩充和完善。2Transact-SQL语言Transact-SQL语言是微软公司在MSSQLServer系统中使用的语言,是对SQL语言的一种扩展形式(下文简称T-SQL语言)。T-SQL语言是一种交互式查询语言,具有功能强大、简单易学的特点。该语言既允许用户直接查询存储在数据库中的数据,也可以把语句嵌入到某种高级程序设计语言中来使用3T-SQL语言T-SQL语言有4个特点:一体化:集数据定义语言、数据操纵语言、数据控制语言、事务管理语言和附加语言元素为一体两种使用方式:交互使用方式和嵌入高级语言中使用。非过程化:只需要提出“干什么”,不需要指出“如何干”,语句的操作过程由系统自动完成。类似于人的思维习惯,容易理解和掌握。

4T-SQL语言的特点和执行方式

根据T-SQL语言的功能特点,可以分为5种类型数据定义语言数据操纵语言数据控制语言事务管理语言附加的语言元素SQLServer2005中,主要在SSMS中执行T-SQL语言编写的查询语句。5数据定义语言数据定义语言(DataDescriptionLanguage—DDL)用于创建数据库和数据库对象,为数据库操作提供对象。例如,数据库以及表、触发器、存储过程、视图、索引、函数、类型、用户等都是数据库中的对象,都需要通过定义才能使用。在DDL中,主要的语句包括CREATE语句、ALTER语句、DROP语句。6CREATE语句:用于创建数据库以及数据库中的对象,例在数据库中创建表ALTER语句:用于更改数据库以及数据库对象的结构。ALTER语句的对象必须已经存在。例如,对于表对象来说,在表中增加一个新列、删除一个列等操作都属于对表结构的更改。DROP语句:删除数据库或数据库对象的结构。删除对象结构包括删除该对象中的所有内容和对象本身。7数据操纵语言数据操作语言DML(DataManipulationLanguage),通过它可以实现对数据库的基本操作。如对表中数据的查询、插入、删除和修改DML语言包括INSERT、SELECT、UPDATE及DELETE等语句,即通常说的增、删、改、查。8数据操纵语言创建表对象之后,初始状态时该表是空的,需要使用INSERT语句向其中输入数据。使用SELECT语句检索表中数据如果表中数据不正确,可用UPDATE语句进行更新也可以使用DELETE语句删除表中的数据。注意:DELETE语句与DROP语句不同DELETE语句删除表中的数据,但是该表对象依然存在。DROP语句则删除了表对象,表中的数据自然也不存在了。9数据控制语言数据控制语言(DCL)主要用来执行有关安全管理的操作,该语言主要包括GRANT语句、REVOKE语句和DENY语句。GRANT语句可以将指定的安全对象的权限授予相应的主体REVOKE语句则删除授予的权限DENY语句拒绝授予主体权限,并且防止主体通过组或角色成员继承权限。109.1.1用户定义数据类型用户自定义数据类型是在基本数据的基础上根据需要定义的数据类型。它提供了一种加强数据库内部元素和基本数据类型之间一致性的机制,用于简化对常用规则和默认值的管理。当多个表的列中要存储同类型的数据,同时确保这些列具有完全相同的数据类型、长度、是否为空值时,可使用用户自定义数据类型。创建了别名数据类型之后,可以在CREATETABLE或ALTERTABLE中使用它,也可以将默认值和规则绑定到别名数据类型。11创建别名数据类型语法sp_addtype[@typename=]type,

[@phystype=]system_data_type

[,[@nulltype=]'null_type'];[@typename=]type:别名数据类型的名称[@phystype=]system_data_type:别名数据类型所基于的物理数据类型或SQLServer提供的数据类型。12创建别名数据类型[@nulltype=]'null_type'指示别名数据类型处理空值的方式。null_type

的数据类型为varchar(8),默认值为NULL,并且必须用单引号引起来('NULL'、'NOTNULL'或'NONULL')。139.1.2常量与变量常量,是表示一个特定数据值的符号。常量的格式取决于它所表示的值的数据类型。字符串常量字符串常量括在单引号内并包含字母数字字符(a-z、A-Z和0-9)以及特殊字符,如感叹号(!)、at符(@)和数字号(#)。如果单引号中的字符串包含一个嵌入的引号,可以使用两个单引号表示嵌入的单引号。'Cincinnati'、

'O''Brien'149.1.2常量与变量二进制常量:具有前辍0x并且是十六进制数字字符串。这些常量不使用引号括起。0xAE、0x12Ef

datetime

常量:使用特定格式的字符日期值来表示,并被单引号括起来。'April15,1998''980415''04/15/98'时间常量的示例:'14:30:24''04:24PM'无日期的时间值,其日期定义为1900/1/115数值常量integer常量以没有用引号括起来并且不包含小数点的数字字符串来表示。decimal常量由没有用引号括起来并且包含小数点的数字字符串来表示float和real常量使用科学记数法来表示16数值常量money常量以前缀为可选的小数点和可选的货币符号的数字字符串来表示,不使用引号括起。$12$542023.14uniqueidentifier

常量uniqueidentifier

常量是表示GUID的字符串。可以使用字符或二进制字符串格式指定。17变量SQLServer2005系统中,变量也被称为局部变量,是可以保存单个特定类型数据值的对象经常在批处理和脚本中使用变量,用做作为计数器计算循环执行的次数或控制循环执行的次数保存数据值以供控制流语句测试保存存储过程返回代码要返回的数据值或函数返回值18变量T-SQL语言中,使用DECLARE语句声明变量声明过程为变量指定名称,且名称的第一个字符必须是@指定该变量的数据类型和长度将该变量值设置为NULL有两种为变量赋值的方式,即使用SET语句为变量赋值和使用SELECT语句选择列表中当前所引用值来为变量赋值。19局部变量的赋值局部变量的值使用SELECT、UPDATE和SET语句进行赋值DECLARE@int_var

intSELECT@int_var=12/*给@int_var赋值*/SELECT@int_var/*输出到屏幕上*/在未赋值前,局部变量的值为null20局部变量的赋值在一条语句中可以同时对几个变量进行赋值,例如,DECLARE@LastNamechar(8),@Firstnamechar(8),@BirthDatedatetimeSELECT@LastName='Smith',@Firstname='David',@BirthDate='1985-2-20'SELECT@LastName,@Firstname,@BirthDate21局部变量的赋值例9-1使用SELECT语句从customer表中检索出顾客编号为C0002的行,再将顾客的名字赋给变量@customer。DECLARE@customervarchar(40),@curdatedatetimeSELECT@customer=customer_name,@curdate=getdate()FROMcustomerWHEREcustomer_id='C0002'22局部变量的赋值如果SELECT返回多个结果,则只将返回的最后一行的值赋给局部变量若检索结果为空,则局部变量的值不变23使用SET为局部变量赋值例9-3计算employee表的记录数并赋值给局部变量@rows。DECLARE@rowsintSET@rows=(SELECTCOUNT(*)FROMemployee)SELECT@rowsSET一次只能为一个局部变量进行赋值24全局变量某些Transact-SQL系统函数的名称以两个at符号(@@)打头。在MicrosoftSQLServer的早期版本中,@@functions被称为全局变量,但它们不是变量,也不具备变量的行为。@@functions是系统函数,它们的语法遵循函数的规则。25@@ERROR如最后的T-SQL语句执行成功,@@ERROR系统函数返回0;如此语句产生错误,@@ERROR返回错误号每一个T-SQL语句完成时,@@ERROR都会得到一个新的值@@ERROR可用以下两种方法处理:在T-SQL语句后,马上检测或使用@@ERROR在T-SQL语句完成后,马上把@@ERROR存储到一个整型变量中。此变量的值可供以后使用26@@ERRORSELECT*FROMnot_found_tableGOSELECT@@ERRORASN'第一个错误号'GOSELECT5+6ASN'两个数之和'GOSELECT@@ERRORASN'第二个错误号'GO27练习:使用@@ERROR首先试图以0作除数,这会导致错误SELECT100/0SELECT@@ERRORSELECT@@ERROR查看“结果”和“消息”两个选项卡的内容。这个例子说明了@@ERROR变量值的生命周期28例9-4使服务器产生服务,并显示错误号。raiserror('miscellaneouserrormessage',16,1)/*产生一个错误*/if@@error<>0SELECT@@erroras'lasterror'29例9-5捕捉例9-4中服务器产生的错误号,并显示出来。DECLARE@my_error

intRAISERROR('miscellaneouserrormessage',16,1)SELECT@my_error=@@errorIF@my_error<>0SELECT@my_erroras'lasterror'309.1.3运算符与表达式运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。在T-SQL语言中,表达式是标识符、变量、常量、标量函数、子查询、运算符等的组合。SQLServer2005系统中,表达式可以在多个不同的位置使用,这些位置包括查询中检索数据的一部分、搜索数据的条件等。简单表达式:一个变量、常量、列名或标量函数复杂表达式:由两个或更多个简单表达式通过使用运算符连接起来的表达式。319.1.3运算符与表达式在SQLServer2005系统中,可使用下列运算符:算术运算符逻辑运算符赋值运算符字符串串联运算符按位运算符比较运算符32运算符算术运算符

+,-,*,/,%(模余)

SELECT12.0/5.0,12/5,12.0/15.0,12/15,12%7例9-9使用“+”将goods表中高于9000元的商品价格增加15元。SELECTgoods_name,unit_price,(unit_price+15)ASnowpriceFROMgoodsWHEREunit_price>900033赋值运算符T-SQL中只有一个赋值运算符,即(=)。赋值运算符使我们能够将数据值指派给特定的对象还可以使用赋值运算符改变查询结果中显示的列标题DECLARE@EnameVARCHAR(128)SET@Ename='Cleon'GOSELECTFIRSTNAME=FirstName,LASTNAME=LastNameFROMContact34位运算符位运算符能够在整型数据或者二进制数据(image数据类型除外)之间执行位操作。运算符含义&(按位

AND)按位

AND(两个操作数)|(按位

OR)按位

OR(两个操作数)^(按位异或XOR)按位异或XOR(两个操作数)35位运算符20:00010100,12:0000110020&12000101000000110000000100——420|12000101000000110000011100——2836位运算符20:00010100,12:0000110020^12000101000000110000011000——24SELECT20&12,20|12,20^1237比较运算符比较运算符亦称为关系运算符,用于比较两个表达式的大小或是否相同,其比较的结果是布尔值,即TRUE、FALSE以及UNKNOWN。除了text,ntext

或image数据类型的表达式外,比较运算符可以用于所有的表达式。=、>、<、>=、<=、<>、!=、!<、!>38逻辑运算符p177USEAdventureWorksSELECT*FROMContactWHEREcontactID<10ANDTitle='Mr.'OR

FirstName='Tom'查找合同编码小于10且称谓为Mr.,或者FirstName为Tom的纪录WHERE(contactID<10ANDTitle='Mr.')

OR

FirstName='Tom'39运算符含义ALL如果一组的比较都为TRUE,那么就为TRUE。AND如果两个布尔表达式都为TRUE,那么就为TRUE。ANY如果一组的比较中任何一个为TRUE,那么就为TRUE。BETWEEN如果操作数在某个范围之内,那么就为TRUE。EXISTS如果子查询包含一些行,那么就为TRUE。IN如果操作数等于表达式列表中的一个,那么就为TRUE。LIKE如果操作数与一种模式相匹配,那么就为TRUE。NOT对任何其他布尔运算符的值取反。OR如果两个布尔表达式中的一个为TRUE,那么就为TRUE。SOME如果在一组比较中,有些为TRUE,那么就为TRUE。40字符串串联运算符+p178USEAdventureWorksSELECTFullInfo=Title+''+FirstName+''+LastName+',Telephonenumberis'+PhoneFROMperson.Contact41SQL中逻辑运算的优先级由低到高排列()~^&|*,/,%+,-Not->And->Or429.2函数在T-SQL语言中,函数被用来执行一些特殊的运算以支持SQLServer的标准命令。SQLServer包含多种不同的函数用以完成各种工作,每一个函数都有一个名称,在名称之后有一对小括号,如:gettime()。大部分的函数在小括号中需要一个或者多个参数。43函数的特点和类型函数类别描述聚合函数将多个数值合并为一个数值,例如计算合计值配置函数返回当前配置选项配置的信息加密函数支持加密、解密、数字签名和数字签名验证游标函数返回有关游标状态的信息日期和时间函数可以执行与日期、时间数据相关的操作数学函数执行对数、指数、三角函数、平方根等数学运算元数据函数用于返回数据库和数据库对象的属性信息44函数的特点和类型函数类别描述排名函数可返回分区中的每一行的排名值行集函数可返回一可用于代替T-SQL语句中表引用的对象安全函数返回有关用户和角色的信息字符串函数可对字符数据执行替换、截断、合并等操作系统函数对系统级的各种选项和对象进行操作或报告系统统计函数返回有关SQLServer系统性能统计的信息文本和图像函数用于执行更改TEXT和IMAGE值的操作45字符串函数USEAdventureWorksSELECTFirstName,N'名称长度'=LEN(FirstName),N'名称前3个字母的大写形式'=UPPER(SUBSTRING(FirstName,1,3)),N'名称复制3遍'=REPLICATE(FirstName,3)FROMPerson.Contact要求掌握:substring,left,right46数学函数p181SELECTN'自然对数'=LOG(10),N'指数'=EXP(12),N'符号'=SIGN(2),N'圆周率'=PI(),N'正弦'=SIN(PI()/2.0),N'余弦'=COS(PI()/2.0)47数学函数例9-12用ceiling和floor函数返回大于或等于指定值的最小整数值和小于或等于指定值的最大整数值。SELECTceiling(123),floor(321),ceiling(12.3),ceiling(-32.1),floor(-32.1)例9-13round函数的使用。SELECTround(12.34512,3),round(12.34567,3),round(12.345,-2),round(154.321,-2)48日期和时间函数p182日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,并返回一个字符串、数字值或日期和时间值。与其他函数一样,可以在SELECT语句的SELECT和WHERE子句以及表达式中使用日期和时间函数。49日期和时间函数函数参数功能DATEADD(datepart,number,date)以datepart指定的方式,返回date加上number之和DATEDIFF(datepart,date1,date2)以datepart指定的方式,返回date2与date1之差DATENAME(datepart,date)返回日期date中datepart指定部分所对应的字符串DATEPART(datepart,date)返回日期date中datepart指定部分所对应的整数值50日期和时间函数SELECTGETDATE()函数参数功能DAY(date)返回指定日期的天数GETDATE()返回当前的日期和时间MONTH(date)返回指定日期的月份数YEAR(date)返回指定日期的年份数51例9-14使用datediff函数来确定货物是否按时送给客户。SELECTgoods_id,datediff(dd,send_date,arrival_date)FROMpurchase_order系统函数不要求p183529.2.2用户定义函数用户定义函数是接受参数、执行操作并且将运算结果以值的形式返回的例程。返回值可以是单个标量值,也可以是一个结果集SQLServer2005中,使用CREATEFUNCTION、ALTERFUNCTION、DROPFUNCTION语句来实现用户定义函数的创建、修改和删除。53使用CREATEFUNCTION语句CREATEFUNCTION[所有者名称.]函数名

[({@参数名称[AS]数据类型[=默认值]}[,…n])]

RETURNS返回值类型

[AS]

BEGIN

函数体SQL语句

RETURN数值表达式

END54使用CREATEFUNCTION语句SQLServer2005中,使用CREATEFUNCTION语句可以创建标量函数、内嵌表值函数、多语句表值函数如果RETURNS子句指定了一种标量数据类型,则该函数为标量函数如果RETURNS子句指定了TABLE,则该函数为表值函数。根据函数主体的定义方式,表值函数可以分为内嵌函数或多语句函数。55标量值型自定义函数标量值型自定义函数的最大特点是返回单个值,即标量值。可以在允许使用标量表达式(scalarexpression)的地方使用标量UDF。例如查询、约束、计算列等。必须包含BEGIN/END块以定义函数的主体调用时必须限定架构调用时不允许忽略可选参数;或者为它们指定DEFAULT关键字56标量值型自定义函数例9-18创建函数DatetoQuarter,输入日期数据,输出对应的季度值。如输入'2006-8-5',返回'3Q2006',表示2006年3季度。CREATEFUNCTION

DatetoQuarter(@dqdate

datetime)RETURNSchar(6)ASBEGIN

RETURN(datename(q,@dqdate)+'Q'+datename(yyyy,@dqdate))END57表值型自定义函数返回值为数据表的自定义函数,这类自定义函数通常被用于一条查询语句的FROM子句中。可以在任何使用一个数据表(或视图)的地方使用一个表值型自定义函数,由于表值型自定义函数可以根据需要使用相应的参数,比数据表或视图更具动态性。表值型自定义函数包括内嵌(inline)和多语句(Multistatement)表值型自定义函数两种58内嵌表值型UDF1、返回类型为table。返回变量的格式由RETURN子句中的SELECT语句的结果集的格式设置。2、function_body

不由BEGIN和END分隔。3、RETURN子句在括号中包含单个SELECT语句。SELECT语句的结果集构成函数所返回的表。59内嵌表值型自定义函数例9-19创建用户定义函数goodsq,返回输入商品编号的商品名称和库存量。CREATEFUNCTIONgoodsq(@goods_idvarchar(30))RETURNSTABLEASRETURN(SELECTgoods_name,stock_quantityFROMgoodsWHEREgoods_id=@goods_id)60由于视图不支持在WHERE子句的搜索条件中使用参数,内嵌表值函数可弥补视图的这一不足之处,即内嵌表值函数可用于实现参数化视图的功能。61多语句表值型自定义函数多语句表值型自定义函数是指那些需要多条查询语句才能完成既定目标的表值型函数。这类表值型自定义函数只能用在SELECT查询语句中的FROM子句中。62多语句表值型自定义函数例9-20根据输入的订单编号,返回该订单对应商品的编号、名称、类别编号、类别名称。CREATEFUNCTION

good_info(@in_o_idvarchar(10))RETURNS@goodinfo

TABLE(o_idchar(6),g_idchar(6),g_namevarchar(50),

c_idchar(6),c_namevarchar(20))AS63BEGIN

DECLARE@g_idvarchar(10),@g_namevarchar(30)

DECLARE@c_idvarchar(10),@c_namevarchar(30)

SELECT@g_id=goods_id

FROM

sell_order

WHEREorder_id1=@in_o_id

SELECT@g_name=goods_name,@c_id=classification_id

FROMgoodsWHERE

goods_id=@g_id64

SELECT@c_name=classification_name

FROM

goods_classification

WHERE@c_id=classification_id

INSERT@goodinfo

VALUES(@in_o_id,@g_id,@g_name,@c_id,@c_name)

RETURNEND65例:在STUDENT库中创建一个多语句表值函数CHENGJI,该函数可以根据输入的课程名称返回选修该课程的学生姓名和成绩。

CREATEFUNCTIONCHENGJI(@inputkcaschar(20))RETURNS@chjiTABLE(课程名char(20),

姓名char(8),

成绩tinyint)AS66ASBEGININSERT@chjiSELECTc.课程名,s.姓名,k.成绩

FROM学生asSINNERJOIN选课asSCONS.学号=SC.学号innerjoin课程asConC.课程号=C.课程号

WHEREC.课程名=@inputkcRETURNENDGO67执行用户自定义函数P188调用方法与系统内置函数相同,但要在函数名前加上架构名。可用使用EXECUTE语句执行标量值函数。SELECTdbo.DatetoQuarter('2006-8-5')SELECT*FROMdbo.goodsq('G00002')SELECT*FROMdbo.good_info('S00002')689.3流程控制语句结构化程序设计语言的基本结构是顺序、条件分支和循环。T-SQL语言中,用于控制语句流的语言被称为控制流语言。SQLServer2005系统提供了8种控制流语句69控制流语句控制流语句描

述BEGIN…END定义语句块,这些语句块作为一组语句执行,允许语句块嵌套BREAK退出WHILE或IF…ELSE语句中最里面的循环。如果END关键字作为循环结束标记,那么执行BREAK语句后将执行出现在END关键字后面的任何语句GOTO使T-SQL批处理的执行跳至指定标签的语句。不执行GOTO语句和标签之间的所有语句。该语句破坏了结构化语句的结构,尽量减少使用CONTINUE重新开始一个新的WHILE循环70控制流语句控制流语句描

述IF…ELSE指定T-SQL语句的执行条件。如条件为TRUE,则执行其后的T-SQL语句。当条件为FALSE时,可以使用ELSE关键字指定要执行的T-SQL语句WHILE设置重复执行T-SQL语句或语句块的条件。当指定条件为真时,重复执行循环语句。可在循环体内设置BREAK和CONTINUE关键字,以控制循环语句的执行71控制流语句控制流语句描

述RETURN无条件终止查询、存储过程或批处理的执行。存储过程或批处理中RETURN语句后面的所有语句都不再执行。当在存储过程中使用RETURN语句时,可使用该语句指定返回给调用应用程序、批处理或过程的整数值。如果RETURN语句未指定值,则存储过程的返回值是0WAITFOR悬挂起批处理、存储过程或事务的执行,直到发生以下情况为止:已超过指定的时间间隔、到达一天中指定的时间、指定的RECEIVE语句至少修改一行数据。该语句是通过暂停语句的执行而改变语句的执行过程729.3.1语句块和注释BEGIN…END语句:将多个T-SQL语句组合成一个语句块,并将它们视为一个单元处理。在条件语句(IF)和循环(WHILE)等控制流程语句中,当符合特定条件便要执行两个或者多个语句时,就需要使用BEGIN…END语句。

BEGIN

{sql_statement|statement_block}END739.3.1语句块和注释例9-21显示Sales数据库中customer表的编号为C0001的联系人姓名。DECLARE@linkman_namechar(8)BEGINSELECT@linkman_name=(SELECTlinkman_nameFROMcustomerWHEREcustomer_idLIKE'C0001')SELECT@linkman_nameEND74例9-22语句块嵌套举例DECLARE@errorcode

int,@nowdate

datetimeBEGIN SET@nowdate=getdate() INSERTsell_order(order_date,send_date,arriver_date,custom_id) VALUES(@nowdate,@nowdate+5,@nowdate+10,'C0002') SELECT@errorcode=@@error IF@errorcode>0 BEGIN RAISERROR('当表sell_order插入数据时发生错误!',16,1) RETURN ENDEND75注释注释是程序代码中不执行的文本字符串,用于对代码进行说明或暂时仅用正在进行诊断的部分语句。单行注释:使用两个联在一起的减号“--”作为注释内容标记,其后为注释内容。多行注释:使用“/*注释内容*/”格式。服务器不对注释进行解释。76使用两种注释类型的例子/*程序名称:创建ContactHead表的脚本作者:微软公司最后一次修改日期:2005年12月10日程序描述:用户存储合同的基本概况信息*/CREATETABLEContacts(--表名称ContactHeadContactIDINTNOTNULLPRIMARYKEY,--合同编码,每一个合同只能有一个唯一性的编码customerNameVARCHAR(128),--签订合同的客户名称salePersonNameVARCHAR(36),--签订合同的员工名称issueDateDATETIME,--合同签订日期otherVARCHAR(128))--备注779.3.2选择控制P191IF…ELSE语句是条件判断语句ELSE子句是可选的SQLServer允许嵌套使用IF…ELSE语句

IF

Boolean_expression

{sql_statement|statement_block}

[ELSE

{sql_statement|statement_block}]78例如果李四的平均成绩为60分以上,显示其成绩情况,否则显示文本:成绩状态不理想。declare@avgs

intselect@avgs=avg(grade)from

s,sc

where

s.sno=sc.sno

and

sname='李四'if(@avgs>=60)select

s.sno,sname,cno,grade

from

s,scwhere

s.sno=sc.sno

and

sname='李四'elseprint'成绩不理想'79例9-23判断表goods中supplier_id为S001的商品的平均单价是否大于9799。IF(SELECTavg(unit_price)FROMgoodsWHEREsupplier_id='S001')>$9799.0SELECT'supplier_id为S001的商品的平均单价比9799大'ELSESELECT'supplier_id为S001的商品的平均单价比9799小'80例9-24用EXISTS确定表department中是否存在“陈晓兵”。DECLARE@lnamevarchar(40),@msgvarchar(255)SELECT@lname='陈晓兵'IFEXISTS(SELECT*FROMdepartmentWHEREmanager=@lname)BEGINSELECT@msg='有人名为'+@lnameSELECT@msgEND81

ELSEBEGINSELECT@msg='没有人名为'+@lnameSELECT@msgEND82CASE函数P193计算条件列表并返回多个可能结果表达式之一。CASE具有两种格式:简单CASE函数将某个表达式与一组简单表达式进行比较以确定结果。CASE搜索函数计算一组布尔表达式以确定结果。两种格式都支持可选的ELSE参数。83简单CASE函数CASEinput_expression

WHENwhen_expressionTHEN

result_expression[...n]

[ELSEelse_result_expression]ENDSearched84CASE搜索函数CASEWHENBoolean_expressionTHEN

result_expression[...n]

[ELSEelse_result_expression]END85简单CASE函数例9-26使用简单CASE函数将goods表中的商品分类重命名,以使之更易理解。SELECTCASEclassification_idWHEN'P001'THEN'笔记本计算机'WHEN'P002'THEN'激光打印机'WHEN'P003'THEN'喷墨打印机'WHEN'P004'THEN'交换机'ELSE'没有这种品牌'ENDASClassification,goods_nameAS'GoodsName',unit_priceASPriceFROMgoodsWHEREunit_priceISNOTNULL86CASE搜索函数例9-27根据goods表中库存货物数量与订货量之差,使用CASE搜索函数判断该商品是否进货。SELECTgoods_nameAS商品名称,CASEWHENstock_quantity-order_quantity<=3THEN'紧急进货'WHENstock_quantity-order_quantity>3andstock_quantity-order_quantity<=10THEN'暂缓进货'WHENstock_quantity-order_quantity>10THEN'货物充足'ENDAS进货判断FROMgoods87GOTO语句P194GOTO语句可以使程序直接跳到指定的标有标识符的位置处继续执行,而位于GOTO语句和标识符之间的程序将不会被执行。标识符可以为数字与字符的组合,但必须以“:”结尾。如:‘a1:’。在GOTO语句行,标识符后面不用跟“:”。GOTOlabel……label:88例9-28使用GOTO语句改变程序流程。

DECLARE@xintSELECT@x=1label_1:

SELECT@xSELECT@x=@x+1WHILE@x<6GOTOlabel_189RETURN语句P195RETURN语句用于无条件地终止一个查询、存储过程或者批处理,此时位于RETURN语句之后的程序将不会被执行。RETURN语句的语法形式为:RETURN[integer_expression]其中,参数integer_expression为返回的整型值。存储过程可以给调用过程或应用程序返回整型值。90例9-29RETURN语句应用示例。DECLARE@xint,@y

intSELECT@x=1,@y=2IF@x>@yRETURNELSERETURN91WAITFOR语句P195WAITFOR语句用于暂时停止执行SQL语句、语句块或者存储过程等,直到所设定的时间已过或者所设定的时间已到才继续执行。WAITFOR{DELAY'time'|TIME'time'}DELAY用于指定时间间隔,TIME用于指定某一时刻,其数据类型为datetime,格式为‘hh:mm:ss’。92WAITFOR语句使用WAITFORTIME语句,以便在晚上10:20执行存储过程update_all_stats。BEGINWAITFORTIME'22:20'EXECUTEupdate_all_statsEND93WAITFOR语句WAITFORDELAY'00:01:00'SELECT*FROMgradeWAITFORTIME'23:00'BACKUPDATABASEstudentsdbTOstudentsdb_bkp949.3.3循环控制P196设置重复执行SQL语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用BREAK和CONTINUE关键字在循环内部控制WHILE循环中语句的执行。WHILEBoolean_expression

{sql_statement|statement_block}[BREAK]

{sql_statement|statement_block}[CONTINUE]

{sql_statement|statement_block}959.3.3循环控制BREAK导致从最内层的WHILE循环中退出。将执行出现在END关键字(循环结束的标记)后面的任何语句。CONTINUE使WHILE循环重新开始执行,忽略CONTINUE关键字后面的任何语句。如果嵌套了两个或多个WHILE循环,则内层的BREAK将退出到下一个外层循环。969.3.3循环控制例9-30将goods表中库存数最大的商品每次订购两件,计算如此需要多少次订购才能使库存数不够一次订购。DECLARE@countint,@maxstockidchar(6),@maxstockfloatSET@count=0SET

温馨提示

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

评论

0/150

提交评论