Transact-SQL.
SQL Server在支持标准SQL语言的同时,对其进行了扩充,引入Transact-SQL,简称T-SQL,它是使用SQL Server的核心,通过它可以定义变量、使用控制流语句、自定义函数以及自定义存储过程等,极大地拓展了SQL Server的功能。在SQL Server-DBMS中,存储过程与触发器具有重要的作用,存储过程和触发器都是SQL语句和控制流语句的集合。
SQL是DBMS的标准语言,标准的SQL语句几乎可以不加修改地应用于所有RDBMS上,但它并不支持流程控制,使用起来有时会不方便。因此,大型的RDBMS都在标准SQL的基础上,结合自身特点推出了可以编程的、结构化的SQL语言,例如我们这里SQL Server的T-SQL,以及Oracle 11g的PL/SQL。T-SQL最主要的用途就是设计服务器端能够在后台执行的程序块,例如存储过程和触发器。
变量.
熟悉高级语言就不会对于变量感到陌生,SQL Server中的变量也很很多高级语言一样,分为全局变量和局部变量,但又存在一些不同。全局变量由系统定义并维护,用户只能使用预先说明及定义了的全局变量,并且权限是【只读】的,也就是用户只能读取,而不能修改或注销;局部变量由用户定义并赋值,并且用途和高级语言中的变量几乎相同。有一点时需要注意的,在SQL Server中使用全局变量,需要以【@@变量名】的形式,使用局部变量需要以【@变量名】的形式。
局部变量.
局部变量的名称是不能与全局变量相同的,它的作用范围局限于其声明所在的批处理、存储过程或触发器中,并且SQL Server中的局部变量名大小写不敏感。局部变量常用于存储查询得到的数据,当作程序执行过程中的临时变量。
- 【声明方式】T-SQL提供
DECLARE
语句来声明局部变量,且变量名必须加以前缀@,其语法格式如下,其中的TYPE
可以是SQL Server支持的所有数据类型:
DECLARE @Var_1 TYPE,@Var_2 TYPE,...,@Var_n TYPE
- 【赋值方式】T-SQL中并不支持很多高级语言中
Var=Value
这样的赋值方式,而是必须使用SELECT
或SET
命令来给变量赋值,语法格式如下:
SELECT @Var=Value
SET @Var=Value
运算符.
T-SQL中的运算符基本和C语言中一致。
【算术运算符】算术运算符对两个表达式执行数学运算,参与运算的
表达式必须是数值数据类型或能够进行算术运算的其他数据类型。
【比较运算符】
【逻辑运算符】
【按位运算符】
【一元运算符】
【优先级与结合性】
批处理语句.
批处理是包含一个或多个T-SQL语句的一个单元,当中的所有语句被整合成一个执行计划,一个批处理内的所有语句要么被放在一起通过解析,要么一句都不会被执行。批处理的语法是使用GO
语句将多条SQL语句进行分隔,其中每两个GO
语句之间的代码就是一个批处理单元,每一个批处理单元会被单独地对待,所以不会因为一个单元中的错误,导致所有的语句都被停止运行,例如:
USE Teach
GO
SELECT * FROM SC
SELECT COUNT(*) FROM S
GO
流程控制语句.
T-SQL使用的流程控制语句与常见的程序设计语言类似,使其能够产生控制程序执行及流程分支的作用。主要有以下几种控制语句:
- BEGIN…END
- IF…ELSE
- CASE
- WHILE
- WAITFOR
- GOTO
- RETURN
● 使用BEGIN…END语句创建一个由一条语句或多条语句构成的程序块,其语法格式如下所示:
BEGIN
<命令行或程序块>
END
● 使用IF…ELSE语句创建条件语句,其语法格式如下,其中ELSE
子句也是可以省略的:
IF <条件表达式>
<命令行或程序块>
ELSE
<命令行或程序块>
【例】从数据库Teach中的SC数据表中求出学号S1同学的平均成绩,如果此成绩或等于60分,则输出’pass’信息,否则,输出’fail’信息。
USE Teach
GO
IF (SELECT AVG(SCORE)FROM SC WHERE SNO=‘S1’)>=60
PRINT ‘pass’
ELSE
PRINT ‘fail’
GO
IF
语句还有一种变体是IF EXISTS|NOTEXISTS
语句,其实和普通的IF
没有本质区别,其语法如下:
IF EXISTS|NOT EXISTS (SELECT 子查询)
<命令行或程序块>
ELSE
<命令行或程序块>
【例】从数据库Teach中的S表中读取学号S1同学记录,如果存在,则输出’存在记录’,否则,输出’不存在记录’。
USE Teach
GO
DECLARE @message VARCHAR(255)
IF EXISTS (SELECT * FROM S WHERE SNO=‘S1’)
SET @message=‘存在记录’
ELSE
SET @message=‘不存在记录’
PRINT @message
GO
● 当存在多种条件判断时,可以使用CASE
语句,通过判断CASE
后面表达式的取值,找到对应的WHEN
,然后执行THEN
后的表达式,执行后跳出CASE
。如果没有ELSE
子句,则所有比较失败后,反馈NULL
,如果存ELSE
子句,ELSE
是没有任何匹配的WHEN
时,执行的内容。其语法格式如下:
CASE <表达式>
WHEN <表达式> THEN <表达式>
…
WHEN <表达式> THEN <表达式>
ELSE <表达式>
END
【例】从数据库Teach中的S表中选取SNO和Sex,如果Sex字段为’男’,则输出’M’;如果为’女’,则输出’F’。
USE Teach
GO
SELECT SNO, Sex=
CASE sex
WHEN‘男’THEN ‘M’
WHEN‘女’THEN ‘F’
END
FROM S
GO
● WHILE…CONTINUE…BREAK
语句,当需要循环结构时,可以使用WHILE语句,通过WHILE
后条件表达式情况,判读循环是否终止。如果循环未结束,则执行BEGIN
和END
标注的内容。其语法如下所示:
WHILE <条件表达式>
BEGIN
<命令行或程序块>
[BREAK]
[CONTINUE]
[命令行或程序块]
END
【例】计算输出1-100之间能够被3整除的数的总和及个数。
DECLARE @s SMALLINT,@i SMALLINT,@nums SMALLINT
SET @s=0
SET @i=1
SET @nums=0
WHILE (@i<=100)
BEGIN
IF (@i%3=0)
BEGIN
SET @s=@s+@i
SET @nums=@nums+1
END
SET @i=@i+1
END
PRINT @s
PRINT @nums
● 当程序需要阻塞一段时间的时候,可以使用WAITFOR
实现。
【例】等待1小时2分零3秒后才执行SELECT语句
WAITFOR DELAY '01:02:03'
SELECT * FROM S
【例】指定在11:24:00时间点时开始执行SELECT语句
WAITFOR TIME '11:24:00'
SELECT * FROM S
DELAY
:用来设定等待的时间,最多可达24小时;TIME
:用来设定等待结束的时间点。
● 将执行流程改变到由标签指定的位置。系统跳过GOTO
后边的语句。
DECLARE @s SMALLINT,@i SMALLINT
SET @i=1
SET @s=0
BEG: /*标号*/
IF (@i<=10)
BEGIN
SET @s=@s+@i
SET @i=@i+1
GOTO BEG /*使程序跳转到标号为BEG的地方执行*/
END
PRINT @s
● 可以在任意位置使用RETURN
退出,系统将不会执行RETURN
后的语句。
RETURN语句不能返回NULL值。SQL Server保留−1~−99之间的返回值作为系统使用。
常用命令.
- BACKUP用于将数据库内容或其事务处理日志备份到存储介质上(软盘、硬盘、磁带等)。
- DBCC用于验证数据库完整性、查找错误、分析系统使用情况等。
- EXECUTE或EXEC命令用来执行存储过程 。
- KILL命令用于终止某一过程的执行。
- PRINT命令向客户端返回一个用户自定义的信息,即显示一个字符串、局部变量或全局变量。
- RAISERROR用于在SQL Server 系统返回错误信息时,同时返回用户指定的信息。
- SHUTDOWN命令用于停止SQL Server 的执行。
- USE命令用于改变当前使用的数据库为指定的数据库。
- SET命令有两种用法:用于给局部变量赋值;用于用户执行SQL 命令时,SQL Server 处理选项的设定 。
内置函数.
函数是能够完成特定功能并返回处理结果的一组T-SQL语句,处理结果称为“返回值”,处理过程称为“函数体”。 函数可以用来构造表达式,可以出现在SELECT语句的选择列表中,也可以出现在WHERE子句的条件中。SQL Server的内置函数包括:
- 统计函数
- 算术函数
- 字符串函数
- 日期函数
- 自定义函数
下面是一些常用的内置函数:
- STDEV函数返回表达式中所有数据的标准差。
- STDEVP 函数返回表达式中所有数据的总体标准差。
- ASCII函数返回字符表达式最左端字符的ASCII码值。
- CHAR函数用于将ASCII 码转换为字符。
- LOWER函数用于把字符串全部转换为小写。
- UPPER函数用于把字符串全部转换为大写。
- STR函数用于把数值型数据转换为字符型数据。
- LTRIM函数用于把字符串头部的空格去掉。
- RTRIM函数用于把字符串尾部的空格去掉 。
- LEFT(character_expression, integer_expression)函数返回的子串是从字符串最左边起到第
integer_expression
个字符的部分。对应的还有RIGHT(character_expression, integer_expression)函数返回的子串是从字符串右边第integer_expression
个字符起到最后一个字符的部分。 - CHARINDEX(substring_expression,expression)函数返回字符串中某个指定的子串出现的开始位置。
用户自定义函数。
- 创建标量值函数;
- 创建内联表值函数;
- 多语句表值函数.
数值函数返回结果为单个数据值;表值函数返回结果集(table数据类型)。标量值函数的函数体由一条或多条T-SQL语句组成,这些语句以BEGIN
开始,以END
结束。
【例】自定义一个标量函数Fun1,判断一个整数是否为素数,如果为素数,则函数返回1,否则返回0,待判断的数通过参数传给函数。
CREATE FUNCTION dbo.Fun1(@n AS INT)
RETURNS INT
AS
BEGIN
DECLARE @i INT
DECLARE @sign INT
SET @sign=1
SET @i=2
WHILE @i<=SQRT(@n)
BEGIN
IF @n % @i=0
BEGIN
SET @sign=0
BREAK
END
SET @i=@i+1
END
RETURN @sign
END
调用:SELECT dbo.Fun1(13).