SQL语言按照用途可以分为如下3类:
①DDL(Data Definition Language) 数据定义语言:
定义修改和删除数据库、表、索引和视图等
②DML(Data Manipulation Language) 数据处理语言:
对数据进行查询(SELECT)、插入(INSERT)、删除(DELETE)、更新(UPDATE)等
③DCL(Data Control Language) 数据控制语言:
对数据库对象的权限管理和事务管理
一、T-SQL语法基础
1.标识符
在SQL Server中,标识符就是指用来定义服务器、数据库、数据库对象和变量等的名称。
①.常规标识符
常规标识符是指符合标识符的格式规则不需要使用分隔符进行分隔的标识符。
标识符的格式规则,如:
Select * from book where bname=“C程序”
中的book和bname。
命名规则:
1)第一个字符:字母、_、@和#
2)后续字符可以是字母、数字、@、$、#或_
3)标识符不可以是保留字
4)不允许嵌入空格或其他特殊字符
5)字符数在1-128之间。
特殊意义的标识符:
1)以@开始的标识符表示局部变量
2)以@@开始的标识符表示全局变量
3)以#开始的标识符表示临时表或过程
4)以##开始的标识符表示全局临时对象
②. 分隔标识符
分隔标识符在下列情况下使用:
当在对象名称或对象名称的组成部分中使用保留字时
当使用未被列为合法标识符的字符时
T-SQL使用的两种分隔符:
1)双引号(”)。(当QUOTED_IDENTIFIER设为ON时有效)
例如: SELECT * FROM " My Table "
2)方括号([ ])。
例如: SELECT * FROM [My Table]
分隔标识符的格式规则
2.常量
常量是指在程序运行过程中值始终不变的值。
3.变量
在SQL Server中,变量分为局部变量和全局变量
1)局部变量
前面有一个@字符,由用户定义和使用。
2)全局变量
名称前面有两个@字符,由系统定义和维护。
1) 局部变量
局部变量由用户定义,仅在声明它的批处理、存储过程或者触发器中有效。
局部变量的定义:
DECLARE { @local_variable data_type }[,...n]
注:变量不能是text、ntext或image数据类型
例: DECLARE @grade int,@sex char(2)
给变量赋值,可用set或select语句,如:
Set @local_variable=expression
Select {@local_variable=expression} [,…n]
例如:
1 DECLARE @grade int,@sex char(2)
2 set @grade=60
3 select @sex='女‘
4 select @grade, @sex
2)全局变量
全局变量记录了SQL Server的各种状态信息,它们不能被显示地赋值或声明,而且不能被用户定义。
4.运算符
运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。
SQL Server提供的运算符:算术运算符,赋值运算符,按位运算符,比较运算符,逻辑运算符,字符串运算符,一元运算符
赋值运算符: =
算术运算符: + - * / %
字符串连接运算符: +
比较运算符: > < = >= <= != <> !< !>
逻辑运算符: NOT AND OR BETWEEN EXISTS IN LIKE SOME ANY ALL
一元运算符:+ 正 -负 ~位反
按位运算符: & 按位与 |按位或 ^按位异或
运算符优先级:
+(正)、-(负)、~(按位NOT)
*、/、%
+(加)、+(连接)、-(减)
=、>、<、>=、<=、<>、!=、!>、!<
^(按位异或)、&(按位与)、|(按位或)
NOT
AND
ALL、ANY、BETWEEN、IN、LIKE、OR、
=(赋值)
5.流程控制语句
控制流语句是用来控制程序执行流程的语句,使用控制流语句可以在程序中组织语句的执行流程,提高编程语言的处理能力。
T-SQL提供控制流关键字,用于控制语句、语句块和存储过程的执行流。
控制流语句 | 说明 |
---|---|
BEGIN…END | 定义语句块 |
IF…ELSE | 条件处理语句,如果条件成立,执行IF语句; 否则执行ELSE语句 |
CASE | 分支语句 |
WHILE | 循环语句 |
GOTO | 无条件跳转语句 |
RETURN | 无条件退出语句 |
WAITFOR | 延迟语句 |
BREAK | 跳出循环语句 |
CONTINUE | 重新开始循环语句 |
① BEGIN…END语句
BEGIN…END语句用于将多个Transact-SQL语句组合为一个逻辑块。
语法格式为:
BEGIN
{
sql语句|语句块
}
END
下面几种情况经常要用到BEGIN和END语句:
WHILE循环需要包含语句块。
CASE语句的分支包含语句块。
IF或ELSE子句需要包含语句块。
② IF…ELSE语句
使用IF…ELSE语句,可以有条件地执行语句。其语法格式如下:
IF Boolean_expression
{sql语句|语句块}
[ELSE
{sql语句|语句块}]
③CASE语句
使用CASE语句可以进行多个分支的选择。CASE具有两种格式:
简单CASE格式:将某个表达式与一组表达式进行比较以确定结果。
搜索CASE格式:计算一组布尔表达式以确定结果。
注: CASE语句只能用于SQL语句的一部分,不能独立成句。
1)简单CASE格式
其语法格式如下:
CASE input_expression
WHEN when_expression THEN result_expression
[…n]
[ELSE else_result_expression]
END
注: input_expression和每个when_expression的数据类型必须相同或隐形转换。
如果未找到匹配值,也没有else子句,则返回null。
2)搜索CASE格式
其语法格式如下:
CASE
WHEN Boolean_expression THEN result_expression
[…n]
[ELSE else_result_expression]
END
注:如果Boolean_expression表达式的值为true,则返回then后的表达式,然后跳出case语句。
④ WHILE语句
WHILE语句可以重复执行若干SQL语句。
其语法格式如下:
WHILE Boolean_expression
{sql语句|语句块}
[BREAK]
{sql语句|语句块}
[CONTINUE]
⑤GOTO语句
GOTO语句可以实现无条件的跳转。其语法格式为:
GOTO lable
⑥ RETURN语句
使用RETURN语句,可以从查询或过程中无条件退出。可在任何时候用于从过程、批处理或语句块中退出,而不执行位于RETURN之后的语句。
语法格式为:
RETURN [integer_expression]
其中:integer_expression为一个整数值,是return语句要返回的值。
⑦ WAITFOR语句
使用WAITFOR语句,可以在指定的时间或者过了一定时间后,执行语句块、存储过程或者事务。
其语法格式为:
WAITFOR {DELAY 'time' | TIME 'time'}
⑧try…catch语句
实现错误处理功能。
其语法格式为:
Begin try
{sql_statement|sql_block}
End try
Begin catch
{sql_statement|sql_block}
End catch
6.注释
SQL Server的两种注释字符:
① --(双连字符)
这些注释字符可与要执行的代码处在同一行,也可另起一行。从双连字符开始到行尾均为注释。
② /*…*/(正斜杠-星号对)
从开始注释对(/*)到结束注释对(*/)之间的全部内容均视为注释部分。可对多行注释。
7.游标的使用
游标包括以下两个部分:
①游标结果集
定义该游标的SELECT语句返回的行的集合。
②游标位置
指向这个集合中某一行的指针。
游标的典型使用过程 :
1) 声明游标
声明游标使用DECLARE CURSOR语句,格式如下:
DECLARE cursor_name [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ , …n ] ] } ]
其中:
cursor_name:所定义游标名称。
SCROLL:指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果未指定 SCROLL,默认 NEXT。
lselect_statement:是定义游标结果集的标准 SELECT 语句。
UPDATE [OF column_name [,...n]]:定义游标内可更新的列。如果指定 OF column_name [,...n] 参数,则只允许修改所列出的列。如果在 UPDATE 中未指定列的列表,则可以更新所有列。
2) 打开游标
打开游标使用OPEN语句,其语法格式如下:
OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
其中:
GLOBAL:指定 cursor_name 为全局游标。
cursor_name:已声明的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为其名称,那么如果指定了 GLOBAL,cursor_name 指的是全局游标,否则 cursor_name 指的是局部游标。
cursor_variable_name:游标变量的名称,该名称引用一个游标。
3)从打开的游标中提取行
格式:
FETCH [ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ , …n ] ]
其中:
NEXT:返回紧跟当前行之后的结果行。
PRIOR:返回紧临当前行前面的结果行。
FIRST:返回游标中的第一行并将其作为当前行。
LAST:返回游标中的最后一行并将其作为当前行。
ABSOLUTE {n | @nvar}:如果 n 或 @nvar 为正数,返回从游标头开始的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回游标尾之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,则没有行返回。
RELATIVE {n | @nvar}:如果 n 或 @nvar 为正数,返回当前行之后的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回当前行之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,返回当前行。
GLOBAL:指定 cursor_name 指的是全局游标。
cursor_name:要从中进行提取的开放游标的名称。
@cursor_variable_name:游标变量名,引用要进行提取操作的打开的游标。
INTO @variable_name[,...n]:允许将提取操作的列数据放到局部变量中。
@@FETCH_STATUS()函数
该函数报告上一个FETCH语句的状态,其取值和含义如表所示。
取值 | 含义 |
---|---|
0 | FETCH语句成功 |
-1 | FETCH语句失败或此行不在结果集中 |
-2 | 被提取的行不存在 |
@@ROWCOUNT 全局变量
用来提供游标活动信息,它返回受上一语句影响的行数。
4)关闭游标
关闭游标使用CLOSE语句,其语法格式如下:
CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }
5) 释放游标
释放游标将释放所有分配给此游标的资源。格式为:
DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }