SQL SERVER (4)

Transact-SQL语言基础(一)

SQL(structure query language,结构化查询语言)语言是国际标准化组织(international standardize organization,ISO)采纳的标准数据库语言。

Transact-SQL语言是微软公司在关系型数据库管理系统Microsoft SQL Server中的ISO SQL的实现与扩展。

通过使用Transact-SQL语言,用户几乎可以完成Microsoft SQL Server数据库中的所有操作。

Transact-SQL语言与SQL语言并不完全等同。不同的数据库供应商一方面采纳了SQL语言作为自己数据库的操作语言,另一方面又对SQL语言进行了不同程度的扩展。这种扩展的主要原因是不同的数据库供应商为了达到特殊目的和实现新的功能,不得不对标准的SQL语言进行扩展,而这些扩展往往又是SQL标准的下一个版本的主要实践来源。

一、Transact-SQL语言类型

在Microsoft SQL Server 2005系统中,根据Transact-SQL语言的功能特点,可以把Transact-SQL语言分为5种类型,即

数据定义语言
数据操纵语言
数据控制语言
事务管理语言
附加的语言元素


Transact-SQL语言的执行方式:

在Microsoft SQL Server 2005系统中,主要使用SQL Server Management Studio工具来执行Transact-SQL语言编写的查询语句。除此之外,还可以使用sqlcmd实用工具来执行Transact-SQL语句。

 1. 数据定义语言(DDL)

数据定义语言用于创建数据库和数据库对象,为数据库操作提供对象。

例如,数据库以及表、触发器、存储过程、视图、索引、函数、类型、用户等都是数据库中的对象,都需要通过定义才能使用。
在DDL中,主要的Transact-SQL语句包括CREATE语句、ALTER语句、DROP语句。
   (1)CREATE语句用于创建数据库以及数据库中的对象,是一个从无到有的过程。也就是说,CREATE语句用于创建将要在今后使用数据库或数据库对象。

   (2)ALTER语句用于更改数据库以及数据库对象的结构。也就是说,ALTER语句的对象必须已经存在。
ALTER语句仅仅是更改其对象的结构,其对象中已有的数据不受任何影响。对于表对象来说,使用ALTER语句在表中增加一个新列、删除一个列等操作都属于对表结构的更改。

   (3)DROP语句用于删除数据库或数据库对象的结构可以通过使用DROP语句来完成。需要注意的是,删除对象结构包括删除该对象中的所有内容和对象本身。

 2.  数据操纵语言(DML)

DML语言包括了INSERT、SELECT、UPDATE及DELETE等语句。
   (1)INSERT语句用于向已经存在的表中插入新的数据,一次插入一行数据。当需要向表中插入多行数据时,需要多次使用INSERT语句。
   (2)UPDATE语句

如果表中的数据不正确或不合适或者已经变化,那么可以使用UPDATE语句更新这些不恰当的数据。
   (3)DELETE语句
使用DELETE语句可以删除表中的数据。一般地,如果在DELETE语句中没有删除条件,那么将删除表中的所有数据。
需要注意的是,DELETE语句与DROP语句不同。DELETE语句删除表中的数据,但是该表对象依然存在。DROP语句则删除了表对象,表中的数据自然也不存在了。
 

3. 数据控制语言(DCL)

数据控制语言(DCL)主要用来执行有关安全管理的操作,该语言主要包括GRANT语句、REVOKE语句和DENY语句。GRANT语句可以将指定的安全对象的权限授予相应的主体,REVOKE语句则删除授予的权限,DENY语句拒绝授予主体权限,并且防止主体通过组或角色成员继承权限。

4.事务管理语言
在Microsoft SQL Server系统中,可以使用BEGIN TRANSACTION、COMMIT TRANSACTION及ROLLBACK TRANSACTION等事务管理语言(TML)语句来管理显式事务。
其中,BEGIN TRANSACTION语句用于明确地定义事务的开始,COMMIT TRANSACTION语句用于明确地提交完成的事务。如果事务中出现了错误,那么可以使用ROLLBACK TRANSACTION语句明确地取消定义的事务。

5.  附加的语言元素

除了前面介绍的语句之外,Transact-SQL语言还包括了附加的语言元素。
这些附加的语言元素主要包括标识符、变量和常量、运算符、表达式、数据类型、函数、控制流语言、错误处理语言及注释等。
(1)标识符
在Transact-SQL语言中,数据库对象的名称就是其标识符。
在Microsoft SQL Server系统中,所有的数据库对象都可以有标识符,例如服务器、数据库、表、视图、索引、触发器、约束等。大多数对象的标识符是必须的,例如创建表时必须为表指定标识符。
但是,也有一些对象的标识符是可选的,例如创建约束时用户可以不提供标识符,其标识符由系统自动生成。

按照标识符的使用方式,可以把这些标识符分为常规标识符和分割标识符两种类型。

 标识符的规则:

规则一,第一个字符必须是下列字符之一: Unicode标准定义的字母或下划线(_)、符号(@)或数字符号(#)。
规则二,后续字符可以包括:Unicode标准中定义的字母。基本拉丁字符或十进制数字。下划线(_)、符号(@)、数字符号(#)或美元符号($)。
规则三,标识符不能是Transact-SQL语言的保留字,包括大写和小写形式。
规则四,不允许嵌入空格或其他特殊字符。


 使用分割标识符
*            有两种情况下使用分割标识符:一是对象名称中包含了Microsoft SQL Server保留字时需要使用分割标识符,例如[where]分割标识符;二是对象名称中使用了未列入限定字符的字符,例如[product[1] table]分割标识符。
*          使用双引号分割的标识符称为引用标识符,使用方括号分割的标识符称为括号标识符。默认情况下,只能使用括号标识符。当QUOTED_IDENTIFIER选项设置为ON时,才能使用引用的标识符。


(2)变量和常量

      在Microsoft SQL Server 2005系统中,变量也被称为局部变量,是可以保存单个特定类型数据值的对象。一般地,经常在批处理和脚本中使用变量,这些变量可以作为计数器计算循环执行的次数或控制循环执行的次数;保存数据值以供控制流语句测试;保存存储过程返回代码要返回的数据值或函数返回值。
      在Transact-SQL语言中,可以使用DECLARE语句声明变量。在声明变量时需要注意:第一,为变量指定名称,且名称的第一个字符必须是@;第二,指定该变量的数据类型和长度;第三,默认情况下将该变量值设置为NULL。
           常量是表示特定数据值的符号,常量也被称为字面量。常量的格式取决于它所表示的值的数据类型。例如,'This is a book.'、'August 8, 2008'、29157等都是常量。对于字符常量或时间日期型常量,需要使用单引号引起来。

 (3)运算符
运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。在Microsoft SQL Server 2005系统中,可以使用的运算符可以分为算术运算符、逻辑运算符、赋值运算符、字符串串联运算符、按位运算符、一元运算符及比较运算符等。
算术运算符可以用于对两个表达式进行数学运算

 

(4)控制流语言
一般地,结构化程序设计语言的基本结构是顺序结构、条件分支结构和循环结构。顺序结构是一种自然结构,条件分支结构和循环结构都需要根据程序的执行状况对程序的执行顺序进行调整。
在Transact-SQL语言中,用于控制语句流的语言被称为控制流语言。Microsoft SQL Server 2005系统提供了8种控制流语句

(5)错误捕捉语言
为了增强程序的健壮性,必须对程序中可能出现的错误进行及时处理。在Transact-SQL语言中,可以使用两种方式处理发生的错误,即使用TRY…CATCH构造和使用@@ERROR函数。
在Transact-SQL语句中,可以使用TRY…CATCH构造来处理Transact-SQL代码中的错误。TRY…CATCH构造由一个TRY块和一个CATCH块组成,如果在TRY块中包含了Transact-SQL语句中检测到的错误条件,那么控制将被传递到CATCH块中以便处理该错误。
@@ERROR函数可以用于捕捉上一个Transact-SQL语句生成的错误号。

(6)注释
所有的程序设计语言都有注释。
注释是程序代码中不执行的文本字符串,用于对代码进行说明或暂时仅用正在进行诊断的部分语句。一般地,注释主要描述程序名称、作者名称、变量说明、代码更改日期、算法描述等。
在Microsoft SQL Server系统中支持两种注释方式,即双连字符(--)注释方式和正斜杠星号字符对(/*…*/)注释方式。
(7)数据类型

Microsoft SQL Server 2005系统提供了28种数据类型。这些数据类型可以分为数字数据类型、字符数据类型、日期和时间数据类型、二进制数据类型以及其他数据类型。

  数字数据类型

使用数字数据的数据类型被称为数字数据类型。这些数据类型的数字可以参加各种数学运算。我们还可以为这些数据类型继续进行分类。
根据是否有小数,可以把这些数据类型分为整数类型和小数类型。
根据数字的精度和位数是否确定,可以把这些数据类型分为精确数字类型和近似数字类型。
表示金额,可以分为货币数字类型和非货币数字类型。

整数数据类型
整数数据类型表示可以存储整数精确数据。
在Microsoft SQL Server 2005系统中,有4种整数数据类型即BIGINT、INT、SMALLINT、TINYINT。
可以从取值范围和长度两个方面理解这些整数数据类型。

DECIMAL和NUMERIC数据类型
DECIMAL和NUMERIC数据类型都是带固定精度和位数的数据类型。
这两种数据类型在功能是等价的,只是名称不同而已。
在Microsoft SQL Server 2005系统中,把这两种数据类型实际上作为完全相同的一种数据类型来对待。
MONEY和SMALLMONEY数据类型
如果希望存储代表货币数值的数据,那么可以使用MONEY和SMALLMONEY数据类型。这两种数据类型的差别在于存储字节的大小和取值范围不同。
在Microsoft SQL Server 2005系统中,MONEY数据类型需要耗费8个存储字节,其取值范围是-922,337,203,685,477.5808至922,337,203,685,477.5807。SMALLMONEY数据类型只需要4个存储字节,取值范围是-214,748.3648至214,748.3647。
FLOAT或REAL数据类型
如果希望进行科学计算,并且希望存储更大的数值,但是对数据的精度要求并不是绝对的严格,那么应该考虑使用FLOAT或REAL数据类型。
FLOAT或REAL数据类型是用于表示数值数的近似数据值的数据类型。

BIT

BIT是可以存储1、0或NULL数据的数据类型。
这些数据主要是用于一些条件逻辑判断。
也可以把TRUE和FALSE数据存储到BIT数据类型中,这时需要按照字符格式存储TRUE和FALSE数据。
字符数据类型
字符数据类型用于存储固定长度或可变长度的字符数据。
在Microsoft SQL Server 2005系统中,提供了CHAR、VARCHAR、TEXT、NCHAR、NVARCHAR和NTEXT 6种数据类型。
前3种数据类型是非Unicode字符数据,后3种是Unicode字符数据。
日期和时间数据
如果希望存储日期和时间数据,那么可以使用DATETIME或SMALLDATETIME数据类型。
这两种数据类型的差别在于其表示的日期和时间范围不同、时间精确度也不同。
DATETIME数据类型可以表示的范围是1753年1月1日至9999年12月31日,时间精确度是3.33毫秒。SMALLDATETIME数据类型可以表示的范围是1900年1月1日至2079年12月31日,时间精确度是1分钟。
建议用户在大型应用程序中不要使用SMALLDATETIME数据类型,避免出现类似千年虫的问题。因为2079年12月31日不是一个特别遥远的日期。
二进制数据类型
二进制数据类型包括BINARY、VARBINARY和IMAGE 3种数据类型,可以用于存储二进制数据。
其中,BINARY可以用于存储固定长度的二进制数据,VARBINARY用于存储可变长度的二进制数据。BINARY(n)和VARBINARY(n)的数据长度由n值来确定,n的取值范围是1至8000。IMAGE数据类型用于存储图像信息。
但是,在Microsoft SQL Server 2005系统中,微软建议使用VARBINARY(MAX)代替IMAGE数据类型
其他数据类型
除了前面介绍的数据类型之外,Microsoft SQL Server 2005系统还提供了CURSOR、SQL_VARIANT、TABLE、TIMESTAMP、UNIQUEIDENTIFIER及XML等数据类型。

 

(8)内置函数
可以把Microsoft SQL Server 2005系统提供的内置函数分为14种类型,每一种类型的内置函数都可以完成某种类型的操作