1.2 SQL 的扩展
现有的SQL标准还不适用于为关系型数据库编写各种类型的程序。数据库厂商为满足各自用户的需求,开始扩展SQL语言能力,改善SQL的基本功能。
1.2.1 T-SQL
Transact_SQL(或称作T-SQL)是Microsoft的一个程序扩展集合。T-SQL为SQL增加了一些功能,包括事务控制、异常错误处理和行处理。即便是创建索引或执行条件操作这样一些最简单的操作,都是对SQL的扩展。T-SQL允许用户在T-SQL对象中声明和使用局部变量和常量。这些变量和常量必须是数据库能识别的类型。
1. T-SQL语言的主要组成部分
T-SQL作为SQL的扩展,其组成部分包括数据定义语言、数据控制语言、数据操纵语言和系统存储过程。其相应内容如下。
● 数据定义语言(DDL)是指用来定义和管理数据库以及数据库中的各种对象的语句,包括CREATE、ALTER和DROP等语句。
● 数据控制语言(DCL)是用来设置或者更改数据库用户或角色权限的语句,包括GRANT、DENY、REVOKE等语句,在默认状态下,只有sysadmin、dbcreator、db_owner或db_securityadmin等角色的成员才有权执行数据控制语言。
● 数据操纵语言(DML)是指用来查询、添加、修改和删除数据库中数据的语句,包括SELECT、INSERT、UPDATE、DELETE等这些语句。在默认情况下,只有sysadmin、dbcreator、db_owner或db_datawriter等角色的成员才有权执行数据操纵语言。
● 系统存储过程(System Stored Procedure)是SQL Server系统创建的存储过程,它的目的在于能够方便地从系统表中查询信息,或者完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程可以在任意一个数据库中执行。系统存储过程创建并存放于系统数据库master中,并且名称以sp_或者xp_开头。
2. 变量
变量是一种语言中必不可少的组成部分。T-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。
局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部变量还可以保存数据值,以供控制流语句测试以及保存由存储过程返回的数据值等。局部变量被引用时要在其名称前加上标志“@”,而且必须先用DECLARE命令定义后才可以使用。
使用全局变量时应该注意以下几点。
● 全局变量不是由用户的程序定义的,它们是在服务器级定义的。
● 用户只能使用预先定义的全局变量。
● 引用全局变量时,必须以标记符“@@”开头。
注意:
局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。
3. 运算符
运算符是一些符号,它们能够用来执行算术运算、字符串连接、赋值以及在字段、常量和变量之间进行比较。在T-SQL中,运算符主要有以下6大类:算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符以及字符串串联运算符。如下所示。
● 算术运算符可以在两个表达式上执行数学运算,这两个表达式可以是数字数据类型分类的任何数据类型。算术运算符包括加(+)、减(–)、乘(*)、除(/)和取模(%)。
● 赋值运算符的作用是能够将数据值指派给特定的对象。另外,还可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。T-SQL 中只有一个赋值运算符,即等号(=)。
● 位运算符的作用是能够在整型数据或者二进制数据(image 数据类型除外)之间执行位操作。此外,在位运算符左右两侧的操作数不能同时是二进制数据。
● 比较运算符用于比较两个表达式的大小或是否相同,其比较的结果是布尔值,即TRUE(表示表达式的结果为真)、FALSE(表示表达式的结果为假)以及UNKNOWN。除了 text、ntext 或 image 数据类型的表达式外,比较运算符可以用于所有的表达式。
● 逻辑运算符可以把多个逻辑表达式连接起来。逻辑运算符包括AND、OR和NOT等运算符。逻辑运算符和比较运算符一样,返回带有 TRUE 或 FALSE 值的布尔数据类型。
● 字符串串联运算符允许通过加号 (+) 进行字符串串联,这个加号即被称为字符串串联运算符。例如对于语句SELECT 'abc' + 'def ',其结果为abcdef。
运算符的优先等级从高到低如下所示。
(1) 括号:()
(2) 乘、除、求模运算符:*、/、%
(3) 加减运算符:+、-
(4) 比较运算符:=、>、<、>=、<=、<>、!=、!>、!<
(5) 位运算符:^、&、|
(6) 逻辑运算符:NOT
(7) 逻辑运算符:AND
(8) 逻辑运算符:OR
4. 函数
在T-SQL语言中,函数被用来执行一些特殊的运算以支持SQL Server的标准命令。T-SQL 编程语言提供了3种函数。
● 行集函数:可以在T-SQL语句中当作表引用。
● 聚合函数:用于对一组值执行计算并返回一个单一值。
● 标量函数:用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一值。
5. T-SQL的语法约定
T-SQL的语法约定如表1-1所示。
表1-1 T-SQL 参考的语法关系图中使用的约定
约 定 |
用 于 |
大写 |
T-SQL 关键字 |
斜体 |
用户提供的 T-SQL 语法的参数 |
粗体 |
数据库名、表名、列名、索引名、存储过程、实用工具、数据类型名以及必须按所显示的原样输入的文本 |
|(竖线) |
分隔括号或大括号中的语法项。只能使用其中一项 |
[ ](方括号) |
可选语法项。不要输入方括号 |
{ }(大括号) |
必选语法项。不要输入大括号 |
[,...n] |
指示前面的项可以重复 n 次。各项之间以逗号分隔 |
[...n] |
指示前面的项可以重复 n 次。每一项由空格分隔 |
[;] |
可选的 T-SQL 语句终止符。不要输入方括号 |
::= |
语法块的名称。此约定用于对可在语句中的多个位置使用的过长语法段或语法单元进行分组和标记。可使用的语法块的每个位置由括在尖括号内的标签指示 |
server_name.[database_name].[schema_name].object_name | database_name.[schema_name].object_name | schema_name.object_name | object_name |
上述语法中各参数的含义如表1-2所示。
表1-2 对象命名参数含义
参 数 名 称 |
参 数 含 义 |
server_name |
指定链接的服务器名称或远程服务器名称 |
database_name |
如果对象驻留在 SQL Server 的本地实例中,则指定 SQL Server 数据库的名称 |
schema_name |
如果对象在 SQL Server 数据库中,则指定包含对象的架构的名称 |
object_name |
对象的名称 |