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常用于给变量赋值,多和SET
、SELECT
语句连用。
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