【教学课件】第04章Transact-SQL语言基础.ppt
第04章 Transact-SQL语言基础,内容提要:Transact-SQL语言是SQL Server 2005在SQL语言的基础上增加了一些语言要素后的扩展语言,其语言要素包括注释、变量、运算符、函数和流程控制语句等。掌握Transact-SQL语言是进一步学习更多的管理技术和数据库应用开发技术的关键。本章主要介绍Transact-SQL语言中的常量、变量、函数、表达式等语言成份和控制流语句等。,第04章 Transact-SQL语言基础,4.1 了解Transact-SQL编程语言4.2 Transact-SQL语法要素 4.3 Transact-SQL运算符4.4 Transact-SQL函数 4.5 Transact-SQL表达式4.6 Transact-SQL控制流语句4.7小结,4.1 了解Transact-SQL编程语言,4.1.1 Transact-SQL概述Transact-SQL语言用于处理SQL Server 2005数据库引擎实例的相关操作,主要包括创建和管理数据库对象、插入、检索、修改和删除数据。Transact-SQL语言不是一种标准的编程语言,只能够提供SQL Server 的数据引擎来分析和运行。,4.1 了解Transact-SQL编程语言,4.1.1 Transact-SQL概述1Transact-SQL语言的语法约定 表4.1列出了Transact-SQL 参考的语法格式中使用的约定,并进行了说明。,4.1 了解Transact-SQL编程语言,4.1.1 Transact-SQL概述2Transact-SQL语言中对象的引用方法SQL Server 2005的所有对数据库对象名的 引用可以是由4部分组成的名称,格式如下:server_name.database_name.schema_name.|database_name.schema_name.|schema_name.object_name引用某个特定对象时,不必总是指定服务器、数据库和架构供 SQL Server 2005 Database Engine标识该对象。,4.1 了解Transact-SQL编程语言,4.1.1 Transact-SQL概述3架构的使用和说明 SQL Server 2005 中的架构是形成单个命名空间的数据库实体的集合。架构是单个用户所拥有的数据库对象的集合,这些对象形成单个命名空间。数据库对象由架构所拥有,而架构由数据库用户或角色所拥有。当架构所有者离开单位时,会在删除离开的用户之前将该架构的所有权移交给新的用户或角色。在使用架构的过程中,应该了解以下内容:(1)利用架构可以简化DBO和开发人员的工作。,4.1 了解Transact-SQL编程语言,4.1.1 Transact-SQL概述3架构的使用和说明(2)用户架构分离。架构与数据库用户分离对DBO和开发人员而言有下列好处:多个用户可以通过角色成员身份或 Windows 组成员身份拥有一个架构。简化了删除数据库用户的操作。删除数据库用户不需要重命名该用户架构所包含的对象。多个用户可以共享一个默认架构以进行统一名称解析。开发人员通过共享默认架构可以将共享对象存储在为特定应用程序专门创建的架构中,而不是 DBO 架构中。可以用更大的粒度管理架构和架构包含的对象的权限。,4.1 了解Transact-SQL编程语言,4.1.1 Transact-SQL概述3架构的使用和说明 完全限定的对象名称现在包含4部分:-即服务器.数据库.架构.数据库对象(3)默认架构。SQL Server 2005 利用默认架构的概念解析未使用其完全限定名称引用的对象的名称。如果未定义 DEFAULT_SCHEMA,则数据库用户将把 DBO 作为其默认架构。,4.1 了解Transact-SQL编程语言,4.1.2 Transact-SQL语句分类Transact-SQL语言中的语句根据用途分为4种类型。(1)数据定义语言(DDL)。数据定义语言(data definition language)通常是数据库管理系统的一部分,在SQL Server 2005中,数据库对象包括表、视图、触发器、存储过程、规则、默认、用户自定义的数据类型等。定义语言的语句有CREATE,ALTER,DROP等。(2)数据操纵语言(DML)。数据操作语言(data manipulation language)用于检索和操作数据的 SQL 语句的子集。数据操纵语言语句包括SELECT、INSERT、UPDATE、DELETE等命令。,4.1 了解Transact-SQL编程语言,4.1.2 Transact-SQL语句分类(3)数据控制语言。数据控制语言(DCL)是用来设置或更改数据库用户或角色权限的语句,包括GRANT,DENY,REVOKE等命令。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权限执行数据控制语言。(4)控制流语句。Transact-SQL还为用户提供了控制流语句,用于控制SQL语句、语句块或者存储过程的执行流程。常用流程控制语句有BEGINEND、IFELSE、WHILE、BREAK、GOTO、WAITFOR、RETURN等主要语句。,4.2 Transact-SQL语法要素,4.2.1 Unicode码与ASC码(1)ASC码。ANSI标准机构制定了一种编码标准ASC码,要求用8个二进制位来表示字母的范围。存在的缺陷是只能表示256个不同的字符,不能在一个单独的8位编码体系中指定所有的字符。(2)Unicode码。Unicode标准使用2个字节来表示每个字符。SQL Server 2005将Unicode定义的一组字母、数字和符号识别为nchar、nvarchar 和 ntext 数据类型。在Unicode标准编码机制下,Unicode 具有65,000多个可选的值,Unicode 可以包含大多数语言的字符。每个不同的字符都用一种唯一的编码进行表示,不同语言的系统之间传输数据时不需要任何编码转换,这就使得字符数据可以完全可移植了。,4.2 Transact-SQL语法要素,标识符根据命名对象的方式,对象标识符可分为常规标识符和分隔标识符。其字符数都必须在 1 到 100 之间。1常规标识符常规标识符是符合成为常规标识符的下列格式规则的对象名称。常规标识符的字母要符合Unicode Standard 2.0标准和如下格式规则:标识符可以以字母开头,也可以符号(表示局部变量)、#(表示临时变量)或者下划线_开头。字母要符合Unicode Standard 2.0标准。后续字符可以是字母、数字和下划线(_)。标识符不能是Transact-SQL的保留字。标识符中不允许嵌入空格或特殊字符。,例如,下面给出的示例都是合法的常规标识符。-声明了一个名为Ex_Local的局部变量。DECLARE Ex_Local NCHAR(10)-声明了一个名为Ex_Table的表变量。DECLARE Ex_Table TABLE(col1,CHAR)-用于创建一个名为TempTable的临时表变量。CREATE TABLE#TempTable(itemid,INT)-定义了一个名为sp_User1的存储过程标识符。CREATE PROCEDURE sp_User1 ASBEGIN END,4.2 Transact-SQL语法要素,标识符2分隔标识符对于使用分隔标识符,不符合成为常规标识符的格式规则的标识符必须始终使用方括号“”进行分隔。分隔符仅用于标识符,不能用于关键字。(1)下列情况下需要使用分隔标识符:当对象的名称或名称中的一部分使用保留关键字时。必须先更改对象的标识符,才能使用分隔标识符引用对象。当对象的名称使用未被列为限定标识符的字符时,允许分隔标识符使用当前代码页中的任意字符。,4.2 Transact-SQL语法要素,标识符2分隔标识符(2)分隔标识符的格式规则:分隔标识符的主体可以包含当前代码页中的字符(包括分隔符本身)的任意组合。如果分隔标识符的主体包含分隔符,则需进行特殊处理:如果标识符的主体只包含左方括号(),则无需进行额外处理。如果标识符的主体包含一个右方括号,则必须指定两个右方括号()。,例如,下面给出的示例都是合法的分隔标识符。假设语句中,Sales Volume、Sales Cube 和 select 都是分隔标识符。-在 Sales Volume 和 Sales Cube 标识符中插入空格,而select是一个保留关键字。SELECT Measures.Sales VolumeFROM Sales CubeWHERE Product.select-下面的示例中,对象的名称是 Total Profit Domestic。若要引用此对象,必须使用以下分隔标识符:Total Profit Domestic请注意,不必更改 Domestic前面的左方括号来创建分隔标识符。但是,必须将Domestic 后面的右方括号替换为两个右方括号。,4.2 Transact-SQL语法要素,4.2.3 常量常量表示一个特定数据值的符号。(1)字符串常量。字符串常量括在单引号内并包含字母数字字符(a-z、A-Z 和 0-9)以及特殊字符(如!、和#等)的字符序列。字符串常量遵循当前数据库的默认排序规则,除非使用 COLLATE 子句为其指定了排序规则。如果单引号中的字符串包含一个嵌入的引号,则可以使用两个单引号表示嵌入的单引号。也可以使用双引号定义字符串常量,则对于嵌入在双引号中的单引号不必作特别处理。空字符串用中间没有任何字符的两个单引号表示。,以下是字符串的示例:CA123OBrienProcess X is 50%.The level for job_id:%d should be between%d and%d.OBrien对于Unicode 字符串,其前面必须有一个大写字母N 前缀。例如,ABCD 是字符串常量而 NABDC 则是 Unicode 常量。,以下是在 Transact-SQL 中使用的分隔符类型:,引用的标识符用双引号(“)分隔开:SELECT*FROM“Blanks in Table Name”括在括号中的标识符用方括号()分隔开:SELECT*FROM Blanks In Table Name 仅当 QUOTED_IDENTIFIER 选项设为 ON 时,引用的标识符才有效。默认情况下,当用于 SQL Server 的 Microsoft OLE DB 提供程序和 SQL Server ODBC 驱动程序连接时,将 QUOTED_IDENTIFIER 设为 ON。,当 QUOTED_IDENTIFIER 设为 ON 时,对于 SQL 语句中的双引号()和单引号()的用法,SQL Server 遵循 SQL-92 规则。例如:,双引号只能用于分隔标识符,不能用于分隔字符串。单引号只用于包含字符串,不能用于分隔标识符。如果字符串包含嵌入的单引号,则应在该嵌入的单引号前再添加一个单引号。例如:,SELECT*FROM My Table WHERE Last Name=OBrien,如果 QUOTED_IDENTIFIER 设为 OFF,对于单引号和双引号的用法,SQL Server 遵循以下规则:引号不能用于分隔标识符,而必须将括号用作分隔符。单引号或双引号可用于包含字符串。如果使用双引号,嵌入的单引号将不必用两个单引号来表示。例如:,SELECT*FROM My Table WHERE Last Name=OBrien 无论采用哪种 QUOTED_IDENTIFIER 设置,都可以使用括号分隔符。,4.2 Transact-SQL语法要素,4.2.3 常量(2)二进制常量。二进制常量具有前辍0 x并且是十六进制数字字符串。这些常量不使用引号括起。下面是二进制字符串的示例:0 xAA 0 x1CE0 x69048AEFBB010E0 x(表示空二进制字符)(3)bit 常量。bit常量使用数字0或1表示,并且不括在引号中。如果使用一个大于 1 的数字,则该数字将转换为1。,4.2 Transact-SQL语法要素,4.2.3 常量(4)日期时间常量。datetime 常量使用特定格式的字符日期值来表示,并被单引号括起来。常用的datetime常量格式的示例如下:April 15,201015 April,201109041504/15/10下面是时间常量的示例:16:30:2707:27 PM,(5)整型常量。integer 常量以没有用引号括起来并且不包含小数点的数字字符序列来表示。integer 常量不能包含小数且必须全部为数字。,4.2 Transact-SQL语法要素,4.2.3 常量(6)数值型常量。decimal 常量由没有用引号括起来并且包含小数点的数字字符串来表示。下面是 decimal 常量的示例:3.14159269.807(7)浮点型常量。float 和 real 常量一般使用科学记数法来表示。下面是 float 或 real 值的示例:13.76E9 2.77E-3,4.2 Transact-SQL语法要素,4.2.3 常量(8)货币型常量。money 常量以前缀为可选的小数点和可选的货币符号的数字字符串来表示。下面是 money 常量的示例:$20137$5420437,数值型常量(包括integer、decimal、float、money等类型)若要指示一个数是正数还是负数,可以对数值常量应用+或-一元运算符,成为一个表示有符号数字值的表达式。如果没有应用+或-一元运算符,则数值常量为正数。例如,各数值类型的正负数示例如下:+3356 918-2277+3.1426 7.3789-2.71828+123E-3-12E5-$45.56+$423456.99$423455,(9)GUID常量。全局唯一标识符(uniqueidentifier)常量是表示 GUID 的字符串。可以使用字符或二进制字符串格式指定。以下是 GUID类型示例:6F9619FF-8B86-D011-B42D-00C04FC964FF0 xff19966f868b11d0b42d00c04fc964ff,4.2 Transact-SQL语法要素,4.2.4 变量两种形式的变量:用户自己定义的局部变量和系统提供的全局变量。声明变量:使用DECLARE命令,为变量赋值时则需要使用SET和SELECT命令。SET命令一次只能为一个变量赋值,而SELECT命令可以同时为多个变量赋值。1局部变量局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量被引用时要在其名称前加上标志,而且必须先用DECLARE命令定义后才可以使用。定义局部变量的语法形式如下:DECLAER local_variable data_type,n,如果想要设定局部变量的值,必须使用SELECT命令或者SET命令。其语法形式为:SET local_variable=expression 或者:SELECT local_variable=expression,.n,例4.1声明一个myvar 变量,然后将一个字符串值放在变量中,再输出myvar 变量的值。程序代码如下:DECLARE myvar nchar(20)set myvar=This is a testSELECT myvar GO,4.2 Transact-SQL语法要素,4.2.4 变量 2.全局变量 全局变量是SQL Server系统内部使用的变量,可以让任何程序均可以随时调用。全局变量通常存储一些SQL Server的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是Transact-SQL命令执行后的状态值。在使用全局变量时应该注意以下几点:全局变量是在服务器级定义的。用户只能使用预先定义的全局变量。引用全局变量时,必须以标记符“”开头。局部变量名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。,例4.2显示到当前日期和时间为止试图登录SQL Server 2005的次数。程序代码如下:SELECT GETDATE()AS 当前的时期和时间,CONNECTIONS AS 试图登录的次数,4.2 Transact-SQL语法要素,注释注释是程序代码中非可执行的文本字符串。使用注释对代码进行说明,不仅能使程序易读易懂,而且有助于日后的管理和维护。注释通常用于记录程序名称、作者姓名和主要代码更改的日期。注释还可以用于描述复杂的计算或者解释编程的方法。在SQL Server 2005中,可以使用两种类型的注释方法:-注释。该方式用于单行注释。/*/注释。“/*”用于注释文字的开头,“*/”用于注释文字的结尾,利用它们可以在程序中标识多行文字为注释。当然,单行注释也可以使用。,例4.3 为前面的例子添加注释。程序代码如下:DECLARE myvar nchar(20)-定义变量myvar/*下面第一行给变量赋值 第2行输出变量值*/set myvar=This is a testSELECT myvar GO,4.3 Transact-SQL运算符,运算符是用来执行算术运算、字符串连接、赋值以及在字段、常量和变量之间进行比较的操作符。运算符主要有以下6大类:算术运算符赋值运算符位运算符比较运算符逻辑运算符字符串串联运算符。,4.3 Transact-SQL运算符,算术运算符算术运算符主要用于实现数学计算功能,包含的运算符及功能说明如表4.2所示。主要包括+、-、*、/、%。4.3.2 比较运算符比较运算符用于比较两个表达式的值是否相等。Transact-SQL支持的比较运算符有、=、=、!=、!、!等。,4.3 Transact-SQL运算符,4.3.3 逻辑运算符当计算指定的布尔表达式时需要使用逻辑运算符。逻辑运算符可返回逻辑表达式被执行的最终结果,且返回值要么为真(TRUE),要么为假(FALSE)。Transact-SQL支持的的逻辑运算符如下:,4.3 Transact-SQL运算符,4.3.3 逻辑运算符SQL Server 2005还提供了4种通配符,这些通配符与逻辑运算符一起用于描述一组符合特定条件的表达式。Transact-SQL支持的通配符及其含义如表所示。,4.3 Transact-SQL运算符,4.3.3 逻辑运算符例4.4 通配符与逻辑运算符LIKE举例。在数据库teaching中可以用检查约束来验证表student的列Email的值。程序代码如下:USE teachingGOALTER TABLE student WITH NOCHECK ADD CONSTRAINT CK_student_like CHECK(Email like%.a-za-za-z),而teacher表的teacherno列的检查约束就可以如下表示:USE teachingGOALTER TABLE teacher WITH CHECK ADD CONSTRAINT CK_teacher_like CHECK(teacherno like t0-90-90-90-90-9),4.3 Transact-SQL运算符,4.3.3 逻辑运算符例4.5 逻辑运算符IN的使用方法。程序代码如下:USE teachingGOSELECT*FROM scoreWHERE studentno IN(0925111109,0823210007,0937221508)查询结果如图所示。,4.3 Transact-SQL运算符,4.3.3 逻辑运算符例4.6 逻辑运算符BETWEEN的使用方法。程序代码如下:USE teachingGOSELECT*FROM scoreWHERE final BETWEEN 90 AND 99,4.3 Transact-SQL运算符,4.3.4 字符串连接运算符字符串连接运算符形式与加号(+)一致,但用于两个字符串地连接。例如:SELECT abc+def+123,其结果为abcdef123。4.3.5 位运算符位运算操作符只能用于整数或二进制类型数据,用于在两个整型操作数之间执行位操作运算,主要包括&、|、。4.3.6 赋值运算符 Transact-SQL 中只有一个赋值运算符(=)。赋值运算符可以将数据值赋给某个特定的对象。还可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。,4.3 Transact-SQL运算符,4.3.7 运算符的优先级在SQL Server 2005中,当一个复杂的表达式中包含多种运算符时,运算符的优先顺序将决定表达式的计算和比较顺序。Transact-SQL支持的运算符的优先级按照从高到低的顺序排列如表所示 当一个表达式中的两个运算符有相同的运算符优先级别时,将按照它们在表达式中的位置对其从左到右进行求值。,4.4 Transact-SQL函数,SQL Server 2005为Transact-SQL语言提供了大量的功能函数以供编程使用。如果按照功能对这些函数进行划分,可以将它们大致划分为10类。字符串函数 文本/图像管理函数日期/时间类函数 数学计算函数SQL系统配置函数 系统函数安全管理函数 系统统计函数游标函数 元数据函数,4.4 Transact-SQL函数,4.4.1 数学函数数学函数用于对数值型字段和表达式进行处理,并返回运算结果。数学函数可以对SQL Server 2005提供的各种数值型数据进行处理。常用的数学函数如表所示,例4.7 输出下列函数的值CEILING(),FLOOR(),ROUND()。程序代码如下:select ceiling(13.6),floor(13.7),round(13.45767,3),4.4 Transact-SQL函数,4.4.2 聚合函数 聚合函数用于对一组值进行计算并返回一个单一的值。除COUNT 函数之外,聚合函数忽略空值。聚合函数经常与SELECT 语句的GROUP BY 子句一同使用。聚合函数的作用是在结果集中通过对被选列值的收集处理,并返回一个数值型的计算结果。常用聚合函数如表所示。,4.4 Transact-SQL函数,时间日期函数日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,并返回一个字符串、数字值或日期和时间值。日期时间函数可以在表达式中直接调用,常用的日期时间函数如表所示。,4.4 Transact-SQL函数,时间日期函数SQL Server 还提供了专用于时间函数的常见缩写,如表所示。,例4.8 从GETDATE函数返回的日期中提取年份、月份和天数值并输出。程序代码如下:SELECT DATENAME(YEAR,getdate()AS Year Name SELECT DATENAME(MONTH,getdate()AS Month Name SELECT DATENAME(DAY,getdate()AS Day Name,4.4 Transact-SQL函数,4.4.4 转换函数SQL Server 2005 没有自动执行数据类型的转换,如果需要进行不同类型数据之间的转换,可以使用转换函数CAST 或 CONVERT。1转换函数CONVERT和CAST的语法格式(1)CAST函数的语法格式。CAST(expression AS data_type),4.4 Transact-SQL函数,4.4.4 转换函数1转换函数CONVERT和CAST的语法格式(2)CONVERT函数的语法格式。其语法形式为:CONVERT(data_type(length),expression,style),4.4 Transact-SQL函数,4.4.4 转换函数2转换类型(1)显式转换。使用 CAST 和 CONVERT 转换函数可以将一种数据类型的表达式强制转换为另一种数据类型的表达式。如果尝试进行不可能的转换(例如,将包括字母的 char 表达式转换为 int),SQL Server 2005将显示错误消息。CAST 函数和 CONVERT 函数还可用于获取各种特殊数据格式,并可用于选择列表、WHERE 子句以及允许使用表达式的任何位置中。,4.4 Transact-SQL函数,4.4.4 转换函数2转换类型利用 CAST 或 CONVERT时,应该注意如下问题。需要提供的信息:要转换的表达式和要将指定的表达式转换为的数据类型。除非将被转换的值存储起来,否则转换仅在 CAST 函数或 CONVERT 函数的作用时间范围内有效。如果转换时没有指定数据类型的长度,则 SQL Server 自动将 30 作为长度值。,4.4 Transact-SQL函数,4.4.4 转换函数2转换类型(2)隐式转换。SQL Server 2005 可以自动对某些表达式进行转换,这种转换称为隐式转换。转换时不必使用 CAST 或 CONVERT 来进行这些隐式转换。,4.4 Transact-SQL函数,4.4.4 转换函数,例4.9日期和时间函数的使用示例。程序代码如下:PRINT 今天的日期是+CONVERT(VARCHAR(12),GETDATE(),101)PRINT 今年是+CONVERT(VARCHAR(12),Year(Getdate()PRINT 本月是+CONVERT(VARCHAR(12),Month(Getdate()+月PRINT 今天是+CONVERT(VARCHAR(12),day(Getdate()+号PRINT 后天是+CONVERT(VARCHAR(12),DATEADD(Dy,2,getdate(),101)PRINT 与2011年1月27号还差+CONVERT(VARCHAR(12),DATEDIFF(DAy,getdate(),01/27/2011)+天 PRINT 现在是星期+CONVERT(VARCHAR(12),DATEPART(Dw,getdate(),4.4 Transact-SQL函数,4.4.5 字符串函数字符串函数可以对二进制数据、字符串和表达式执行不同的运算,大多数字符串函数只能用于char和varchar数据类型以及明确转换成char和varchar的数据类型,少数几个字符串函数也可以用于binary和varbinary数据类型。常见字符串函数及其功能如表所示。,例4.10 使用 LTRIM 函数删除字符变量中的起始空格。程序代码如下:DECLARE string_to_trim varchar(60)SET string_to_trim=Five spacesSELECT Here is the string+LTRIM(string_to_trim)程序执行结果如下:-Here is the stringFive spaces(1 行受影响),4.4 Transact-SQL函数,4.4.6 自定义函数用户根据工作需要,可以创建用户定义函数,以提高程序开发和运行的质量。创建用户定义函数首先要根据业务需要选择函数类型。创建自定义函数的有两种方法:用户利用SQL Server Management Studio中的工具改写模板代码创建函数使用CREATE FUNCTION语句创建函数。,4.5 Transact-SQL表达式,Transact-SQL的表达式(expression)是指符号和运算符的组合,其计算结果为单个数据值。简单表达式可以是常量、变量、列或标量函数。复杂表达式是由运算符连接的一个或多个简单表达式。,4.5 Transact-SQL表达式,1复杂表达式两个表达式可以由一个运算符组合起来,只要它们具有该运算符支持的数据类型,并且满足至少下列一个条件:两个表达式有相同的数据类型。优先级低的数据类型可以隐式转换为优先级高的数据类型。CAST函数能够显式地将优先级低的数据类型转化成优先级高的数据类型,或者转换为一种可以隐式地转化成优先级高的数据类型的过渡数据类型。如果没有支持的隐式或显式转换,则两个表达式将无法组合。任何计算结果为字符串的表达式的排序规则都应遵循排序优先顺序规则。,4.5 Transact-SQL表达式,2.表达式结果(1)简单表达式的结果。对于由单个常量、变量、标量函数或列名组成的简单表达式,其数据类型、排序规则、精度、小数位数和值就是它所引用的元素的数据类型、排序规则、精度、小数位数和值。(2)复杂表达式的结果。用比较运算符或逻辑运算符组合两个表达式时,生成的数据类型为 Boolean,并且值为下列类型之一:TRUE、FALSE 或 UNKNOWN。由多个符号和运算符组成的复杂表达式的计算结果为单值结果。,4.6 Transact-SQL控制流语句,Transact-SQL为用户提供了控制流语句,用于控制程序的流程,控制流语句是指那些用来控制程序执行和流程分支的语句。在SQL Server 2005中,流程控制语句主要用来控制SQL语句、语句块或者存储过程的执行流程。,4.6 Transact-SQL控制流语句,4.6.1 IFELSE语句IFELSE语句是条件判断语句,其中,ELSE子句是可选的,最简单的IF语句没有ELSE子句部分。IFELSE语句用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。SQL Server允许嵌套使用IFELSE语句,而且嵌套层数没有限制。IFELSE语句的语法形式为:IF Boolean_expression sql_statement|statement_block ELSE sql_statement|statement_block,例4.11在Transact-SQL中使用IF语句。程序代码如下:DECLARE point AS intSet point=87IF point=60PRINT pass,very good!ELSEPRINT no pass,try again!,4.6 Transact-SQL控制流语句,4.6.2 BEGINEND语句BEGINEND语句能够将多个Transact-SQL语句组合成一个语句块,并将它们视为一个单元处理。在条件语句和循环等控制流程语句中,当符合特定条件便要执行两个或者多个语句时,就需要使用BEGINEND语句。BEGINEND语句的语法形式为:BEGIN sql_statement|statement_block END,例4.12 用BEGIN END 语句可使IF 语句在计算结果为FALSE时跳过语句块。程序代码如下:DECLARE MyVar floatSet MyVar=5.7If MyVar10.8 BEGIN SET MyVar=123.456 PRINT 变量MyVar的值为:PRINT CAST(MyVar AS varchar(12)ENDELSE PRINT CAST(MyVar AS varchar(12),4.6 Transact-SQL控制流语句,4.6.3 WHILE语句WHILECONTINUEBREAK语句用于设置重复执行 SQL 语句或语句块的条件。CONTINUE语句可以使程序跳过CONTINUE语句后面的语句。BREAK语句则使程序完全跳出循环。WHILE语句的语法形式为:WHILE Boolean_expression sql_statement|statement_block BREAK sql_statement|statement_block CONTINUE,例4.13 循环控制语句WHILE的使用方法。程序代码如下:USE teaching GODECLARE count AS INTSET count=1WHILE EXISTS(SELECT*FROM student WHERE point800)BEGINSET count=count+1 BREAK ENDPRINT 入学成绩800分的有:+CAST(count AS CHAR(2)+人,4.6 Transact-SQL控制流语句,4.6.4 CASE语句 CASE语句可以计算多个条件式,并将其中一个符合条件的结果表达式返回。CASE语句按照使用形式的不同,可以分为简单CASE语句和搜索CASE语句。简单CASE语句的语法格式为:CASE input_expression WHEN when_expression THEN result_expression.n ELSE else_result_expression END,例4.14 简单CASE语句举例。程序代码如下。USE teachingGOSELECT tname AS 姓名,department AS 院系,CASE prof WHEN 教授 THEN高级 WHEN 副教授 THEN 高级 WHEN 讲师 THEN 中级 WHEN 助教 THEN 初级 END AS 职称类别FROM teacherwhere department=计算机学院GO,程序执行结果如下:姓名 院系 职称类别-韩晋升 计算机学院 高级刘元朝 计算机学院 高级海封 计算机学院 高级卢明欣 计算机学院 中级(4 行受影响),4.6 Transact-SQL控制流语句,4.6.4 CASE语句 搜索CASE语句的语法格式为:CASE WHEN Boolean_expression THEN result_expression.n ELSE else_result_expression END,例4.15搜索CASE语句举例。程序代码如下。USE teachingGOSELECT studentno AS 学号,courseno AS 课程,CASE WHEN usually*0.2+final*0.8=90 THEN 优秀 WHEN usually*0.2+final*0.8=80 THEN 良好 WHEN usually*0.2+final*0.8=70 THEN 中等 WHEN usually*0.2+final*0.8=60 THEN 及格 WHEN usually*0.2+final*0.860 THEN 不及格 END AS 总评成绩FROM score where courseno in(c06108,c08106,c05109)GO,程序执行结果如下:学号 课程 总评成绩-0822111208 c05109 良好0822111208 c06108 优秀0824113307 c05109 良好.0935222201 c05109 优秀0937221508 c05109 良好0937221508 c08106 优秀(11 行受影响),4.6 Transact-SQL控制流语句,4.6.5 其他语句 1GO 语句 Go 语句是批处理的结束语句。批处理是一起提交并作为一个组执行的若干SQL语句。2.PRINT语句PRINT语句的功能是向客户端返回用户定义消息。PRINT语句的语法格式:PRINT local_variable|string_expr,4.6 Transact-SQL控制流语句,4.6.5 其他语句 3GOTO语句 GOTO语句可以使程序直接跳到指定的标有标识符的位置处继续执行,而位于GOTO语句和标识符之间的程序将不会被执行。标识符可以为数字与字符的组合,但必须以“:”结尾。GOTO语句的语法形式为:label:statement|statement_block GOTO label,例4.16 利用GOTO语句求出从1加到7的总和。程序代码如下:declare sum int,count int select sum=0,count=0label_1:select count=count+1select sum=sum+countif count=6goto label_1select count as 数值,sum as 17累加和,4.6 Transact-SQL