SQL Server 2000数据库开发简明教程

附录

SQL Server 2000是微软公司推出的企业级数据库管理系统,是在SQL Server 7.0的基础上发展起来的,它扩展了SQL Server 7.0的性能、可靠性和易用性,使它成为一个优秀的大型在线事务处理平台、数据仓库和电子商务应用程序。

一、SQL Server 2000基础

1.关系型数据库基本概念

SQL Server 2000是关系型数据库的一种。关系型数据库是利用数据库进行数据组织的一种方式。在关系型数据库里,所有的数据都按表(即关系)进行组织和管理。每张表都由行和列组成,每一列表示有关表格描述对象的一个属性,例如员工代号、员工姓名、性别、工作部门等,分别表示了与“员工”这一信息描述对象相关的各种信息;而一行数据则表示信息描述对象某一具体实例的所有属性。
在关系型数据库中使用“事务”来处理用户提交的修改表格和数据的操作。“事务”是一次性完成的一组数据库操作。关系型数据库一般都按照先写日志的方法进行事务操作,即在实施事务之前先将要进行的操作记录进日志,再进行实际的数据库修改。日志文件在数据库恢复等工作中发挥着重要的作用。

2.SQL Server 2000客户服务器体系结构

SQL Server 2000采用客户/服务器计算模型,即中央服务器用来存放数据库,该服务器可以被多台客户机访问,数据库应用的处理过程分布在客户机和服务器上,客户/服务器计算模型分为两层和多层客户/服务器结构。

3.SQL Server 2000的查询语句──交互式SQL

查询语句是数据库管理系统的重要组成部分。许多关系数据库系统拥有作为高级查询语言的结构化查询语言(Structured Query Language,SQL)。交互式SQL(Transact-SQL)是SQL Server的查询语言。交互式SQL提供了创建和管理数据库对象、访问和修改数据、数据聚合和管理安全性和权限。

4.SQL Server 2000的数据库对象

在SQL Server 2000数据库里,表、视图、存储过程、触发器等具体存储数据或对数据进行操作的实体都称为对象。SQL Server的数据库就好象一个容器,容纳着各种数据库的对象。
(1)表(table):表是用来存储数据的两维数组,它有行和列。列也称为表属性或字段,表中的每一列拥有唯一的名字,每一列包含具体的数据类型,这个数据类型由列中的数据类型定义。
(2)视图(view):视图是虚拟的表,它只包含表的一部分。与表不同的是,保存在视图中的数据并不是物理存储的数据,它是由表派生的,派生表被称为视图的基本表。视图的定义存储在数据库中。
(3)约束条件(constraint):约束条件定义数据的完整性和有效性。约束条件为列中的值建立规则。换而言之,如果在某一列上定义了结束条件,则插入这一列的每一个值需要通过约束条件检查。约束条件是在触发器和规则上保证数据完整性和有效性的较佳选择。SQL Server Query Optimizer利用约束条件产生出低成本的查询计划。约束条件有如下类型:
NOT NULL:这个约束条件要求列中不能有NULL(空)值。
CHECK:为列指定能拥有值的集合后,检查约束条件。列中任何在定义之外的数据都为无效数据。有效值集合称为列的域。
PRIMARY KEY:主关键字,它用来唯一标识一行。
FOREIGN KEY:用来定义两个表之间的父子关系。如果一个关键字既是一个表的主关键字的一部分,同时又是另一个表的主关键字,则称它为外来关键字。外来关键字用来定义数据的引用完整性。
UNIQUE:唯一约束条件是指无任何两行在列中有相同的NON-NULL值。唯一性由主关键字保证,但他们不允许NULL值,并且每一个表只能有一个关键字。
(4)默认值(default):默认值是为列定义的值,如果在插入一行时没有提供某一列的值,则此列使用默认值,默认值可以是常量、数学表达式、内部函数(Built-in function)等。
(5)规则(rule):规则执行和CHECK约束条件同样的功能。但规则和约束条件不同的是:规则作为独立的对象存在,它可以用于多个表,而约束条件作为表的一部分存储。然而,规则是作为向后兼容特点而提供的,建议用户使用约束条件。
(6)触发器和存储过程:触发器和存储过程是一个Transact-SQL命令集,它们作为一个对象存储在数据库中。

二、管理数据库

1.创建数据库

创建数据库以前应考虑好谁将成为数据库的拥有者、数据库的大小以及将数据库文件存放在什么地方。同时,要创建数据库,用户必须是Sysadmin或dbcreator服务器角色的成员,或被明确赋予了执行CREATE DATABASE语句的权限。
(1)使用企业管理器创建数据库:
依次点击“开始→程序→Microsoft SQL Server→企业管理器”,在打开的窗口中双击展开要建立数据库的服务器节点。
右击“数据库”节点,选择“新建数据库”命令,打开“数据库属性”窗口。
在“Name”框中输入建立的数据库名称,如mydata。
点击“数据文件”选项卡,在这个窗口中可以增减数据文件,对每一个数据文件设置以下内容:
文件名:也叫逻辑文件名,SQL Server在默认情况下自动为用户输入的文件名后面增加下划线和Data字样,并设置相应的文件扩展名;位置:文件存放的路径;文件组:输入文件所属的文件组名称;文件增长:当数据文件的容量不够用时,SQL Server可以自动增加容量;最大文件大小:允许确定数据文件的最大容量。可以设置数据文件的容量是无限增大,也可以把数据文件的容量限制在某一个数量以内,如2MB。
点击“事务日志”选项卡,指定存放日志文件的位置、初始大小、增长方式。对每一个日志文件,也可以做和数据文件一样的五种设置。
最后点击“确定”按钮即可完成数据库的创建。
(2)使用CREATE DATABASE语句创建数据库:
你可以在“查询分析器”中,使用CREATE DATABASE语句来创建数据库。语法如下:
CREATE DATABASE database_name
[ON [PRIMARY]
[, [1,...n]]
[, [1,...n]]
]
[LOG ON { [1,...n]}]
[FOR LOAD | FOR ATTACH]
::=
([NAME=logical_file_name,]
FILENAME=′os_file_name′
[SIZE=size]
[MAXSIZE={max_size | UNLIMITED}]
[FILEGROWTH=growth_increment]) [1,...n])
::=FILEGROUP filegroup_name [1,...n]
上面的语法中,所有用[]括起来表示是省略的选项,[1,...n]表示同样的选项可以重复1到n遍;<>括起来表示是对一组若干选项的代替,实际编写语句时,应该用相应的选项来代替。类似A|B语句,表示可以选择A也可以选择B,但不能同时选择A和B。
其中,database_name表示为数据库取的名字,在同一个服务器内数据库的名字必须唯一,且最大不超过128个字符;ON表示存放数据库的数据文件在后面分别给出定义;PRIMARY为定义数据库的主数据文件。在PRIMARY filegroup中,第一个数据文件是主数据文件,如果没有给出PRIMARY关键字则默认文件序列中的第一个文件为主数据文件;LOG ON为定义数据库的日志文件;FOR LOAD是为了与过去的SQL Server版本兼容,它表示计划将备份直接装入新建的数据库;FOR ATTACH表示在一组已经存在的操作系统文件中建立一个新的数据库;NAME为定义操作系统文件的实际名字。逻辑文件名在Transact-SQL语句中使用,是实际磁盘文件名的代号;FILENAME为定义操作系统文件的实际名字,包括文件所在的路径;SIZE表示定义文件的初始长度;MAXSIZE定义文件能够增长到的最大长度,可以设置UNLIMITED关键字,使文件可以无限制增长,直到磁盘被填满;FILEGROWTH定义操作系统文件长度不够时每次增长的速度。可以用MB、KB或使用%来设置增长的百分比。默认情况下,使用MB作为增长速度的单位,最少增长1MB。
当语句输入完成后,请点击工具栏的“执行查询”按钮即可创建数据库。

2.操作数据库

(1)显示数据库信息:
右击需要查看的数据库,选择“属性”命令,打开数据库属性对话框,在该对话框中你可以选择不同的选项卡查看或修改数据库文件、日志文件、文件组以及使用权限等属性。
与创建数据库一样,我们也可以使用Transact-SQL语句来查看数据库的信息。这需要用到系统存储过程sp_helpdb,后面可以给定要查看的数据库名作为参数,如果不给出参数,将显示服务器中所有的数据库信息。如sp_helpdb mydata。
(2)修改数据库:
修改数据库包括增减数据文件和日志文件、修改文件属性(包括更改文件名和文件大小)、修改数据库选项等。使用“企业管理器”中的数据库属性对话框可以很方便地修改数据库。
用户可以使用“数据文件”选项卡来增减数据文件和修改数据文件属性;使用“事务日志”选项卡增减日志文件和修改日志文件属性。
使用数据库属性对话框的“选项”选项卡可以修改一些数据库选项,只需用鼠标点击这些复选框,就可以非常容易地更改当前数据库的选项。
所谓数据库选项,是指一些在某个数据库范围内有效的参数,可以用于控制数据库的某些特性和行为。所谓在数据库范围内有效,是指一个数据库的选项设置不会影响其他数据库。常见的数据库选项如下:
限制访问:即只允许特殊用户访问数据库。“db_owner、dbcreator或sysadmin”表示只允许db_owner、dbcreator或sysadmin的成员访问;“单用户”表示设置数据库为单用户模式。如果设置为“单用户”之前已有用户在使用该数据库,那么这些用户可以继续使用,但新的用户必须等到所有用户都退出后才能登录。
只读:将数据库设置为只读,即数据库中的数据只能读取,而不能修改。
自动关闭:用于指定数据库在没有用户访问并且所有进程结束时自动关闭,释放所有资源,当又有新的用户要求连接时,数据库自动打开。数据库关闭后,数据文件可以像普通文件一样处理,所以这个选项很适合移动用户,而对于网格应用数据库,则最好不要设置这个选项,因为频繁地关闭和重新打开对数据库性能造成极大的影响。
自动收缩:当数据或日志量较少时自动缩小数据库文件的大小。
自动更新统计信息:每次执行检查点操作后都删除事务日志。所谓检查点操作,就是将缓存在内存中的数据库数据真正写到硬盘中去,检查点操作后,事务已经不能再回滚了,所以可以清除事务日志。但事务日志被清除了以后,数据库的恢复将不能进行。事务日志有很重要的作用,所以这个选项应在数据库应用的开发阶段使用,而在实际应用中应关闭这一选项。
(3)删除数据库:
删除一个数据库会删除所有数据和该数据库所使用的所有磁盘文件,数据库在操作系统上占用的空间将被释放。但删除一个数据库后,如果想要恢复却是很麻烦的,必须从备份中恢复数据库和它的事务日志,所以,删除数据库之前应格外小心。
在“企业管理器”中删除数据库只需要展开“服务器→数据库”节点,右击需要删除的数据库,选择“删除”命令即可。

三、表的管理与使用

在创建好数据库后,还必须在数据库中创建存放数据的“容器”,这个“容器”就是表。表是SQL Server中一种重要的数据库对象,它存储数据库中的所有数据。表在数据库中是按照行列结构存储的,表实质上就是行列的集合,每一行代表一条记录,每一列代表记录的一个字段。表中的每一列都有一个与之相关的特定的数据类型,每一数据类型都有一定的特性。

1.设计表

(1)使用企业管理器创建表:
展开“企业管理器”树型结构上的数据库节点。右击需要建立表格的数据库,选择“新建→表”命令,打开新建表窗口。从该窗口中,需要对表的内容进行定义,其内容如下:
输入列名,列名在表中必须唯一,列的命名必须遵守SQL Server的数据库对象的命名规则;选择正确的数据类型、数据长度和精度;规定该列的数据是否为空;设置表格的主键和索引。
其中,创建主键的工作非常简单,首先右击需要建立主键的列,选择“设置主键”命令即可。建立为主键的列的旁边会出现一个小钥匙形的标志。
保存表格,点击工具栏中的“保存”按钮,输入表名,点击“确定”按钮即可。
(2)使用CREATE TABLE完成表格的创建:
使用CREATE TABLE语句创建表格的语法如下:
CREATE TABLE
[database_name.[owner].|owner.] table_name
({
|column_name AS computed_column_expression
|::=[CONSTRAINT constraint_name]}
|[{PRIMARY KEY|UNIQUE} [,...n]
)
[ON {filegroup|DEFAULT}]
[TEXTIMAGE_ON {filegroup|DEFAULT}]
::={column_name data_type}
[COLLATE]
[[DEFAULT constant_expression]
|[IDENTITY[(seed,increment)[NOT FOR REPLICATION]]]
]
[ROWGUIDCOL]
[] [...n]
其中,[database_name.[owner].|owner.] table_name表示定义表格名字,表名不超过128个字符;为列的定义;column_name是表中的列名,在表内唯一;data_type为指定列的数据类型;DEFAULT constant_expression表示定义该列的默认值;IDENTITY表示新列是标识列。当向表中添加新行时,SQL Server将为该标识列提供一个唯一的、递增的值,标识列通常与PRIMARY KEY约束一起用作表的唯一行标识符;seed是装入表的第一行所使用的值,也叫起始值;increment是添加到前一行的标识值的增量值,即是插入表的最近一行相对于前一行标识列数据据值的增量;ROWGUIDCOL表示新列是行的全局唯一标识符列;为定义与列相关联的约束,如NULL、NOT NULL和PRIMARY等;为定义对表的约束;[ON {filegroup|DEFAULT}]指定存储表的文件组。如果指定filegroup,则表将存储在指定的文件组中。数据库中必须存在该文件组。如果指定DEFAULT,或者根本未指定ON参数,则表存储在默认文件组中;TEXTIMAGE_ON是表示文本或图像列存储在指定文件组中的关键字。

2.删除表格

删除表格相对于创建表格来说,要简单得多。删除表格可以在“企业管理器”中进行。
展开“企业管理器”树型结构上的数据库节点,选择该数据库节点下的表节点,则“企业管理器”显示出该数据库下全部的表格。
右击需要删除的表格,选择“删除”命令,将打开“除去对象”对话框,在该对话框中列出了所有将被删除的表格,选中需要删除的表格,点击“全部除去”按钮即可。
注意:删除表格一定要小心,表格一旦被删除将无法恢复。

3.修改表格定义

当完成表格的设计后,如果发现在表格的定义上有令人不满意的地方,还可以对表格的定义进行修改。
使用“企业管理器”修改表格定义的步骤如下:
从树形结构上,展开要修改定义的表所在的数据库。选中该数据库节点下的表节点,则“企业管理器”将显示出该数据库下全部的表格。
右击需要修改定义的表,选择“设计表”命令,此时将打开最初建立表格时所使用的对话框,可以在这个对话框上进行增加列、删除列和修改列属性等操作。

4.查看表属性

创建表格之后,服务器将在系统表sysobjects中记录下表格名称、对象ID、表格类型、表格创建时间和拥有者ID等信息;同时在表syscolumns记录下了列名、列ID、列的数据类型及列长度等与列相关的信息。
从树型结构上,展开需要查看的表所在的数据库。选择该数据库节点下的表节点,则“企业管理器”将显示出该数据库中全部的表格。
右击需要查看的表格,选择“属性”命令,打开“表属性”对话框。
如果需要查看表的相关性关系,则可按以下步骤进行:
从树型结构上,展开需要查看的表所在的数据库。选择该数据库节点下的表节点,则“企业管理器”将显示出该数据库中全部的表格。
右击需要查看的表格,选择“所有任务→显示相关性”命令,打开“相关性”对话框。

5.表格重命名

当发现表名不恰当时,需要为表格重新命名,使用“企业管理器”进行表格重命名的步骤如下:
从树型结构上,展开需要查看的表所在的数据库。选择该数据库节点下的表节点,则“企业管理器”将显示出该数据库中全部的表格。
右击需要查看的表格,选择“重命名”命令。输入新的表名,按回车键确认即可。

四、存取与修改数据

(一)查询数据

数据库存在的意义在于有效地将数据组织在一起,使它们更容易被人们获得和利用,“查询”的含义就是从数据库中获得数据,查询功能是数据库最基本也是最重要的功能。
查询最基本的方式是使用SELECT语句,SELECT语句按照用户给定的条件从SQL Server数据库中取出数据,并将这些数据通过一个或多个结果集返回给用户。
1.SELECT语句
最基本的SELECT语句形式为:
SELECT select_list
FROM table_source
其中,select_list指定了结果集中要包含的列的名称,多列之间用逗号隔开;table_source为需要查询的表名。
(1)查询表中的所有的列:
如果要查询表中所有的列,不用将所有列的名字列出,而是用“*”代替。如:
SELECT *
FROM Customers
该查询语句执行后将显示Customers表的所有客户信息。
(2)在结果集中使用常量和计算值:
在SELECT语句的基本形式中,select_list不仅仅可以是表中的列,还可以是常量和计算值。比如查询Customers表,显示客户号和客户性名,并在每个客户号前面显示字符串“客户序号:”,使用如下代码:
SELECT ′客户序号:′,CustomersID,FirstName,LastName
FROM Customers
在select_list中,可以使用算术运算符操纵列,对查询的结果进行计算,这种计算可以是针对一个列的,也可以是针对多个列的。比如以下的语句从Orders表中查询订单信息,并计算出每个订单的销售额:
SELECT OrderID,GoodsName,CustomerID,Price*Quantity
FROM Orders
(3)消除结果集中重复的列:
如果被选择的结果中有重复的值,可以使用DISTINCT关键字来消除重复的值。如下面的代码:
SELECT DISTINCT GoodsName
FROM Orders
2.选择查询
到目前为止,运行的查询都是返回表中所有的行。而实际工作中大多数查询都不希望得到全表所有的列,而是一些满足特定条件的行。这就需要用到WHERE子句。
(1)基于比较条件选择查询结果:
WHERE子句的查询条件可以是比较布尔表达式,进行的比较可以是相等、大于、小于、不等于……。
如查看货品“Battery”的库存量情况,使用如下语句:
SELECT Name,Storage
FROM Goods
WHERE Name = ′Battery′
查看库存量大于1000的货品,使用如下语句:
SELECT Name,Storage
FROM Goods
WHERE Storage>1000
(2)基于范围条件选择查询结果:
查询的条件也可以是一个范围,这要使用BETWEEN关键字。比如查询发生在2001/10/1到2002/10/1之间的订单:
SELECT OrderID,GoodsName,CustomerID,OrderDate
FROM Orders
WHERE OrderDate BETWEEN ′2001/10/1′ AND ′2002/10/1′
(3)基于列表条件选择查询结果:
使用IN关键字可以查询符合列表中任何一个值的列。比如,查询北京、上海、天津三地的客户使用如下语句:
SELECT CustomerID,LastName,FirstName,City
FROM Customers
WHERE City IN(′Beijing′,′Tianjin′,′ShangHai′)
(4)基于多个条件选择查询结果:
在WHERE子句中,也可以使用逻辑运算符来连接多个条件,构成一个更复杂的条件进行查询。主要有以下三种逻辑运算符:
AND:它连接两个条件,如果两个条件都成立,则组合起来的条件成立。
OR:它连接两个条件,如果两个条件中有一个成立,则组合起来的条件成立。
NOT:它引出一个条件,将该条件的值取反。
比如,查询不发生在2002/10/1到2002/10/31之间的订单,使用如下语句:
SELECT OrderID,GoodsName,CustomerID,OrderDate
FROM Orders
WHERE OrderDate NOT BETWEEN ′2002/10/1′ AND ′2002/10/31′
查询货品为Hub且订货金额大于4000元的订单,使用如下语句:
SELECT OrderID,GoodsName,CustomerID,OrderDate
FROM Orders
WHERE GoodName = ′Hub′ AND OrderSum>4000
(5)查询结果排序:
默认情况下在查询结果中行的顺序就是它们在表中的顺序,但有时用户可能希望查出的结果按照某种顺序显示。通过ORDER BY子句,可以改变查询结果的显示顺序,其语法如下:
SELECT select_list
FROM table_source
WHERE search_condition
ORDER BY order_expression [ASC|DESC]
其中,order_expression是排序依据的列名或列号,ASC表示按升序排列,DESC表示按降序排列,默认为ASC。
比如,查询Orders表,结果按订单金额从小到大排序:
SELECT OrderID,GoodsName,CustomerID,OrderSum
FROM Orders
DRDER BY OrderSum
3.集合函数
集合函数计算表中数据的总和,得到统计的结果。
(1)AVG:
用于计算查询结果平均值。语法如下:
Avg([ALL|DISTINCT] Expression)
其中:
DISTINCT表示只计算不同值的平均值,如果有许多重复值,则这些值只计算一次,默认为ALL。
Expression可以是涉及一列或多列的算术表达式。
(2)MIN:
该函数用于查找最小值。比如查找Goods表中最便宜的定价,使用如下代码:
SELECT MIN(Price) AS Minimum
FROM Goods
(3)MAX:
该函数用于查找最大值。比如查找Goods表中最贵的定价,使用如下代码:
SELECT MAX(Price) AS Maximum
FROM Goods
(4)SUM:
SUM函数计算查询到的数据值的总和。其语法如下:
SUM([ALL|DISTINCT] Expression)
其中,ALL|DISTINCT的含义与AVG一样。
(5)COUNT:
该函数可以计算查询到的结果的数目。其语法如下:
COUNT([ALL|DISTINCT] Expression)
4.数据分组
(1)GROUP BY:
利用GROUP BY可以按一定的条件对查询到的结果进行分组,再对每一组数据计算统计信息。其语法如下:
SELECT select_list
FROM table_source
WHERE search_condition
GROUP BY group_by_expression
比如,查看每一种有订单的货品的订货总数:
SELECT GoodsName,SUM (Quantity) AS SumQuantity
FROM Orders
GROUP BY GoodsName
(2)HAVING:
HAVING子句用来向使用GROUP BY子句的查询中添加数据过滤准则。它的语法与WHERE子句一样。但WHERE是针对单个行而言的,HAVING是针对一组行而言的。也可以在一个包含GROUP BY子句的查询中使用WHERE。HAVING和WHERE的不同之处在于:执行查询时,在按照GROUP BY子句分组之间先去掉不满足WHERE中条件的行,而HAVING子句中的条件在分组之后被应用;HAVING子句可以在条件中包含聚合函数,但WHERE不行。
比如,查询订货总数大于500的货品:
SELECT GoodsName,SUM (Quantity) AS SumQuantity
FROM Orders
比如,查询订货总数大于500的货品:
SELECT GoodsName,SUM (Quantity) AS SumQuantity
FROM Orders
GROUP BY GoodsName
HAVING SUM (Quantity)>500
(3)COMPUTE与COMPUTE BY:
COMPUTE子句可以用来计算汇总数据。比如,查询在2002/10/1之间的订单的金额,并统计总金额:
SELECT OrderID,GoodsName,CustomerID,OrderSum
FROM Orders
WHERE OrderDate > ′2002/10/1′
COMPUTE SUM(OrderSum)
COMPUTE BY可以按照给定的条件将查询结果分组,并为每组计算汇总数据。比如,查询在2002/10/1之后的订单的金额,并统计每种货品的订单总金额:
SELECT OrderID,GoodsName,CustomerID,OrderSum
FROM Orders
WHERE OrderDate > ′2002/10/1′
ORDER BY GoodsName,OrderID
COMPUTE SUM(OrderSum) BY GoodsName
5.从多个表中查询数据──表连接
(1)内连接(Inner join):
内连接也叫自然连接,它是组合两个表最常用的方法。自然连接将两个表中的列进行比较,将两个表中满足连接条件的行组合起来,作为结果。其语法如下:
SELECT select_list
FROM table1 [INNER] JOIN table2
ON table.column1 = table.column2

SELECT select_list
FROM table1,table2
WHERE table.column1 = table.column2
(2)外连接(Outer join):
在自然连接中,只有在两个表中匹配的行才能在结果集中出现。而在外连接中可以只限制一个表,而对另外一个表不加限制(即所有的行都出现在结果集中)。
外连接分为左外连接、右外连接和全外连接。左外连接是对连接条件中左边的表不加限制;右外连接是对右边的表不加限制;全外连接对两个表都不加限制,所有两个表中的行都会包括在结果集中:
左外连接的语法是:
SELECT select_list
FROM table1 LEFT [OUTER] JOIN table2
ON table.column1 = table.column2
右外连接的语法是:
SELECT select_list
FROM table1 RIGHT [OUTER] JOIN table2
ON table.column1 = table.column2
全外连接的语法是:
SELECT select_list
FROM table1 FULL [OUTER] JOIN table2
ON table.column1 = table.column2
6.合并结果集
使用UNION语句可以把两个或两个以上的查询产生的结果集合并为一个结果集。其语法是:
select_statement
UNION [ALL]
select_statement
其中,select_statement为查询语句,它们的结果集将被合并。
合并结果集有以下限制:
(1)UNION中的每一个查询所涉及的列必须具有相同的列数,相同的数据类型,并以相同的顺序出现。
(2)最后结果集中的列名来自第一个SELECT语句。
(3)如果UNION中包含ORDER BY子句,则将对最后的结果集排序。
(4)在合并结果集时,默认将从最后的结果集中删除重复的行,除非使用ALL关键字。

(二)添加新数据

当数据库中的表被创建好后,必然要将数据添加到表中。
1.使用INSERT语句
使用INSERT语句向表中添加数据有两种方式,一种是用VALUES关键字直接给各列赋值,另一种是使用SELECT子句,把从其他表或视图中选取的数据插入。其基本语法如下:
INSERT [INTO]
table_or_View [(column_list)]
{data_values|select_statement}
(1)添加数据到一行中的所有列:
当将数据添加到一行中的所有列时,使用VALUES关键字来给出要添加的数据。INSERT语句中无需给出表中的列名,只要VALUES中给出的数据与用CREATE TABLE定义表时给定的列名顺序相同即可。比如,向Orders表中添加一条记录:
INSERT INTO Orders
VALUES(′Hub′,4,60,′2002/10/1′,5400)
需要注意的是,不能对IDENTITY列、计算列等进行赋值,另外,向表中插入数据不能违反完整性约束。
(2)插入默认值:
可以为一个表的所有列都插入默认值,方法是使用语句:
INSERT INTO tablename
DEFAULT VALUES
使用该语句的表的所有列都必须为IDENTITY列、TIMESTAMP列、允许为NULL或具有默认值。同时,也可以在INSERT语句中指定为某一列赋予默认值。
(3)使用INSERT...SELECT语句插入多行:
使用SELECT子句可以将从一个或多个表或视图中选择来的数据添加到表中。SELECT子句可以将数据添加到一行的部分或全部列中。
需要注意的是被插入数据的表与SELECT子句的结果集必须兼容,即列数、列序、数据类型都应兼容。
2.使用WRITETEXT语句
使用WRITETEXT语句可以更新已存在的文本或图像数据,被更新的文本或图像数据被完全覆盖,默认状态下,WRITETEXT语句的操作不被记入事务日志。WRITETEXT语句的基本语法如下:
WRITETEXT table.column text_ptr data
其中,table.column为需要更新的文本或图像的列名。
text_ptr为指向需要更新的文本或图像数据的指针,它的数据类型必须是binary(16)。
data为需要写入的文本或图像数据。

(三)修改数据

1.使用UPDATE语句修改数据
可以使用SET子句指定要被修改的列及修改后的数据。当没有WHERE子句指定修改条件时,表中所有的行的指定列将被修改为SET子句给出的新数据。新数据可以是指定的常量或表达式,或是来自于其他表的数据。下面的代码表示将所有的定价提高10%:
UPDATE Goods
SET Price = Price*1.1
2.使用UPDATETEXT语句
在前面我们介绍过WRITETEXT语句,WRITETEXT语句的作用是修改完整的文本和图像数据,而UPDATETEXT语句则可以用于修改文本或图像数据后部分。与WRITETEXT相比UPDATETEXT语句更加灵活。比如,在某一个货品的描述文本中只需要修改一个拼写错误,这时就可以用UPDATETEXT语句,仅对文本中有错误的地方进行修改。其语法如下:
UPDATETEXT {table_name.dest_column_name dest_text_ptr}
{NULL|insert_offset}
{NULL|delete_length}
inserted_data
其中,table_name.dest_column_name为要更新的表和 text、ntext 或 image 列的名称;dest_text_ptr为指向要更新的文本或图像数据的指针的值。dest_text_ptr必须为binary(16);insert_offset:以零为基的更新起始位置。值为0表示将新数据插入到现有位置的开始处。值为NULL则将新数据追加到现有数据值中;delete_length:是从insert_offset位置开始的、要从现有文本或图像列中删除的数据长度。值为NULL 则删除现有文本或图像列中从insert_offset位置开始到末尾的所有数据;inserted_data:是要插入到现有文本或图像列insert_offset位置的数据。

(四)删除数据

1.使用DELETE语句
使用Transact-SQL中的DELETE语句可以删除数据表或视图中的一个或多个记录。DELETE语句最简单的形式如下:
DELETE table_or_view
FROM table_sources
WHERE search_condition
其中,table_or_view是从中删除数据的表或视图的名称。表或视图中所有满足WHERE子句条件的记录都将被删除。如果DELETE语句中没有WHERE子句限制,表或视图中的所有记录都将被删除;FROM table_sources语句使DELETE可以先从其他表查询出一个结果集,然后删除table_or_view中与该查询结果相关的行。
2.使用TRUNCHTE TABLE语句
TRUNCHTE TABLE语句提供了一种删除表中所有记录的快速方法,因为TRUNCHTE TABLE语句不记录日志,只记录整个数据页的释放操作,而DELETE语句对每一行修改都记录日志,所以TRUNCHTE TABLE语句总比没有指定条件的DELETE语句快。比如,删除所有订单记录:
TRUNCHTE TABLE Orders

五、视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而你需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。
1.使用企业管理器创建
在“企业管理器”中,依次展开服务器组、服务器、数据库,右击“视图”节点,选择“新建视图”命令,打开新建视图窗口。
右击图表窗格(即最上面的窗格),选择“添加表”命令,打开“添加表”对话框。该对话框中包括了三个选项卡,分别显示了当前数据库中的“表”、“视图”、“函数”。从中选定你需要的对象后,点击“添加”按钮即可添加创建视图的基表。重复该步骤,可以添加多个基表。添加完毕,点击“关闭”按钮。添加完基表后可以在图表窗格中看到你新添加的基表,以及基表之间的外键引用关系。每个基表的每一列左边都有一个复选框,选择该复选框,可以指定该列在视图中被引用。
在条件窗格中(即中间的窗格),可以指定查询条件。条件窗格中显示了所有在图表窗格中选中的、要在视图中引用的列。也可以对每一列选中或取消选中“输出”,来控制该列是否在视图中出现。
在条件窗格中的“准则”列中,它用于输入对在视图中出现的列的限制条件,该条件相当于定义视图的查询语句中的WHERE子句。
要在视图的定义中按照某一列进行分组,可以在条件窗格中右击该列,并从快捷菜单中选择“分组”命令。
在视图窗口中任意位置右击,选择“属性”命令,可以打开“属性”对话框。在该对话框中,选中“顶端”复选框可以限制视图最多包含多少条记录,选中“DISTINCT值”项可以指定在视图中不包含相同的记录,选中“加密浏览”可以对视图定义加密。
所有设置完毕后,可以在条件窗格下面查看视图查询条件的Transact-SQL语句。你也可以自己修改Transact-SQL语句,修改完毕后,点击工具栏中的“验证SQL”按钮,检查该语句的语法是否正确。需要运行并输出该视图结果,可以右击该窗格,选择“运行”命令,在窗口的最下面的输出窗格中将会显示按照Transact-SQL语句生成的视图内容。
创建完毕,点击工具栏中的“保存”。
2.修改视图
在完成视图定义后,可以在不除去和重新创建视图的条件下更改视图名称或修改其定义,从而丢失与之相关联的权限。
在“企业管理器”中,依次展开服务器组、服务器、数据库、视图,在右边窗口的视图列表中用右击需要查看的视图,选择“属性”命令,打开“属性”对话框。
在该对话框中的“文本”框中就是视图的定义,你可以在这里对视图的定义进行修改,修改完毕后点击“检查语法”按钮,进行语法检查。
3.重命名视图
在重命名视图时,请遵循以下原则:
要重命名的视图必须位于当前数据库中;新名称必须遵守标识符规则;只能重命名自己拥有的视图;数据库所有者可以更改任何用户视图的名称。
更改视图并不影响相关对象,如存储过程或触发器,除非视图定义的更改使该相关对象不再有效。
依次展开服务器组、服务器、数据库、视图,在右边窗口的视图列表中用右击需要重命名的视图,选择“重命名”命令。
输入视图的新名称即可。
4.删除视图
依次展开服务器组、服务器、数据库、视图,在右边窗口的视图列表中用右击需要删除的视图,选择“删除”命令,打开“除去对象”对话框
如果确认要删除视图,点击“全部除去”按钮,也可以点击“显示相关性”按钮来查看数据库中与该视图有相互关系的其他数据库对象。