Transact-SQL简介

SQL是关系型数据库的标准语言,几乎所有的关系型数据库都支持SQL。但SQL不支持流程控制,使用起来不太方便。

因此,大型关系型数据库在SQL基础上推出了结构化的SQL编程语言,如SQL Server 2012的Transact-SQL、Oracle 11g的PL/SQL。

一、变量

1. 全局变量

全局变量不是由用户定义,而是由系统定义和维护。任何程序均可随时调用。

全局变量对用户是只读的,用户只能读取全局变量的值,而不能对他们进行修改或管理。

使用全局变量必须以@@开头。

2. 局部变量

局部变量由用户自定义,作用范围有限。

(1)声明方式

DECLARE @变量名 变量类型,@变量名 变量类型,……

(2)赋值

不能简单地使用变量名=变量值的方式给变量赋值,必须使用SELECT或者SET命令。

SELECT @变量名=变量值SET

3. 注释

单行注释:-- 注释内容

多行注释:/*注释内容*/

二、运算符

1. 位运算op

位或:|
位与:&
位异或:^
位反:~

2. 逻辑op

AND OR NOT
ANY SOME ALL
BETWEEN...AND
IN LIKE EXISTS

3. 比较op

= < > >= <= <>
非SQL标准:!= !< !>

4. 赋值op

=

5. 字符串连接op

+

三、批处理

每个批处理中的所有语句要么被放在一起通过解析,要么没有一句能够执行。每两个GO之间的SQL语句为一个批处理单元。

每个批处理被单独地处理,一个批处理中的错误不会阻止另一个批处理的运行。

四、流程控制

1. BEGIN...AND

BEGIN...AND用于包裹语句块。

BEGIN
    语句
    语句
    语句
    ...
AND

2. IF...ELSE...

如果不使用BEGIN...AND包裹程序块,IF或ELSE中只能执行一条语句。IF...ELSE...可以嵌套。

IF 条件表达式
    一条语句
[ELSE  -- ELSE可选
    一条语句
]    

IF 条件表达式
    BEGIN
        多条语句
    END
[ELSE  -- ELSE可选
    BEGIN
        多条语句
    END
]
-- 如果SELECT子查询结果不为空,那么执行多条语句1。若加NOT,则如果子查询结果为空,执行多条语句1。
IF [NOT] EXISTS 子查询
    BEGIN
        多条语句1
    END
ELSE 
    BEGIN
        多条语句2
    END

3. CASE

两种使用方法。
①用CASE后的变量去匹配WHEN后的待匹配值,若没有ELSE语句且没有一个WHEN匹配,则返回NULL,否则返回THEN或ELSE后的值。

CASE 变量
    WHEN 待匹配值1 THEN 值1
    WHEN 待匹配值2 THEN 值2
    [ELSE 值3] -- ELSE可选
END

②从前到后判断WHEN后面的条件表达式,若都为False且没有ELSE语句,返回NULL,否则返回THEN或ELSE后的值。

CASE 
    WHEN 条件表达式1 THEN 值1
    WHEN 条件表达式2 THEN 值2
    [ELSE 值3] -- ELSE可选
END

CASE语句可以嵌套到SQL语句中,如:

SELECT SNo,SName,isPass=
    CASE
        WHEN Grade >= 60 THEN 'yes'
        ELSE 'no'
    END
FROM SC

CASE常用于给变量赋值,多和SETSELECT语句连用。

SET @Grade = 
    CASE 
        WHEN 条件表达式1 THEN 值1
        WHEN 条件表达式2 THEN 值2
        ELSE 值3
    END
SELECT @Grade = 
    CASE 
        WHEN 条件表达式1 THEN 值1
        WHEN 条件表达式2 THEN 值2
        ELSE 值3
    END

4. WHEN循环

WHEN 条件表达式
BEGIN
    多条语句
    [BREAK]  -- BREAK可选,与IF连用,退出整个循环
    [CONTINUE]  -- CONTINUE可选,与IF连用,跳过本次循环
END

5. WAITFOR

-- DELAY表示等待1小时2分3秒后执行后面的语句。
WAITFOR DELAY '01:02:03'
    语句
-- TIME表示在1点2分3秒时刻执行后面的语句。
WAITFOR TIME '01:02:03'
    语句

6. GOTO

标识符A:
    语句
GOTO 标识符A
五、常用命令

1. DECLARE

声明局部变量、游标变量、表变量。

2. EXECUTE\EXEC

执行存储过程。

3. PRINT

向客户端返回字符串常量或字符串变量

4. SELECT

给变量赋值,一次可以给多个变量赋值。
SELECT @a=1,@b=2,@c=7

5. SET

给变量赋值,与SELECT不同的是,一次只能给一个变量赋值。

SET @a=1
SET @b=2
SET @c=7

6. USE

选择数据库
USE StuDataBase

六、常用函数

1. ASCII()

返回最左端字符的ASCII码值。
ASCII('A55Qeca')则返回字符A的ASCII码值65

2. CHAR()

将ASCII码转字符,若大于255,返回NULL
CHAR(65)返回字符A

3. LOWER()

返回将字符串中所有大写字母转化为小写字母后的字符串,不是英文字母的字符不变。

4. UPPER()

返回将字符串中所有小写字母转化为大写字母后的字符串,不是英文字母的字符不变。

5. STR()

转化为字符串。

6. LTRIM()\RTRIM()

返回去掉左边的空格\去掉右边的空格的字符串。

7. LEFT()\RIGHT()

返回从左边开始\到右边结束的子串。
LEFT('串',整数)。整数表示结束的下标。下标从1开始计数。
LEFT('串',整数)。整数表示开始的下标。下标从1开始计数。

8. CAST()

CAST(表达式 AS 目标类型)

9. CONVERT()

CONVERT(目标类型,表达式)
CONVERT(日期时间类型,表达式,表示日期格式的整数)

10. 日期\时间相关函数

DAY()MONTH()YEAR()分别取时间的日期、月份、年份部分。
DATEADD(datepart,加的数值,原日期)返回在原日期上加上某datepart后的日期,datepart可以是DAY、MONTH、YEAR、WEEK等。
DATEDIFF(datepart,日期1,日期2)返回日期2减去日期1的差值。datepart可以是DAY、MONTH、YEAR、WEEK等。
DATEPART(datepart,日期)返回日期的指定部分。datepart可以是DAY、MONTH、YEAR、WEEK等。
GETDATE()返回当前日期和时间的DATETIME类型的值。

11. 用户自定义函数

①标量值函数:
返回单个数据值的函数。

CREATE FUNCTION 函数名
(
[
    @参数名 [AS] 参数类型 [=默认值] [READONLY], -- 若指定默认值,则不指定参数的值也能执行函数
    [@参数名 [AS] 参数类型 [=默认值] [READONLY], -- 若指定READONLY,则函数中不可修改或更新参数
     @参数名 [AS] 参数类型 [=默认值] [READONLY]
    ]
]
)
RETURNS 返回值类型
[WITH ENCRYPTION]  -- 此选项表示函数定义的文本被加密,不能查看。
[AS] -- AS用于说明函数体,加不加都可以,类似DECLARE @A [AS] INT中AS加不加都可以
BEGIN
    函数体
    RETURN 表达式
END

②内联表函数
内联表函数没有函数体,返回table类型(结果集)。

CREATE FUNCTION 函数名
(
[
    @参数名 [AS] 参数类型 [=默认值] [READONLY], -- 若指定默认值,则不指定参数的值也能执行函数
    [@参数名 [AS] 参数类型 [=默认值] [READONLY], -- 若指定READONLY,则函数中不可修改或更新参数
     @参数名 [AS] 参数类型 [=默认值] [READONLY]
    ]
]
)
RETURNS TABLE
[WITH ENCRYPTION]  -- 此选项表示函数定义的文本被加密,不能查看。
[AS]
RETURN SELECT语句

③多语句表函数
有函数体,返回table类型(结果集)。

CREATE FUNCTION 函数名
(
[
    @参数名 [AS] 参数类型 [=默认值] [READONLY], -- 若指定默认值,则不指定参数的值也能执行函数
    [@参数名 [AS] 参数类型 [=默认值] [READONLY], -- 若指定READONLY,则函数中不可修改或更新参数
     @参数名 [AS] 参数类型 [=默认值] [READONLY]
    ]
]
)
RETURNS @返回表变量名 TABLE (表定义)
[WITH ENCRYPTION]  -- 此选项表示函数定义的文本被加密,不能查看。
[AS]
BEGIN
    函数体
    RETURN  -- RETURN后不加变量名,RETURNS后已经指明了返回的表变量,在函数体中可以给表变量赋值
AND