中国高校课件下载中心 》 教学资源 》 大学文库

《高级数据库》课程教学课件(讲稿)Chapter 3 T-SQL语言编程

文档信息
资源类别:文库
文档格式:PDF
文档页数:11
文件大小:394.85KB
团购合买:点击进入团购
内容简介
《高级数据库》课程教学课件(讲稿)Chapter 3 T-SQL语言编程
刷新页面文档预览

Chapter3T-SQL语言编程在SQLServer数据库中,Transact-SQL语言由以下及部分组成数据定义语言(DDL)。DDL用于对数据库以及数据库中的各种对象进行创建、删除、修改等操作。包括CREATE、ALTER、DROP等语句。■数据操纵语言(DML)。DML用于操纵数据库中的各种对象,检索和修改数据。包括SELECT、INSERT、UPDATE、DELETE等语句。-数据控制语言(DCL)。DCL用于安全管理,确定哪些用户可以查看或修改数据库中的数据。包括GRANT、REVOKE、DENY等语句。■T-SQL增加的语言元素。这部分不是ANSISQL所包含的内容,而是Microsoft为了用户编程的方便而增加的语言元素。这些语言元素包括变量、运算符、表达式、内置函数、流程控制语句等,这些T-SQL语句都可以在查询分析器中交互执行。本章将介绍这部分增加的语言元素。3.1T-SQL程序结构3.1.1批批是一组SQL语句的集合,一个批以结束符GO而终结。批中的所有语句被一次性提交,SQLServer将这些语句编译为一个执行单元。只要其中任意一个SQL语句存在语法错误,SQLServer将取消整个批内所有语句的执行。使用批的基本规则:■CREATE语句应单独构成一个批,不能与其它SQL语句组合使用■使用ALTERTABLE语句修改表结构后,不能在同一个批中使用新定义的列■批命令GO和SQL语句不能在同一行。3.1.2事务事务是一个完整的工作单元,一个事务内的所有语句作为整体执行,要么全部执行,要么全部不执行。遇到错误时,可以回滚事务,取消事务内所做的所有改变,从而保证数据库中数据的一致性和可恢复性。一个事务一般以BEGINTRANSACTION开始,以COMMIT(提交)或ROLLBACK(回滚)结束。事务与批的区别:-批是一组整体编译的SQL语句,事务是一组作为单个逻辑工作单元执行的SQL语句;■批语句的组合发生在编译时刻,事务中语句的组合发生在执行时刻。3.1.3程序结构一个T-SQL程序包含若干个事务,一个事务又包含若干个以GO结束的批处理,一个批处理包含若干条T-SQL语句

Chapter 3 T-SQL 语言编程 在 SQL Server 数据库中,Transact-SQL 语言由以下及部分组成: ◼ 数据定义语言(DDL)。DDL 用于对数据库以及数据库中的各种对象进行创建、删除、 修改等操作。包括 CREATE、ALTER、DROP 等语句。 ◼ 数据操纵语言(DML)。DML 用于操纵数据库中的各种对象,检索和修改数据。包括 SELECT、INSERT、UPDATE、DELETE 等语句。 ◼ 数据控制语言(DCL)。DCL 用于安全管理,确定哪些用户可以查看或修改数据库中的 数据。包括 GRANT、REVOKE、DENY 等语句。 ◼ T-SQL 增加的语言元素。这部分不是 ANSI SQL 所包含的内容,而是 Microsoft 为了用 户编程的方便而增加的语言元素。这些语言元素包括变量、运算符、表达式、内置函数、 流程控制语句等,这些 T-SQL 语句都可以在查询分析器中交互执行。本章将介绍这部 分增加的语言元素。 3.1 T-SQL 程序结构 批 批是一组 SQL 语句的集合,一个批以结束符 GO 而终结。批中的所有语句被一次性提 交,SQL Server 将这些语句编译为一个执行单元。只要其中任意一个 SQL 语句存在语法错 误,SQL Server 将取消整个批内所有语句的执行。 使用批的基本规则: ◼ CREATE 语句应单独构成一个批,不能与其它 SQL 语句组合使用; ◼ 使用 ALTER TABLE 语句修改表结构后,不能在同一个批中使用新定义的列; ◼ 批命令 GO 和 SQL 语句不能在同一行。 事务 事务是一个完整的工作单元,一个事务内的所有语句作为整体执行,要么全部执行,要 么全部不执行。遇到错误时,可以回滚事务,取消事务内所做的所有改变,从而保证数据库 中数据的一致性和可恢复性。一个事务一般以 BEGIN TRANSACTION 开始,以 COMMIT(提 交)或 ROLLBACK(回滚)结束。 事务与批的区别: ◼ 批是一组整体编译的 SQL 语句,事务是一组作为单个逻辑工作单元执行的 SQL 语 句; ◼ 批语句的组合发生在编译时刻,事务中语句的组合发生在执行时刻。 程序结构 一个 T-SQL 程序包含若干个事务,一个事务又包含若干个以 GO 结束的批处理,一个 批处理包含若干条 T-SQL 语句

【例3-1]在以下案例中,整个T-SQL程序包含一个事务,该事务中又包含两个批处理,第一个删除了081101学生的选课成绩记录,第二个查询成绩表CJB(能够查询到删除后的结果),但该事务最终以ROLLBACK回滚结束,并未真正实施删除,所以最后一个批处理的查询仍然能够查询到081101学生的选课成绩记录。BEGIN TRANDELETE FROM CJB WHERE CJB.学号=O811O1GOSELECT*FROM CJBGOROLLBACKSELECT *FROM CJBGO3.2常量与变量3.2.1常量常量是指在程序运行过程中值不变的量。根据常量值的不同类型,常量分为:际字符串常量:用单引号括起来,如CHINA";图整型常量:二进制、十六进制和十进制;-实型常量:定点表示,如3.1415926;浮点表示,如101.5E5-日期时间常量:用单引号将表示日期时间的字符串括起来构成,如1998-04-21;+货币常量:以“S"作为前缀的一个整型或实型常量数据,如$12;■唯一标识常量:用于表示全局唯一标识符(GUID)值的字符串,可以使用字符串或十六进制字符串格式指定。3.2.2变量变量用于临时存放数据,变量中的数据随着程序的执行而变化。变量有名称及数据类型两个属性。变量名用于标识该变量,必须是一个合法的标识符,不能是T-SQL的保留字;数据类型确定了该变量存放值的格式及允许的运算。(1)变量的分类■全局变量:全局变量由系统提供且预先声明,通过在名称前加两个@来区别于局部变量。例如,@@ERROR返回执行的上一个T-SQL语句的错误号,@@VERSION用于查看当前SQLServer版本。■局部变量:局部变量用于保存单个数据值,首字母为@。(2)局部变量的定义在批处理或存储过程中用DECLARE语句声明局部变量,所有局部变量在声明后均初始化为NULL。DECLARE语法格式如下:DECLARE{@local_variabledata_type[=value]][,n]语法说明:

【例 3-1】在以下案例中,整个 T-SQL 程序包含一个事务,该事务中又包含两个批处理,第 一个删除了 081101 学生的选课成绩记录,第二个查询成绩表 CJB(能够查询到删除后的结 果),但该事务最终以 ROLLBACK 回滚结束,并未真正实施删除,所以最后一个批处理的查 询仍然能够查询到 081101 学生的选课成绩记录。 BEGIN TRAN DELETE FROM CJB WHERE CJB.学号='081101' GO SELECT * FROM CJB GO ROLLBACK SELECT * FROM CJB GO 3.2 常量与变量 常量 常量是指在程序运行过程中值不变的量。根据常量值的不同类型,常量分为: ◼ 字符串常量:用单引号括起来,如‘CHINA’; ◼ 整型常量:二进制、十六进制和十进制; ◼ 实型常量:定点表示,如 3.1415926;浮点表示,如 101.5E5; ◼ 日期时间常量:用单引号将表示日期时间的字符串括起来构成,如‘1998-04-21’; ◼ 货币常量:以“$”作为前缀的一个整型或实型常量数据,如$12; ◼ 唯一标识常量:用于表示全局唯一标识符(GUID)值的字符串,可以使用字符串或十六 进制字符串格式指定。 变量 变量用于临时存放数据,变量中的数据随着程序的执行而变化。变量有名称及数据类型 两个属性。变量名用于标识该变量,必须是一个合法的标识符,不能是 T-SQL 的保留字; 数据类型确定了该变量存放值的格式及允许的运算。 (1)变量的分类 ◼ 全局变量:全局变量由系统提供且预先声明,通过在名称前加两个@来区别于局部变量。 例如,@@ERROR 返回执行的上一个 T-SQL 语句的错误号,@@VERSION 用于查看当 前 SQL Server 版本。 ◼ 局部变量:局部变量用于保存单个数据值,首字母为@。 (2)局部变量的定义 在批处理或存储过程中用 DECLARE 语句声明局部变量,所有局部变量在声明后均初始 化为 NULL。DECLARE 语法格式如下: DECLARE { @local_variable data_type [ = value ] } [ ,.n] 语法说明:

localvariable:局部变量名,用@标识。data_type:数据类型,定义局部变量的数据类型。=value:为变量赋值,值可以使常量或表达式,但必须与变量声明类型匹配。n:表示可定义多个变量,各变量间用逗号隔开(3)局部变量的赋值声明局部变量后,可用SET或SELECT语句为其赋值。最大区别:一个SET语句只能为一个变量赋值,一个SELECT语句可以初始化多个局部变量。SET@local_variable=expressionSELECT(@localvariable=expression)["n]【例3-2】创建局部变量@var1、@var2并赋值,然后输出变量的值。DECLARE @varl char(10),@var2 char(20SET@varl-中国SET@var2=@var1+是一个伟大的国家SELECT@var2AS输出结果-PRINT @var2DECLARE @varlchar(10)@var2char(20SELEcT@var1=中国,@var2-@var1+是一个伟大的国家SELECT @var2 AS输出结果【例3-3】创建一个名为Sex的局部变量,并在SELECT语句中使用该局部变量查找表XSB中所有女同学的学号、姓名。DECLARE @sex bitSET @sex=0SELECTXSB.学号,XSB.姓名FROMXSBWHERE XSB.性别-@sex【例3-4】使用查询结果为变量赋值。DECLARE @name char(8)SET @name=(SELECT XSB.姓名 FROM XSB WHERE XSB.学号='081101)SELECT @name+‘是个好学生(4)表数据类型变量的定义与赋值DECLARE{@table_variable_name[AS]TABLE({|][..]]【例3-5】声明一个表数据类型变量并向变量中插入数据,--申明表变量DECLARE @var tableAS TABLE(num char(6) NOT NULL PRIMARY KEY,name char(8) NOT NULL,Sex bit NULL)

◼ local_variable:局部变量名,用@标识。 ◼ data_type:数据类型,定义局部变量的数据类型。 ◼ =value:为变量赋值,值可以使常量或表达式,但必须与变量声明类型匹配。 ◼ n:表示可定义多个变量,各变量间用逗号隔开 (3)局部变量的赋值 声明局部变量后,可用 SET 或 SELECT 语句为其赋值。最大区别:一个 SET 语句只能为 一个变量赋值,一个 SELECT 语句可以初始化多个局部变量。 SET @local_variable = expression SELECT {@local_variable = expression} [ ,.n] 【例 3-2】创建局部变量@var1、@var2 并赋值,然后输出变量的值。 DECLARE @var1 char(10),@var2 char(20) SET @var1='中国' SET @var2=@var1+'是一个伟大的国家' SELECT @var2 AS '输出结果' -PRINT @var2 DECLARE @var1 char(10),@var2 char(20) SELECT @var1='中国',@var2=@var1+'是一个伟大的国家' SELECT @var2 AS '输出结果' 【例 3-3】创建一个名为 sex 的局部变量,并在 SELECT 语句中使用该局部变量查找表 XSB 中所有女同学的学号、姓名。 DECLARE @sex bit SET @sex=0 SELECT XSB.学号,XSB.姓名 FROM XSB WHERE XSB.性别=@sex 【例 3-4】使用查询结果为变量赋值。 DECLARE @name char(8) SET @name=(SELECT XSB.姓名 FROM XSB WHERE XSB.学号='081101') SELECT @name+'是个好学生' (4)表数据类型变量的定义与赋值 DECLARE { @table_variable_name [AS] TABLE ( { | } [ ,. ] ) } 【例 3-5】声明一个表数据类型变量并向变量中插入数据。 -申明表变量 DECLARE @var_table AS TABLE( num char(6) NOT NULL PRIMARY KEY, name char(8) NOT NULL, sex bit NULL)

--向表变量插入数据INSERT INTO @var tableSELECT学号,姓名,性别FROMXSB-查看表变量SELECT * FROM @var table内置函数3.3在程序设计过程中,常常调用系统提供的函数。T-SQL编程语言提供3种系统内置函数5行集函数:返回值为对象的函数,该对象可在T-SQL语句中作为表引用;聚合函数:对一组值操作,返回单一的汇总值,之前SELECT语句中经常与GROUPBY子句一起使用MAX/MIN/AVG/COUNT就属于聚合函数;标量函数:输入参数的类型为基本类型,返回值也为基本类型。3.3.1数学函数数学函数对数值型输入参数值执行计算,并返回一个数值,这些函数都是标量函数。(1)ABS函数:返回数值的绝对值。ABS(numeric_expression)【例3-6】使用ABS函数返回绝对值SELECT ABS(-5),ABS(O),ABS(8)(2)ROUND函数:返回数值表达式并四舍五入为指定的长度或精度。ROUND(numeric_expression,length[.function])numeric_expression为要进行四舍五入的数值表达式,length为四舍五入的精度function是要执行的操作类型,默认值为O,进行四舍五入处理,否则进行截断处理。【例3-7】使用ROUND函数进行四舍五入SELECTROUND(123.4567,2),ROUND(123.4567,-2),ROUND(123.4567,0)(3)CEILING函数VS.FLOOR函数:返回大于或等于所给数值的最小整数(即向上取整)VS.返回小于或等于所给数值的最大整数(即向下取整)。CEILING(numeric_expression)FLOOR(numeric_expression)【例3-8】使用CEILING函数向上取整,FLOOR函数向下取整SELECT CEILING(123.45),FLOOR(123.45),CEILING(-123.45),FLOOR(-123.45),CEILING(0)(4)RAND函数:返回0~1之间的一个随机值。RAND([seed])参数seed是指定种子值的整型表达式,返回值类型为float。如果未指定seed,则随机分配种子值。【例3-9]使用RAND函数生成一个0-50之间的随机值(每一次执行均会生成一个随机值)。SELECTRAND()*50AS随机值

-向表变量插入数据 INSERT INTO @var_table SELECT 学号,姓名,性别 FROM XSB -查看表变量 SELECT * FROM @var_table 3.3 内置函数 在程序设计过程中,常常调用系统提供的函数。T-SQL 编程语言提供 3 种系统内置函数 ◼ 行集函数:返回值为对象的函数,该对象可在 T-SQL 语句中作为表引用; ◼ 聚合函数:对一组值操作,返回单一的汇总值,之前 SELECT 语句中经常与 GROUP BY 子句一起使用 MAX/MIN/AVG/COUNT 就属于聚合函数; ◼ 标量函数:输入参数的类型为基本类型,返回值也为基本类型。 数学函数 数学函数对数值型输入参数值执行计算,并返回一个数值,这些函数都是标量函数。 (1)ABS 函数:返回数值的绝对值。 ABS ( numeric_expression ) 【例 3-6】使用 ABS 函数返回绝对值 SELECT ABS(-5),ABS(0),ABS(8) (2)ROUND 函数:返回数值表达式并四舍五入为指定的长度或精度。 ROUND ( numeric_expression, length [,function] ) numeric_expression 为要进行四舍五入的数值表达式,length 为四舍五入的精度, function 是要执行的操作类型,默认值为 0,进行四舍五入处理,否则进行截断处理。 【例 3-7】使用 ROUND 函数进行四舍五入 SELECT ROUND(123.4567,2),ROUND(123.4567,-2),ROUND(123.4567,0) (3)CEILING 函数 VS. FLOOR 函数:返回大于或等于所给数值的最小整数(即向上取整) VS.返回小于或等于所给数值的最大整数(即向下取整)。 CEILING ( numeric_expression ) FLOOR ( numeric_expression ) 【例 3-8】使用 CEILING 函数向上取整,FLOOR 函数向下取整 SELECT CEILING(123.45),FLOOR(123.45), CEILING(-123.45),FLOOR(-123.45),CEILING(0) (4)RAND 函数:返回 0~1 之间的一个随机值。 RAND ( [ seed ] ) 参数 seed 是指定种子值的整型表达式,返回值类型为 float。如果未指定 seed,则随机 分配种子值。 【例3-9】使用RAND函数生成一个0-50之间的随机值(每一次执行均会生成一个随机值)。 SELECT RAND()*50 AS '随机值

3.3.2字符串函数字符串函数对字符串输入值执行操作,返回字符串或数值。这些函数都是标量函数。(1)UPPER函数VS.LOWER函数:将字符串中的大写(小写)字母转换成小写(大写)字母后返回整个字符串。UPPER(character_expression)LOWER(character_expression)【例3-10】使用UPPER/LOWER函数返回aBcDeFgSELECT UPPER("aBcDeFg')LOWER('aBcDeFg')(2)SUBSTRING函数:返回字符串中的一部分。SUBSTRING(character_expression,start,length)返回从字符串character_expression中从位置start开始截取长度为length的子串。【例3-11】返回字符串'abcdefg中从位置3开始的2个字符。SELECT SUBSTRING('abcdefg',3,2)【例3-12】使用SUBSTRING函数返回王姓同学信息SELECT*FROM XSBWHERESUBSTRING(姓名,1,1)=王(3)REPLACE函数:将字符串1中的字符串2部分用字符串3替换。REPLACE("string_expression1',string_expression2",'string_expression3)【例3-13】使用REPLACE函数将专业中的信管替换为信息管理。BEGIN TRANUPDATE XSBSETXSB.专业-REPLACE(XSB,专业,信管,信息管理)SELECT*FROMXSBROLLBACK(4)STUFF函数:将字符串1中从start开始的length个字符用字符串2来替换。STUFF(string_expression1,start,length,string_expression2)【例3-14】使用STUFF函数将学号08改为09。BEGIN TRANUPDATE XSBSETXSB.学号=STUFF(XSB.学号1,2,09)SELECT *FROMXSBROLLBACK3.3.3时间日期函数时间日期函数对日期和时间输入值执行操作,并返回一个字符串、数字值或日期和时间值。这些函数都是标量函数。(1)GETDATE函数:返回当前系统日期和时间,返回值类型为datetime。GETDATEO

字符串函数 字符串函数对字符串输入值执行操作,返回字符串或数值。这些函数都是标量函数。 (1)UPPER 函数 VS. LOWER 函数:将字符串中的大写(小写)字母转换成小写(大写)字 母后返回整个字符串。 UPPER ( character_expression ) LOWER ( character_expression ) 【例 3-10】使用 UPPER/LOWER 函数返回'aBcDeFg' SELECT UPPER('aBcDeFg'),LOWER('aBcDeFg') (2)SUBSTRING 函数:返回字符串中的一部分。 SUBSTRING ( character_expression , start , length ) 返回从字符串 character_expression 中从位置 start 开始截取长度为 length 的子串。 【例 3-11】返回字符串'abcdefg'中从位置 3 开始的 2 个字符。 SELECT SUBSTRING('abcdefg',3,2) 【例 3-12】使用 SUBSTRING 函数返回王姓同学信息 SELECT * FROM XSB WHERE SUBSTRING(姓名,1,1)='王' (3)REPLACE 函数:将字符串 1 中的字符串 2 部分用字符串 3 替换。 REPLACE ( 'string_expression1' , 'string_expression2' , 'string_expression3' ) 【例 3-13】使用 REPLACE 函数将专业中的信管替换为信息管理。 BEGIN TRAN UPDATE XSB SET XSB.专业=REPLACE(XSB.专业,'信管','信息管理') SELECT * FROM XSB ROLLBACK (4)STUFF 函数:将字符串 1 中从 start 开始的 length 个字符用字符串 2 来替换。 STUFF ( string_expression1 , start, length, string_expression2 ) 【例 3-14】使用 STUFF 函数将学号 08 改为 09。 BEGIN TRAN UPDATE XSB SET XSB.学号=STUFF(XSB.学号,1,2,'09') SELECT * FROM XSB ROLLBACK 时间日期函数 时间日期函数对日期和时间输入值执行操作,并返回一个字符串、数字值或日期和时间 值。这些函数都是标量函数。 (1)GETDATE 函数:返回当前系统日期和时间,返回值类型为 datetime。 GETDATE ()

(2)YEARMONTH\DAY函数:分别返回指定日期的年、月、日部分,返回值为整数。YEAR(date)MONTH(date)DAY (date)【例3-15】使用GETDATE函数显示当前时间\当前年份】当前月份当前日期SELECT GETDATE(),YEAR(GETDATE()),MONTH(GETDATE()),DAY(GETDATE())(3)DATEADD函数:在指定日期时间的基础上加上一段时间,得到一个新的datetime值并返回。其中参数datepart是规定应向日期和时间的哪一部分计算新值的参数。常用取值包括YEARIMONTH\DAYWEEKIHOURIMINUTEDATEADD(datepart,number,date)【例3-16】显示三周后的日期DECLARE @newdate DATESET @newdate-DATEADD(WEEK,3,GETDATE())SELECT @newdate AS三周后的日期(4)DATENAME函数:以NVARCHAR类型返回代表指定日期的指定部分的字符串。其中参数detapart规定了日期时间部分。DATENAME(datepart,date)【例3-17】显示当前日期处于本年的第几个月和第几个星期。DECLARE @date DATESET @date-GETDATE()SELECT DATENAME(MONTH@date)AS 月份,DATENAME(WEEK,@dateAS星期3.3.4转换函数CAST和CONVERT函数将某种数据类型的表达式转换为另一种数据类型的值并返回常用的类型转换有以下几种情况:日期型→字符型、数值型→字符型,语法如下:CAST(expressionASdata_type[(length)])CONVERT(data_type[(length)l,expression)【例3-18】数值型→字符型转换DECLARE @county char(4),@numintSELEcT @county=i中国,@num-1SELECT@COunty+'在世界排名第i+CAST(@numASCHAR(2))【例3-19】显示当前为XXXX年XX月XX日:日期型>字符型转换DECLARE @date dateSET @date-GETDATE()PRINT CAST(YEAR(@date)AS char(4))+'年+CAST(MONTH(@date)ASchar(2))+月+CAST(DAY(@date)AS char(2))+日

(2)YEAR\MONTH\DAY 函数:分别返回指定日期的年、月、日部分,返回值为整数。 YEAR (date) MONTH (date) DAY (date) 【例 3-15】使用 GETDATE 函数显示当前时间\当前年份\当前月份\当前日期 SELECT GETDATE(),YEAR(GETDATE()),MONTH(GETDATE()),DAY(GETDATE()) (3)DATEADD 函数:在指定日期时间的基础上加上一段时间,得到一个新的 datetime 值 并返回。其中参数 datepart 是规定应向日期和时间的哪一部分计算新值的参数。常用取值 包括 YEAR\MONTH\DAY\WEEK\HOUR\MINUTE DATEADD ( datepart, number, date) 【例 3-16】显示三周后的日期 DECLARE @newdate DATE SET @newdate=DATEADD(WEEK,3,GETDATE()) SELECT @newdate AS '三周后的日期' (4)DATENAME 函数:以 NVARCHAR 类型返回代表指定日期的指定部分的字符串。其中 参数 detapart 规定了日期时间部分。 DATENAME ( datepart, date) 【例 3-17】显示当前日期处于本年的第几个月和第几个星期。 DECLARE @date DATE SET @date=GETDATE() SELECT DATENAME(MONTH,@date) AS'月份',DATENAME(WEEK,@date) AS '星期' 转换函数 CAST 和 CONVERT 函数将某种数据类型的表达式转换为另一种数据类型的值并返回。 常用的类型转换有以下几种情况:日期型➔字符型、数值型➔字符型,语法如下: CAST ( expression AS data_type [ (length) ] ) CONVERT ( data_type [ (length) ], expression ) 【例 3-18】数值型➔字符型转换 DECLARE @county char(4),@num int SELECT @county='中国',@num=1 SELECT @county+'在世界排名第'+CAST(@num AS CHAR(2)) 【例 3-19】显示当前为 XXXX 年 XX 月 XX 日:日期型➔字符型转换 DECLARE @date date SET @date=GETDATE() PRINT CAST(YEAR(@date) AS char(4))+'年' +CAST(MONTH(@date) AS char(2))+'月' +CAST(DAY(@date) AS char(2))+'日

3.4流程控制语句在设计程序时,经常需要利用各种流程控制语句,改变计算机的执行流程以满足程序设计的需要。SQLServer提供了以下流程控制语句。说明控制语句控制语句说明BEGIN.--END语句块CONTINUE用于重新开始下一次循环IF--ELSE条件语句BREAK用于退出最内层的循环CASE分支语句无条件返回RETURNWHILE循环语句WAITFOR为语句的执行设置延迟注:如果条件表达式Boolean_expression中含有SELECT语句,则必须用圆括号将SELECT语句括起来,运算结果为TRUE或FALSE3.4.1BEGIN...END语句块在T-SOL中可以定义BEGIN··END语句块。当要执行多条T-SOL语句时就需要使用BEGINEND将这些语句定义成一个语句块,作为一组语句来执行。语法格式如下BEGIN[sql_statement|statement_block]END关键字BEGIN是T-SQL语句块的起始位置,END标识同一个T-SQL语句块的结尾。sqlstatement是语句块中的T-SQL语句。BEGIN-END可以嵌套使用。3.4.2CASE分支语句语法格式1:CASE input_expressionWHENwhen_expression THEN result_expression[...n][ELSEelse_result_expression]END语法格式2:CASEWHENBoolean_expressionTHENresult_expression[...][ELSEelse_result_expression]END【例3-20】使用第一种语法格式的CASE语句,根据性别值1/0输出"男"或"女"。SELECTXSB.学号,XSB.姓名,性别CASEXSB.性别WHEN1THEN男WHEN O THEN女'ENDFROMXSB

3.4 流程控制语句 在设计程序时,经常需要利用各种流程控制语句,改变计算机的执行流程以满足程序设 计的需要。SQL Server 提供了以下流程控制语句。 控制语句 说明 控制语句 说明 BEGIN.END 语句块 CONTINUE 用于重新开始下一次循环 IF.ELSE 条件语句 BREAK 用于退出最内层的循环 CASE 分支语句 RETURN 无条件返回 WHILE 循环语句 WAITFOR 为语句的执行设置延迟 注:如果条件表达式 Boolean_expression 中含有 SELECT 语句,则必须用圆括号将 SELECT 语句括起来,运算结果为 TRUE 或 FALSE。 BEGIN.END 语句块 在 T-SQL 中可以定义 BEGIN.END 语句块。当要执行多条 T-SQL 语句时,就需要使用 BEGIN.END 将这些语句定义成一个语句块,作为一组语句来执行。语法格式如下: BEGIN { sql_statement | statement_block } END 关键字 BEGIN 是 T-SQL 语句块的起始位置,END 标识同一个 T-SQL 语句块的结尾。 sql_statement 是语句块中的 T-SQL 语句。BEGIN.END 可以嵌套使用。 CASE 分支语句 语法格式 1: CASE input_expression WHEN when_expression THEN result_expression [ .n ] [ ELSE else_result_expression ] END 语法格式 2: CASE WHEN Boolean_expression THEN result_expression [ .n ] [ ELSE else_result_expression ] END 【例 3-20】使用第一种语法格式的 CASE 语句,根据性别值 1/0 输出“男”或“女”。 SELECT XSB.学号,XSB.姓名,'性别'= CASE XSB.性别 WHEN 1 THEN '男' WHEN 0 THEN '女' END FROM XSB

若使用第二种语法格式,写法如下:SELECTXSB.学号,XSB.姓名,性别=CASEWHENXSB.性别-1 THEN男WHEN XSB.性别-O THEN女ENDFROMXSB【例3-21】男生总学分加2分,女生总学分加3分。BEGIN TRANSELECT*FROMXSBUPDATE XSBSET XSB.总学分+CASEXSB.性别WHEN 1 THEN 2WHEN 0 THEN 3ENDSELECT *IFROMXSBROLLBACK【例3-22】查询学生学号、平均成绩以及平均成绩等级(90分以上优秀,89-90良好,60-80及格,60分以下不及格)。SELECTCJB.学号,AVG(CJB.成绩)AS平均成绩,成绩等级CASEWHENAVG(CJB.成绩)>=90THEN优秀WHENAVG(CJB.成绩)>=80THEN良好WHENAVG(CJB.成绩)>=60THEN及格ELSE不及格!ENDFROMCJBGROUPBYCJB.学号【例3-23】输出学号为081101同学的平均成绩及其等级(使用变量)DECLARE @id char(6),@cj intSET@id=-081101-SET@cj=(SELECTAVG(CJB.成绩)FROM CJB WHERECJB.学号-@id)SELECT@idAS学号,@cjAS平均成绩',成绩等级!CASEWHEN @cj>=90 THEN '优秀!WHEN @cj>=80 THEN‘良好'WHEN@cj>=60 THEN及格不及格!ELSEEND

若使用第二种语法格式,写法如下: SELECT XSB.学号,XSB.姓名,'性别'= CASE WHEN XSB.性别=1 THEN '男' WHEN XSB.性别=0 THEN '女' END FROM XSB 【例 3-21】男生总学分加 2 分,女生总学分加 3 分。 BEGIN TRAN SELECT * FROM XSB UPDATE XSB SET XSB.总学分+= CASE XSB.性别 WHEN 1 THEN 2 WHEN 0 THEN 3 END SELECT * FROM XSB ROLLBACK 【例 3-22】查询学生学号、平均成绩以及平均成绩等级(90 分以上优秀,89-90 良好,60- 80 及格,60 分以下不及格)。 SELECT CJB.学号,AVG(CJB.成绩)AS '平均成绩','成绩等级'= CASE WHEN AVG(CJB.成绩)>=90 THEN '优秀' WHEN AVG(CJB.成绩)>=80 THEN '良好' WHEN AVG(CJB.成绩)>=60 THEN '及格' ELSE '不及格' END FROM CJB GROUP BY CJB.学号 【例 3-23】输出学号为 081101 同学的平均成绩及其等级(使用变量) DECLARE @id char(6),@cj int SET @id='081101' SET @cj=(SELECT AVG(CJB.成绩) FROM CJB WHERE CJB.学号=@id) SELECT @id AS '学号',@cj AS '平均成绩','成绩等级'= CASE WHEN @cj>=90 THEN '优秀' WHEN @cj>=80 THEN '良好' WHEN @cj>=60 THEN '及格' ELSE '不及格' END

3.4.3IF...ELSE条件语句语法格式:/*条件表达式*/IFBoolean_expression/*条件表达式为真时执行*/(sqlstatement|statementblock)[ELSE/+条件表达式为假时执行*/【sql_statement|statementblock]]IF语句的执行流程如图所示。条件表达式条件表达式NNYTYBAATF语句的下一语句IF语句的下一语句+【例3-24】使用IF..ELSE条件语句改写例8.DECLARE @id char(6),@cj int, @dj char(6)SET @id=-'081101SET@cJ=(SELECTAVG(CJB.成绩)FROMCJB WHERECJB.学号-@id)IF@cj>=90SET@dj='优秀ELSE IF@cj>=80SET@dj-良好!ELSE IF @cj>=60SET@dj-"及格!ELSESET@dj-不及格SELECT@idAS学号,@cjAS平均成绩,成绩等级=@djGO【例3-25】如果"计算机基础"课程的平均成绩高于75分,则显示平均成绩高于75分"。否则显示"平均成绩低于75分”,并给每个选课学生的成绩加5分。DECLARE @name char(20),@cj intSET@name-计算机基础SET@Cj=(SELECTAVG(CJB.成绩)FROMCJBWHERECJB.课程编号=(SELECTKCB.课程编号FROMKCBWHEREKCB.课程名称-@name))BEGIN TRANSELECT*FROM CJBIF @cj>=75PRNT平均成绩高于75分ELSEBEGIN

IF.ELSE 条件语句 语法格式: IF Boolean_expression /*条件表达式*/ { sql_statement | statement_block } /*条件表达式为真时执行*/ [ ELSE { sql_statement | statement_block } ] /*条件表达式为假时执行*/ IF 语句的执行流程如图所示。 【例 3-24】使用 IF.ELSE 条件语句改写例 8. DECLARE @id char(6),@cj int, @dj char(6) SET @id='081101' SET @cj=(SELECT AVG(CJB.成绩) FROM CJB WHERE CJB.学号=@id) IF @cj>=90 SET @dj='优秀' ELSE IF @cj>=80 SET @dj='良好' ELSE IF @cj>=60 SET @dj='及格' ELSE SET @dj='不及格' SELECT @id AS '学号',@cj AS '平均成绩','成绩等级'=@dj GO 【例 3-25】如果“计算机基础”课程的平均成绩高于 75 分,则显示“平均成绩高于 75 分”。否 则显示“平均成绩低于 75 分”,并给每个选课学生的成绩加 5 分。 DECLARE @name char(20),@cj int SET @name='计算机基础' SET @cj=(SELECT AVG(CJB.成绩) FROM CJB WHERE CJB.课程编号=(SELECT KCB.课程编号 FROM KCB WHERE KCB.课程名称=@name)) BEGIN TRAN SELECT * FROM CJB IF @cj>=75 PRINT '平均成绩高于75分' ELSE BEGIN

PRINT平均成绩低于75分UPDATE CJBSETCJB.成绩+=5WHERE CJB.课程编号=(SELECT KCB.课程编号 FROM KCBWHEREKCB.课程名称=@name)ENDSELECT* FROMCJBROLLBACK3.4.4WHILE循环语句如果需要重复执行程序中的一部分语句,则可使用WHILE循环语句实现。语法格式如下:/*条件表达式*/WHILEBoolean_expression/+T-SQL语句序列构成的循环体+/(sql_statement|statement_block]WHILE语句的执行流程如图所示。条件表达式NYT循环体WHILE语句的下一条语句【例3-26】使用RAND函数生成5个0-50之间的随机整数。DECLARE @num int-1WHILE @num<-5BEGINPRINT CEILING(RAND()*5O)SET @num+=1END【例3-27】将学号081101学生的总学分使用循环修改到60分,每次只加2分,并输出循环的次数。DECLARE @xf int,@n int=OSET@xf=(SELECTXSB.总学分FROMXSB WHEREXSB.学号-'081101)BEGIN TRANWHILE @xf<60BEGINUPDATEXSBSETXSB.总学分+=2WHEREXSB.学号-081101SET @xf+=2SET @n+=1ENDSELECT@nAS循环次数SELECT * FROM XSBROLLBACK

PRINT '平均成绩低于75分' UPDATE CJB SET CJB.成绩+=5 WHERE CJB.课程编号=(SELECT KCB.课程编号 FROM KCB WHERE KCB.课程 名称=@name) END SELECT * FROM CJB ROLLBACK WHILE 循环语句 如果需要重复执行程序中的一部分语句,则可使用 WHILE 循环语句实现。 语法格式如下: WHILE Boolean_expression /*条件表达式*/ { sql_statement | statement_block } /*T-SQL 语句序列构成的循环体*/ WHILE 语句的执行流程如图所示。 【例 3-26】使用 RAND 函数生成 5 个 0-50 之间的随机整数。 DECLARE @num int=1 WHILE @num<=5 BEGIN PRINT CEILING(RAND()*50) SET @num+=1 END 【例 3-27】将学号 081101 学生的总学分使用循环修改到 60 分,每次只加 2 分,并输出循 环的次数。 DECLARE @xf int,@n int=0 SET @xf=(SELECT XSB.总学分 FROM XSB WHERE XSB.学号='081101') BEGIN TRAN WHILE @xf<60 BEGIN UPDATE XSB SET XSB.总学分+=2 WHERE XSB.学号='081101' SET @xf+=2 SET @n+=1 END SELECT @n AS '循环次数' SELECT * FROM XSB ROLLBACK

共11页,试读已结束,阅读完整版请下载
刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档