--来源《21天学通SQL Server》
1 Transact-SQL概述
Transact-SQL语言是SQL Server为用户提供的一种编程语言,是对标准SQL的实现和扩展,它具有标准SQL的主要特点,同时增加了变量、运算符、函数和流程控制等语言元素,使得其功能更加强大。
1.1 Transact-SQL与标准SQL
Transact-SQL又简称T-SQL,它是微软公司在SQL Server数据库管理系统中对标准SQL的实现和扩展,是使用SQL Server的核心,所有与SQL Server实例通信的应用程序,其实都是通过发送T-SQL语句到服务器来完成对数据库的操作的。
T-SQL与标准SQL稍有不同,SQL是结构化查询语言(Structured Query Language),是目前关系型数据库管理系统中使用得最广泛的查询语言。T-SQL是在SQL上发展而来的,T-SQL在SQL的基础上添加了变量、运算符、函数、注释和流程控制等,是标准SQL语言的扩展。因此,标准SQL是几乎所有关系型数据库都支持的语言,而T-SQL是Microsoft SQL Server支持的语言。
1.2 Transact-SQL的语法约定

2 加入注释
2.1 单行注释
单行注释使用“--”标记,即在语句或者说明文字的最前面加上“--”标记。

--先插入一条记录
INSERT a(c1,c2)
VALUES ('11111','22222')
--查看插入记录之后表的内容
SELECT * FROM a

2.2多行注释
多行注释使用“/* ……*/”标记

/*
下面代码可以完成以下操作:
1、查看a表中所有的记录内容
2、向表a插入数据
3、查看插入后的结果
*/
SELECT * FROM a
INSERT a(c1,c2)
VALUES ('33333','44444')
SELECT * FROM a

3 Transact-SQL运算符
T-SQL所使用的运算符可以分为算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符、字符串连接运算符和一元运算符7种。
3.1 算术运算符
算术运算符是对两个表达式执行数学运算,这两个表达式可以是精确数字型或近似数字型。其中“+”、“-”运算符也可以用datetime和smalldatetime值进行算术运算。
3.2 赋值运算符
T-SQL里只有一个赋值运算符,等号(=),赋值运算符的作用是给变量赋值,也可以使用赋值运算符在列标题和定义列值的表达式之间建立关系。
3.3 位运算符
位运算符是在两个表达式之间按位进行逻辑运算,这两个表达式可以是整数或二进制数据类型。
3.4 比较运算符
比较运算符用于判断两个表达式是否相同,返回true或false的布尔数据类型。除了text、ntext和image数据类型的表达式外,比较运算符可以用于所有的表达式。
3.5 逻辑运算符
逻辑运算符用于对某些条件进行判断,判断其为true或false,与比较运算符一样,返回的是布尔数据类型。
3.6 字符串连接运算符
T-SQL里只有一个字符串连接运算符,加号(+),例如:'123'+'a'结果就是123a
3.7 一元运算符
一元运算符只能对一个表达式进行操作。
3.8 运算符的优先级
4 Transact-SQL中的常量和变量
常量的格式取决于它所表示的值的数据类型,数据类型不同,常量也会有不同的表达方式。T-SQL中的变量可以分为局部变量全局变量两种,局部变量是以@开头命名的变量,全局变量是以@@开头命名的变量。
4.1 常量
在T-SQL中,有字符串常量(例如“11111”),整数常量(例如5),货币常量($10),日期常量,二进制常量等各种常量。并且,可以用多种方式来使用常量,例如下面几种用法。
(1)作为算术表达式中的常量,例如:

SELECT 产品名称,单价+$10 AS 价格
FROM 产品

(2)在WHERE子句中,作为比较字段的数据值,例如:

SELECT *
FROM 产品
WHERE 单价 > $10

(3)为变量赋值,例如:

DECLARE @abc int
SET @abc = 123

(4)在Update的set子句或Insert的values子句里指定字段的数据值,例如:

UPDATE a SET c2= '55555'
WHERE c1= '11111'

(5)在print或raiserror语句里指定输出的消息文本,例如:

PRINT ‘完成操作’

(6)作为条件语句(如If语句、case函数)中要判断的值,例如:

IF @@ERROR > 0
PRINT N '出错了'

4.2 局部变量
局部变量是由用户自定义的变量,这些变量可以用来存储数值型、字符串型等数据,也可以存储函数或存储过程返回来的值

(1)DECLARE语句可以用来声明局部变量:

DECLARE
    { @local_variable [AS] data_type }
    [ ,...n]

其中参数说明如下。
● @local_variable:局部变量名称。
● data_type:局部变量的数据类型,但不能是text、ntext或image数据类型。
(2)用SET语句和SELECT语句可以为变量赋值:

SET @local_variable = value
SELECT @local_variable = value

(3)用SELECT语句和PRINT语句可以显示变量内容,其语法代码如下。

SELECT @local_variable
PRINT @local_variable

【例1】定义局部变量,并给其赋值,最后显示变量内容。
 

--定义局部变量name和age
DECLARE @name nvarchar(10)
DECLARE @age int
--给变量name和age赋值
SET @name = '张三'
SELECT @age = 20
--显示变量name和age的内容
PRINT @name
PRINT @age


使用SELECT语句对变量赋值比使用SET语句的范围要广且灵活,可以将查询结果赋值给变量。
【例2】使用SELECT语句给变量赋值。
 

DECLARE @name nchar(20)
SELECT @name = sname
    FROM stu_info
    WHERE sno = ‘0006’
PRINT '学生姓名:' + @name

4.3 全局变量
全局变量是由系统提供的,用于存储一些系统信息。用户只可以使用全局变量,不可以自定义全局变量。
【例3】使用全局变量ROWCOUNT显示SELECT语句运行后得到的记录数。
 

SELECT * FROM stu_info
PRINT '一共查询了' + CAST( @@ROWCOUNT AS varchar(5)) + '条记录'


5 流控制语句
 5.1 BEGIN…END语句
Transact_SQL使用BEGIN和END来标记一个程序语句块的开始和结束。它经常与IF…ELSEWHILE循环一起使用。

BEGIN
语句1
语句2
语句3
……
END

5.2 IF…ELSE语句
 

IF条件
BEGIN
语句块1
END
[ELSE
BEGIN
语句块2
END]

说明:
● 如果条件为真,则执行语句块1,不执行语句块2。
● 如果条件为假,则执行语句块2,不执行语句块1。
● 语句块1和语句块2永远不会同时执行。
● ELSE部分为可选。
在IF或ELSE中还可以嵌套其他IF语句。
【例4】下面的程序用于求两数之商,如果除数不为0,则求出正确结果,如果为0,则给出提示。
 

DECLARE @x real,@y real,@z real
SELECT @x=9,@y=5
IF @y<>0
BEGIN
    SELECT @z=@x/@y
    PRINT '结果为:'+CAST(@z AS char)
END
ELSE
    PRINT '除数不能为零!'

如果给变量@y赋值为0,则运行结果:

说明:如果IF或ELSE中只有一条语句,则可以省略BEGIN和END标记。
5.3 WHILE语句


WHILE循环条件
BEGIN
语句块(循环体)
END

【例5】编程计算1+2+3+…+100的结果。

DECLARE @x int,@s int
SELECT @x=1,@s=0
WHILE @x<=100
BEGIN
    SELECT @s=@s+@x
    SELECT @x=@x+1
END
PRINT '结果为:'+CAST(@s AS char)

5.4 BREAK语句
该命令通常和IF…ELSE语句配合使用。
【例6】下面的程序用于打印1,2,3,4。
 

DECLARE @x int
SELECT @x=1
WHILE @x<=10
BEGIN
    IF @x=5  /*判断是否为5,如果是则结束循环 */
        BREAK
    ELSE
        PRINT CAST(@x AS char)
    SELECT @x=@x+1
END

5.5 CONTINUE语句
COUNTINUE命令也用于WHILE循环。它会令循环立即从BEGIN处开始重新执行,也就是说不再执行其语句块中剩下的部分。通常COUNTINUE也和IF…ELSE语句配合使用。
【例7】下面的程序用于打印1~5之间的所有奇数

DECLARE @x int
SELECT @x=0
WHILE @x<=5
BEGIN
    SELECT @x=@x+1
    IF @x%2=0   /*判断是否为偶数,如果是则重新开始循环 */
        CONTINUE
    PRINT CAST(@x AS char)
END

5.6 WAITFOR语句
WAITFOR语句指定在一段时间后执行下一个Transact-SQL语句、语句块。

WAITFOR{ DELAY 'time_to_pass'|TIME 'time_to_execute'  }

其中:
● DELAY指定在多长时间后执行语句,最长为24小时。
● TIME指定运行批处理、存储过程或事务的时间。
【例8】要在1小时后,执行一条查询语句:

WAITFOR  DELAY  '01:00:00'
SELECT * FROM student

5.7 CASE语句
CASE语句就是一个条件判断语句,在执行CASE语句时,当匹配了一个子句时就从CASE语句中跳出。

CASE <表达式>
    WHEN <表达式> THEN <表达式>
    [[WHEN <表达式> THEN <表达式>][…]]
    [ELSE  <表达式>]
END

说明:CASE语句不仅可以单独使用,也可以嵌套到SQL命令中。

【例9】根据学生成绩划分等级。

SELECT
    CASE
      WHEN  学生成绩>=85  THEN  '优秀'
      WHEN  学生成绩>=60 AND学生成绩<=84  THEN '中等'
      WHEN  学生成绩<60  THEN '不及格'
    END
FROM学生信息表

 

 

 

 

 

 

 

 

 

 

 

更多推荐

SQL Server(六)-Transact-SQL语言