学习目标
- 掌握Transact-SQL的附加的语言元素
- 掌握使用Transact-SQL定义变量,对变量赋值和输出
- 掌握Transact-SQL流程控制语句及其作用
Transact-SQL语言
Transact-SQL简称T-SQL,是标准SQL程序设计语言的增强版。它对SQL进行了扩展,加入了变量、程序流程控制结构和其它一些语言元素,增强了可编程性。通过T-SQL,可以定义变量,使用流程控制语句、自定义函数、存储过程等。
Transact-SQL语言是一种综合性语言,主要分为4个部分:
- 数据定义语言(DDL)
- 数据操作语言(DML)
- 数据控制语言(DCL)
- 附加的语言元素:主要包括变量、运算符、函数、注释和流程控制语句。
基本概念
标识符
数据库对象(如表、约束、索引、视图等)的名称即为标识符。常规标识符命名规则:
- 第一个字符必须是下列字符之一:
- 英文字母,以及其它语言的字母字符,如汉字
- 下划线
_
、@
、#
- 后续字符可以包括:
- 英文字母,以及其它语言的字母字符,如汉字
- 十进制数字
- 下划线
_
、@
、#
和$
- 标识符不能是Transact-SQL的保留字
- 不允许有空格或其它特殊字符
批处理
批处理是包含一个或多个T-SQL语句的组,一次性发送到SQL Server进行执行。SQL Server将批处理的语句编译为一个可执行单元,成为执行计划。执行计划中的语句每次执行一条。
常量
常量,也称为文字值或标量值,是在程序运行过程中值保持不变的量,它是表示一个特定数据值的符号。例如:
- 字符串常量:
'abc@qq.com'
- Unicode字符串:
N'威海职业学院'
- bit常量:
0
和1
- …
变量
变量是指在程序运行过程中,值可以改变的量。变量可以分为全局变量和局部变量。
全局变量
全局变量是由系统定义的,用户可以直接使用,全局变量通常用于存储SQL Server的一些配置信息和能效统计数据。使用全局变量需要注意:
- 全局变量的名字以
@@
开头 - 用户不能创建,也不能修改全局变量的值
- 全局变量的作用范围不局限于某一程序,任何程序均可随时调用
常用的全局变量有:
全局变量 | 作用 |
---|---|
@@error | 返回执行上一条T-SQL 语句所返回的错误编号。如果语句执行成功,则返回0 |
@@identity | 返回最近一次插入的identity列的数值 |
@@rowcount | 返回上一天T-SQL 语句所影响的数据行数 |
@@version | 返回当前SQL Server服务器的安装日期、版本等信息。 |
局部变量
局部变量是指用户自己定义、赋值、使用或输出的变量。使用局部变量需要注意:
- 局部变量不区分大小写
- 局部变量的作用范围仅在其声明的批处理内部
- 局部变量必须以
@
开头,而且必须先使用DECLARE
声明后才能使用。
局部变量的声明
声明局部变量的语法如下:
-- var_name 是局部变量的名字,必须以@开头
-- datatype 是局部变量的数据类型
DECLARE @var_name datatype
[, @var_name datatype]
局部变量的赋值
声明局部变量后要给局部变量赋值,可以使用SET
或SELECT
语句。赋值的语法格式如下:
SET @local_var=expression
SELECT @local_var=expression, [, @local_var=expression]
练习
使用变量查找计算机学院教龄超过3年的教师信息。
DECLARE @dept char(5), @year int
SET @dept = 'J'
SELECT @year = 3
SELECT *
FROM teachers
WHERE deptno = @dept AND teachingyears > @year
PRINT想客户端返回一个用户自定义信息,即显示一个字符串、局部变量、全局变量的内容。语法格式如下:
RPINT msg_str | @local_var | string_epr
练习
将局部变量HOMEPAGE声明为char类型,长度为100,并为其赋值为"https://www.baidu.com",并输入变量的值。
DECLARE @HOMEPAGE char(100)
SET @HOMEPAGE = 'https://www.baidu.com'
PRINT @HOMEPAGE
流程控制语句
流程控制语句用于控制T-SQL、语句块和存储过程的执行流程,以完成功能较为复杂的操作,使得程序具有更好的逻辑性和结构性。常用到流程控制语句如下:
语句 | 说明 | 语句 | 说明 |
---|---|---|---|
BEGIN…END | 定义语句块 | IF…ELSE… | 条件语句 |
CASE | 多条件分支语句 | WHILE | 循环语句 |
BREAK | 中断循环语句 | CONTINUE | 挑出本次循环 |
GOTO | 跳转语句 | RETURN | 返回语句 |
BEGIN…END
BEGIN…END用于将多个语句组合成一个逻辑块, 当流程控制语句必须执行一个包含两条或两条以上的语句块时,使用BEGIN…END。
语法格式如下:
BEGIN
sql_statement
END
注意,BEGIN和END必须成对使用
练习
声明两个变量并赋值,然后交换两个变量的值。
DECLARE @a int, @b int, @t int
SET @a = 3
SET @b = 5
BEGIN
SET @t = @a
SET @a = @b
SET @b = @t
END
PRINT @a
PRINT @b
IF…ELSE
如果条件为真,则执行IF条件表达式后面的T-SQL语句;否则,当条件为假时,可以使用ELSE关键字指定要执行的T-SQL。
语法格式如下:
IF boolean_exp
sql_statement | statement_block
ELSE
sql_statement | statement_block
练习
声明3个变量并赋值,输出其中较大的值。
DECLARE @a int, @b int, @c int
SET @a = 3
SET @b = 5
set @c = 4
IF @a < @b
SET @a = @b
IF @a < @c
set @a = @c
PRINT @a
WHILE
当条件为真是,重复执行循环语句。如果想重复执行一组指令,则需配合BEGIN…END一起使用。
语法格式如下:
WHILE boolean_exp
BEGIN
sql_statement | statement_block
END
练习
求1到100所有整数的和。
DECLARE @n int, @sum int
SET @n = 1
SET @sum = 0
WHILE @n <= 100
BEGIN
SET @sum = @sum + @n
SET @n = @n + 1
END
PRINT @sum
CASE
根据表达式的真假来确定是否返回某个值。CASE语句可以进行多个分支的选择。
语法格式如下:
CASE
WHEN boolean_exp THEN result_exp
WHEN boolean_exp THEN result_exp
...
ELSE result_exp
END
练习
根据学生分数给出判定:
- [90,100]输出excellent
- [70, 90)输出good
- [60, 70)输出pass
- 其它分数输出fail
DECLARE @n int, @ans varchar(20)
SET @n = 78
SET @ans =
CASE
WHEN @n >= 90 AND @n <= 100 THEN 'excellent'
WHEN @n >= 70 AND @n < 90 THEN 'good'
WHEN @n >= 60 AND @n < 70 THEN 'pass'
ELSE 'fail'
END
PRINT @ans