410 likes | 618 Views
第8章 Transact-SQL程序设计. 8.1 Transact-SQL语言基础 8.2 批处理与程序流程控制语句 8.3 系统内置函数 8.4 用户自定义函数. 8.1 Transact-SQL语言基础. 8.1.1 标识符 8.1.2 常量 8.1.3 变量 8.1.4 运算符与表达式. 8.1.1 标识符. 1 .常规标识符 常规标识符应符合如下规则:
E N D
第8章 Transact-SQL程序设计 • 8.1 Transact-SQL语言基础 • 8.2 批处理与程序流程控制语句 • 8.3 系统内置函数 • 8.4 用户自定义函数
8.1 Transact-SQL语言基础 • 8.1.1 标识符 • 8.1.2 常量 • 8.1.3 变量 • 8.1.4 运算符与表达式
8.1.1 标识符 • 1.常规标识符 • 常规标识符应符合如下规则: • (1)第一个字符必须是下列字符之一:ASCII字符、Unicode字符、下划线 (_)、@或#。在 SQL Server 中,某些处于标识符开始位置的符号具有特殊意义,以@开始的标识符表示局部变量或参数,以一个数字符号开始的标识符表示临时表或过程,以##开始的标识符表示全局临时对象。 • (2)后续字符可以是:ASCII字符、Unicode字符、下划线 (_)、@、美元符号 ($)或数字符号。 • (3)标识符不能是 Transact-SQL 的保留字。 • (4)不允许嵌入空格或其它特殊字符。
8.1.1 标识符 • 2.分隔标识符 • 分隔标识符包含在双引号 (") 或者方括号 ([ ]) 内。分隔标识符在下列情况下使用: • (1)当在对象名称或对象名称的组成部分中使用保留字时。 • (2)当使用未被列为合法标识符的字符时。 • 分隔标识符使用示例: • SELECT * FROM [Blanks In Table Name] • SELECT * FROM "Blanks in Table Name" • 标识符允许的最大长度为128个字符。符合常规标识符格式规则的标识符可以分隔,也可以不分隔;对不符合标识符规则的标识符必须进行分隔。
8.1.3 变量 • 1.局部变量 • (1)局部变量的定义 • 在批处理或存储过程中用DECLARE语句声明局部变量,所有局部变量在声明后均初始化为NULL。 • 语法格式: • DECLARE {@local_variable data_type} [,…n] • (2)局部变量的赋值 • 当声明局部变量后,可用SET或SELECT语句给其赋值。 • ① 用SET语句赋值 • 语法格式: • SET @local_variable=expression • ② 用SELECT语句赋值 • 语法格式: • SELECT {@local_variable=expression} [,…n]
语法格式 • Declare 变量1数据类型(长度)… 变量n 数据类型(长度) • Set 变量1=表达式 • …… • Set 变量n=表达式 • Select 语句
例题: • 1、创建局部变量@var1赋值为“中华”;@var2赋值为“人民共和国”。显示结果为“中华人民共和国”。 • Declare @var1 char(10) , @var2 char(20) • Set @var1=‘中华’ • Set @var2=‘ 人民共和国’ • Select @var1+@var2
例题 • 2、创建一个名为xb的局部变量,显示所有男同学的学号和姓名。 • Declare @xb char(2) • Set @xb=‘男’ • Select 学号,姓名 • From xsda • Where 性别=@xb
练习: • 1、创建局部变量mz,显示所有非汉族学生的姓名和名族。 • declare @mz char(10) • set @mz='汉' • select 姓名,民族 • from xsda • where 民族!=@mz
练习 • 2、创建局部变量@cj,显示成绩为80分的学生的姓名,课程名称和成绩。 • declare @cj tinyint • set @cj=80 • select 姓名,课程名称,成绩 • from xsda join xscj join kcxx on xscj.课程编号=kcxx.课程编号 on xsda.学号=xscj.学号 • where 成绩=@cj
8.1.3 变量 • 2.全局变量
8.1.4 运算符与表达式 • 1.算术运算符 • 算术运算符:加(+)、减(-)、乘(*)、除(/)和取余(%),参与运算的数据是数值类型数据,其运算结果也是数值类型数据。 • 2.字符串连接运算符 • 字符串连接运算符(+)可以实现字符串之间的连接。参与字符串连接运算的数据只能是字符数据类型:char、varchar、nchar、nvarchar、text、ntext,其运算结果也是字符数据类型。
8.1.4 运算符与表达式 • 3.比较运算符
8.1.4 运算符与表达式 • 4.逻辑运算符
例题 • 1、查询年龄最小的学生的学号、姓名和出生日期。 • Select 学号,姓名,出生日期 • From xsda • Where 出生日期>all • ( • Select 出生日期 • From xsda • )
例题 • 2、查询成绩高于“王红”最低成绩的学生的姓名、课程名称和成绩。 • Select 姓名,课程名称,成绩 • From xsda join xscj join kcxx on xscj.课程编号=kcxx.课程编号 on xsda.学号=xscj.学号 • Where 成绩>any • ( • Select 成绩 • from xsda join xscj on xsda.学号=xscj.学号 • Where 姓名=‘王红’ • )
8.1.4 运算符与表达式 • 5.运算符的优先级
练习 • 1、select 20/5+46%3 • 2、 select ((7+3)*4-17/(4-(8-6))+99%4
8.2 批处理与程序流程控制语句 • 8.2.1 批处理 • 8.2.2 流程控制语句
8.2.1 批处理 • 批指包含一条或多条T-SQL语句的语句组,这组语句从应用程序一次性地发送到SQL SERVER服务器执行,可提高效率。批结束的标志是“GO”。 • 使用批限制: • CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和CREATE VIEW语句不能在批处理中与其它语句组合使用。批处理必须以 CREATE 语句开始,所有跟在CREATE后的其它语句将被解释为第一个 CREATE 语句定义的一部分。 • 不能把规则和默认值绑定到表字段或者自定义字段后,立即在同一个批处理中使用。同理对CHECK约束。 • 在同一个批中不能删除一个数据库对象又重建它。 • 在同一个批中不能改变一个表后,再立即引用其新列。 • 若批处理中第一个语句是执行某个存储过程的EXECUTE语句,则EXECUTE可省略。
8.2.2 流程控制语句 • 1.复合语句 • 包括一系列的 Transact-SQL 语句,称为语句块。 • BEGIN…END 语句 • 功能:将多个T-SQL语句组合成一个语句块。 • 语法格式: • BEGIN • sql_statement /*是任何有效的 Transact-SQL 语句 • […n] • END • 2.PRINT语句 • 功能:输出返回的结果值。 • 将用户定义的消息返回客户端。 • 语法格式: • PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr
8.2.2 流程控制语句 • 3.判断语句(IF…ELSE) • 功能:判断语句。首先判断条件表达式的值,如果值 为真,则执行IF语句块;如果值为假,则执行ELSE语句块。 • 语法格式: • IF boolean_expression /*条件表达式 • {sql_statement|statement_block} • /*条件表达式为真时执行T-SQL语句或语句块 • [ELSE • {sql_statement|statement_block}] • /*条件表达式为假时执行T-SQL语句或语句块
例题: • if (select avg(成绩) • from xscj join kcxx on xscj.课程编号=kcxx.课程编号 • where 课程名称='计算机文化基础')>75 • print '平均成绩大于75分' • else • print '平均成绩小于75分'
8.2.2 流程控制语句 • 4.循环语句(WHILE)、BREAK语句和CONTINUE语句 • 功能: • 只要WHILE后面指定的表达式的值为真,则重复执行BEGIN…END之间的语句块。其中,CONTINUE语句使程序跳过CONTINUE语句后面的语句,回到WHILE循环的第一行命令;BREAK语句则完全终止循环,结束WHILE语句。
8.2.2 流程控制语句 • 5.RETURN语句 • 用于从过程、批处理或语句块中无条件退出,不执行位于RETURN之后的语句。 • 语法格式: • RETURN [ integer_expression ] • 6.注释 • 注释是为SQL语句加上注释正文,以说明该代码的含义,增加代码的可读性。有两种用法,注释多行用/*……*/,注释一行用--。
8.3 系统内置函数 • 8.3.1 数学函数 • 8.3.2 字符串函数 • 8.3.3 日期和时间函数 • 8.3.4 聚合函数 • 8.3.5 系统函数
8.3.1 数学函数 • 1.ABS函数 • 语法格式: • ABS ( numeric_expression ) • 2.ROUND函数 • 语法格式: • ROUND ( numeric_expression , length ) • 3.RAND函数 • 语法格式: • RAND ( [ seed ] )
8.3.2 字符串函数 • 1.ASCII函数 • 语法格式: • ASCII ( character_expression ) • 2.CHAR函数 • 语法格式: • CHAR ( integer_expression ) • 3.LEFT函数 • 语法格式: • LEFT ( character_expression , integer_expression ) • 4.RIGHT函数 • 语法格式: • RIGHT ( character_expression , integer_expression )
8.3.2 字符串函数 • 5.SUBSTRING函数 • 语法格式: • SUBSTRING ( expression , start , length ) • 6.REPLACE函数 • 语法格式: • REPLACE ( 'string_expression1' , 'string_expression2' , 'string_expression3 ' ) • 7.STR函数 • 语法格式: • STR ( float_expression [ , length [ , decimal ] ] ) • 8.LEN • 语法格式: • LEN ( string_expression )
8.3.3 日期和时间函数 • 1.GETDATE函数 • 语法格式: • GETDATE ( ) • 2.DAY函数 • 语法格式: • DAY ( date ) • 3.MONTH函数 • 语法格式: • MONTH ( date ) • 4.YEAR函数 • 语法格式: • YEAR ( date )
8.3.5 系统函数 • 1.CASE函数 • (1)简单的CASE语句 • 语法格式: • CASE input_expression • WHEN when_expression THEN result_expression • […n] • [ELSE else_result_expression] • END • (2)搜索型CASE语句 • 语法格式: • CASE • WHEN Boolean_expression THEN result_expression • […n] • [ELSE else_result_expression] • END
8.3.5 系统函数 • 2.CURRENT_USER • 语法格式: • CURRENT_USER • 3.HOST_NAME • 语法格式: • HOST_NAME ( )
8.4 用户自定义函数 • 8.4.1 用户自定义函数的定义与调用 • 8.4.2 用户自定义函数的删除
8.4.1 用户自定义函数的定义与调用 • 1.标量函数 • 标量函数返回一个确定类型的标量值,其返回值类型为除了TEXT、NTEXT、IMAGE、CURSE、TIMESTAMP和TABLE类型外的其它数据类型。函数体语句定义在BEGIN……END语句内。 • (1)标量函数的定义 • 语法格式: • CREATE FUNCTION [owner_name.]function_name /*函数名部分 • (@parameter_name scalar_parameter_data_type,…n) /*形参定义部分 • RETURNS scalar_return_data_type /*返回值类型 • AS • BEGIN • function_body /*函数体部分 • RETURN scalar_expression /*返回语句 • END
8.4.1 用户自定义函数的定义与调用 • (2)标量函数的调用 • 当调用用户自定义标量函数时,必须提供至少由两部分组成的名称(所有者名.函数名)。可在SELECT语句中调用用户定义标量函数,也可利用T-SQL的EXECUTE语句调用用户定义标量函数。 • ① 在SELECT语句中调用 • 语法格式: • 所有者名.函数名(实参1,…,实参n) • ② 利用EXECUTE语句调用 • 语法格式: • 所有者名.函数名 实参1,…,实参n • 或 • 所有者名.函数名 形参名1=实参1,…,形参名n=实参n
8.4.1 用户自定义函数的定义与调用 • 2.内嵌表值函数 • 内嵌表值函数返回可更新表,没有由BEGIN……END语句括起来的函数体。内嵌表值函数可用于实现参数化的视图。 • (1)内嵌表值函数的定义 • 语法格式: • CREATE FUNCTION [owner_name.]function_name /*函数名部分 • (@parameter_name scalar_parameter_data_type,…n) /*形参定义部分 • RETURNS TABLE /*返回值为表类型 • AS TRTURN • SELECT查询语句 • (2)内嵌表值函数的调用 • 内嵌表值函数只能通过SELECT语句调用。
8.4.1 用户自定义函数的定义与调用 • 3.使用企业管理器创建用户自定义函数
8.4.2 用户自定义函数的删除 • 1.使用企业管理器删除 • (1)展开【服务器组】、展开 【服务器】。 • (2)展开【数据库】,展开数据库,单击【用户定义函数】,在详细信息窗口中显示已有的自定义函数。 • (3)右击[要删除的用户定义函数]单击【删除】弹出【去除对象】对话框,单击【全部去除】完成。 • 2.使用T-SQL语句的DROP FUNCTION删除 • 语法格式: • DROP FUNCTION [owner_name.]function_name [,…n]