980 likes | 1.05k Views
5.1 SQL Server2000 数据库基本操作 5.2 表和视图的基本操作 5.3 案例 3 :创建活期储蓄管理系统数据库 -- 数据库的物理设计与实现. SQL Server2000 中一台服务器上可创建多个数据库。 SQL Server2000 中的数据库是由数据表的集合组成的,每个数据表中包含数据以及其他数据库对象,这些对象包括视图、索引、存储过程和触发器等。 数据库系统使用一组操作系统文件来映射数据库管理系统中保存的数据库,数据库中的所有数据和对象都存储在其映射的操作系统文件中。这些操作系统文件可以是数据文件或日志文件。.
E N D
5.1 SQL Server2000数据库基本操作 5.2 表和视图的基本操作 5.3 案例3:创建活期储蓄管理系统数据库 --数据库的物理设计与实现
SQL Server2000 中一台服务器上可创建多个数据库。SQL Server2000中的数据库是由数据表的集合组成的,每个数据表中包含数据以及其他数据库对象,这些对象包括视图、索引、存储过程和触发器等。 数据库系统使用一组操作系统文件来映射数据库管理系统中保存的数据库,数据库中的所有数据和对象都存储在其映射的操作系统文件中。这些操作系统文件可以是数据文件或日志文件。
5.1 SQL Server2000数据库基本操作 5.1.1 SQL Server数据库概述 • 数据库文件和文件组 SQL Server的数据库由数据文件和日志文件组成。数据文件是用来存放数据库中的数据的。数据文件又包括主数据文件和次数据文件。每个数据库都包括一个主数据文件和一个或多个日志文件,还可以有次数据文件。 • 主数据文件(.mdf):存储数据信息和数据库的启动信息。一个数据库有且仅有一个主数据文件。 • 次数据文件(.ndf):存储主数据文件存储不下的数据信息。一个数据库可以没有次数据文件,也可有多个次数据文件。 • 日志文件(.ldf):存储数据库的所有事务日志信息,包含用于恢复数据库的日志信息,一个数据库至少有一个日志文件,也可以有多个日志文件。
数据库文件组 为了方便管理、提高系统性能,将多个数据库文件组织成一组,即称为数据库文件组。数据库文件组控制各个文件的存放位置,常常将每个文件建立在不同的硬盘驱动器上。这样可以减轻单个硬盘驱动器的存储负载,提高数据库的存储效率,从而实现提高系统性能的目的。 在使用数据库文件和文件组时,应该注意以下几点: 1)每个文件或文件组只能用于一个数据库。 2)每个文件只能属于一个文件组。 3)日志文件是独立的。数据库的数据和日志信息不能放在同一个文件或文件组中,数据文件和日志文件总是分开的。
系统数据库和示例数据库 SQL Server支持系统数据库、示例数据库和用户数据库。 系统和示例数据库是在安装 SQL Server后自动创建的,用户数据库是由系统管理员或授权的用户创建的数据库。 • 系统数据库 SQL Server的系统数据库包括以下几个数据库: • master数据库 是SQL Server的总控数据库,保存了SQL Server系统的全部系统信息、所有登录信息和系统配置,保存了所有建立的其他数据库及其有关信息。用户应随时备份该数据库,以保证系统的正常运行。 master数据库中包含大量的系统表、视图和存储过程,用于保存Server级的系统信息,并实现系统管理。其中特有的、常用的系统表和存储过程见附录B和附录C。
tempdb数据库 tempdb是一个临时数据库,是全局资源,它保存全部的临时表和临时存储过程。每次启动 SQL Server时,tempdb数据库都被重建,因此,该数据库在系统启动时总是干净的。 使用tempdb不需要特殊的权限。不管SQL Server中安装了多少数据库,tempdb只有一个。tempdb是系统中负担最重的数据库,几乎所有的查询都可能使用它。 • model数据库 是一个模板数据库。每当创建一个新数据库时,SQL Server就复制model数据库的内容到新建数据库中,因此,所有新建数据库的内容都和这个数据库完全一样。 如果用户想使每个新建的数据库一开始就具有某些对象,可以将这些对象放到model数据库中,这样所有新建的数据库都将继承这些内容。model数据库中有18个系统表(master数据库中也有这些系统表)、视图以及存储过程,用于保存数据库级的系统信息。
msdb数据库 msdb数据库是一个和自动化有关的数据库。SQL Server 代理(SQL Server Agent)使用 msdb数据库来安排报警、作业,并记录操作员。如完成一些调度性的工作,备份和复制等。 • 示例数据库 SQL Server的示例数据库主要包括以下两个数据库。 • pubs数据库 一个图书出版方面的示例数据库,虽然用户可以随时修改、甚至删除该数据库,但建议用户保留该数据库,以便更好地学习SQL Server。 • Northwind数据库 一个涉及虚构的Northwind贸易公司在世界范围内进出口食品的销售情况示例数据库。
5.1.2 创建数据库 • 创建数据库:就是为数据库确定名称、大小、存放位置、文件名和所在文件组的过程。 • 文件名称:数据文件和日志文件的名称(逻辑名) 。文件名必须符合命名规则。在同一台SQL Server服务器上,各数据库的名称是惟一的。数据库的创建信息存放在master数据库的sysdatabases系统表中。创建数据库后,系统自动把model数据库中的信息复制到新建的数据库中。 • 创建数据库之前,首先要考虑数据库的拥有者、数据库的初始容量、最大容量、增长量以及数据库文件的存放路径等因素,文件大小一般以MB为单位。 • SQL Server 2000中创建数据库的方法: ①使用企业管理器创建数据库 ②使用Transact-SQL语句创建数据库 ③使用向导创建数据库
使用企业管理器创建数据库 例:以默认形式创建mydb数据库,步骤如下: (1)启动企业管理器,连接服务器,展开其树形目录,用鼠标右键单击【数据库】文件夹,在弹出的快捷菜单中,单击【新建数据库…】打开图5-2所的对话框。 (2)在【数据库属性】对话框的【名称】文本框内输入数据库名(逻辑名)。例如MyDB,这个对话框自动以该数据库名命名,系统默认用该数据库名与“_data”串的连接命名数据文件(见图5-3),该数据库名与“_log”串的连接命名日志文件(见图5-4)。这两个不同选项卡界面内的设置,分别为数据主文件和日志文件的名称、存储位置、初始大小、所属文件组(默认为主文件组 PRIMARY)、文件是否自动增长、增长的方式和文件大小的限制等。 (3)单击【确定】按钮,数据库就创建好了,在默认位置、采用默认设置创建了一个名为MyDB的数据库。
使用Transact-SQL命令创建数据库 CREATE DATABASE database_name [ ON[PRIMARY] [<filespec> [,…n] ] [,FILEGROUP filegroup_name <filespec> [,...n] ] ] [LOG ON{ <filespec> [,...n]} ] [FOR LOAD | FOR ATTACH ] 其中,<filespec>(文件格式)语法格式如下: ([NAME=logical_file_name,] FILENAME= ‘os_file_name’ [,SIZE = size] [,MAXSIZE={max_size| UNLIMITED}] [,FILEGROWTH=growth_increment])
【例5-1】省略CREATE DATABASE命令中各选项创建一个数据库exampledbl。命令和执行结果见图5-5。 图5-5 创建数据库exampledbl
【例5-2】使用ON和LOGON选项创建一个数据库exampledb2。 命令和执行结果见图5-6。【例5-2】使用ON和LOGON选项创建一个数据库exampledb2。 命令和执行结果见图5-6。 图5-6 创建数据库exampledb2
用向导创建数据库 使用向导创建数据库是一种非常简单的方法。启动企业管理器,在工具菜单中选择向导即可按向导进行相应的操作。 5.1.3 修改数据库 创建数据库后,可能会由于某种原因需要对其进行修改。例如增加和删除数据库的文件和文件组、修改文件和文件组的属性。但只有sysadmin和dbcreator服务器角色成员和DBO才能修改数据库。 • 使用企业管理器修改数据库 有两种方法来修改: ①使用企业管理器修改数据库 ②使用T-SQL命令修改数据库
使用企业管理器修改数据库 步骤如下: (1)启动企业管理器,连接服务器,展开其树形目录,展开【数据库】文件夹,用鼠标右键单击要修改的数据库名,例如exampledb1,在弹出的快捷菜单中,单击【属性】命令,则弹出如图5-7所示的对话框。 (2)在exampledb1属性对话框【数据文件】选项卡画面中,可以修改数据库的主文件组和用户定义文件组中各数据文件的信息,包括逻辑名、物理文件名、初始长度、所属文件组及自动增长的限制等。 (3)单击【事务日志】选项卡,在这个选项卡画面中,用户可以修改数据库的日志文件的信息,包括逻辑名、物理文件名、初始长度及自动增长的限制等。 (4)单击【文件组】、【选项】、【权限】等选项卡,可以修改数据库的文件组、数据库选项、数据库访问权限等内容。 1 1
使用Transact—SQL命令修改数据库 ALTER DATABASE database {ADDFILE<filespec>[,...n)[TOFILEGROUP filegroup_name] ADD LOG FILE<filespec>[,...n] [REMOVE FILE logical_file_name |ADD FILEGROUP filegroup_name |REMOVE FILEGROUP filegroup_name |MODIFY FILE <filespec> |MODIFY FILEGROUP filegroup_name filegroup_property } 其中<filespec>语法格式如下: (NAME=logical_file_name [,FILENAME=’os_file_name’] [,SIZE=size] [,MAXSIZE={max_ size UNLIMITED}] [,FILEGROWTH= growth_increment])
【例5-4】在exampledbl数据库中添加一个文件组 exampledbl_group,命令行为: ALTER DATABASE exampledbl ADD FILEGROUP exampledbl_group 【例5-5】将一个新的数据文件exampledbl_data2添加到 exampledbl数据库的exampledbl_group文件组中,命令行为 ALTER DATABASE exampledb1 ADD FILE ( NAME= exampledbl_data2, FILENAME=’c:\mssql2000\exampledbl_data2.mdf’) TO FILEGROUP exampledbl_group
【例5-6】修改数据文件exampledb2的初始长度为2MB(前面默认设置为IMB),命令行为:【例5-6】修改数据文件exampledb2的初始长度为2MB(前面默认设置为IMB),命令行为: ALTER DATABASE exampledbdb2 MODIFY FILE ( NAME=exampledb2, SIZE=2) 【例5-7】将一个新的日志文件exampledbl_log2添加到exampledbl数据库中,命令行为: ALTER DATABASE exampledbl ADD LOG FILE ( NAME= exampledbl_log2, FILENAME=’c:\mssql2000\ exampledbl_log2.1df’ )
修改数据库名 系统存储过程sp_renamedb(在master系统数据库中)能够修改数据库的名称。 在使用sp_renamedb修改数据库名之前,必须将数据库设置成单用户模式。设置数据库为单用户模式,用户可以在图5-7所示的数据库属性对话框中选择【选项】,在弹出的对话框中选择【限制访问】,再选中该数据库的【单用户】选项。用户也可以使用系统存储过程sp_dboption(在master系统数据库中)设置【单用户】选项。 下述命令行是将exampledbl数据库更名为exampledb的完整过程,用sp_helpdb来查看。见图5-8。
5.1.4 删除数据库 • 使用企业管理器删除数据库 使用企业管理器删除数据库非常简单,但每次只能删除一个数据库。方法是启动企业管理器后,展开【数据库】文件夹,单击要删除的数据库后如exampledb2,用鼠标右键单击要删除的数据库名,从弹出的快捷菜单中单击【删除】命令,系统弹出警告对话框见图5-9,要求用户确认是否删除该数据库,单击【是】按钮,就删除了该数据库。 • 使用Transact—SOL命令删除数据库 DROP DATABASE database_name [,…n] database_name指定要删除的数据库,且一次可以删除多个数据库。但不要随便删除系统数据库,可能会造成SQL Server系统崩溃。 【例5-8】删除数据库exampledb,exampledb2。 DROP DATABASE exampledb,exampledb2
5.2 表和视图的基本操作 5.2.1 基本知识 SQL Server的一个数据库中可以存储20亿个表,一个表最多允许定义1024个列。表的行数和总大小仅受可使用空间的限制。表的每一列必须具有相同的数据类型。 • 命名表 在一个数据库中,允许多个用户创建表。创建表的用户称为该表的所有者。因此,表的名称应该体现数据库、用户和表名三方面的信息。格式如下: database_name.owner.table_name • 数据类型 确定表的每列的数据类型,是设计表的重要步骤。列的数据类型就是定义该列所能存放的数据的值。 SQL Server 2000的数据类型很丰富,这里仅给出SQL Server 常用的数据类型。见表5-4。
设计表 在为一个数据库设计表之前,应该完成了需求分析,确定了概念模型,将概念模型转换为关系模型。关系模型中的每一个关系对应数据库中的一个表。 由第1章和第2章对图书管理系统的分析与设计知,若该系统的数据库为已创建的MyDb数据库,则需要为该数据库创建读者信息表(Readers)、图书信息表(Books)、借阅信息表(Borrowinf)、读者类型表(type)。 创建表的过程,就是将一种具体的关系DBMS(例如SQL Server 2000)作为工具,实现关系模型(逻辑模型)到物理模型的转换,即关系模型的物理实现。因此,以下称关系为表,称元组为行(或记录),称属性为列(或字段)。
设计表时需要确定如下内容: 1)表中需要的列以及每一列的类型(必要时还要有长度)。 2)列是否可以为空。 3)是否需要在列上使用约束、默认值和规则。 4)需要使用什么样的索引。 5)哪些列作为主键。 表的设计要体现完整性约束的实现。实体完整性约束的体现是主键约束,即主键的各列不能为空,且主键作为行的惟一标识;外键约束是参照完整性约束的体现;默认值和规则等是用户定义的完整性约束的体现。
下面对SQL Server 2000 中实现用户定义完整性的方法予以介绍:。 • 检查 (CHECK) 检查约束使用逻辑表达式来限制列上可以接受的数据。比如,可以指定Books表中的定价必须大于零,这样当插入表中的图书记录的定价为0或负数时,插入操作不能成功执行,从而保证了表中数据的正确性。 可以在一列上使用多个检查约束,在表上建立的一个检查约束也可以在多个列上使用。 • 默认值(DEFAULT) 数据库中每一行中的每一列都应该有一个值,当然这个值也可以是空值。但有时向一个表中添加数据(添加一行记录)时,某列的值不能确定,或该列的值大量重复的取同一个值,这时可以将该列定义为允许接受空值或给该列定义一个默认值。
空值(NULL) 空值(NULL)意味着数据的值不确定。比如,Books表中某一行的“出版社”列为空值,并不表示该书没有出版社,而是表示目前还不知道它的出版社。 又如,表Books中的书名列设置为不允许取空值,则输入数据时,必须给该列指定非空值,否则输入失败。 使用以上这些约束实施的完整性被称为声明型数据完整性,它们是作为表和列定义的一部分在语法中实现的,可以在CREATE TABLE语句或ALTER TABLE语句中定义或修改。
5.2.2 创建表 • 使用企业管理器创建表 利用企业管理器提供的图形界面来创建表,步骤如下: (1)在树形目录中展开【服务器组】→【服务器】→【数据库】→【MyDb】。 (2)选择【表】,单击鼠标右键,在弹出的快捷菜单中选择【新建表...】命令,打开设计表对话框。 (3)如图5-10所示,设计表对话框的上半部分有一个表格,在这个表格中输入列的列名、数据类型、长度(有的数据类型不需要指定长度,如datetime类型的长度为固定值8)、是否可以为空,在允许空域中单击鼠标左键,可以切换是否允许为空值的状态,打勾说明允许为空值,空白说明不允许为空值,默认状态是允许为空值的。 (4) 图5-10所示的设计表对话框的下半部分是特定列的详细属性,包括是否是标识列、是否使用默认值等。
(5)用图5-10所示的方法逐个定义好表中的列。 (6)设置主键约束:选中要作为主键的列,单击工具条上的【设置主键】按钮,主键列的前上方将显示钥匙标记,如图5-11所示。 (7)鼠标右键单击表中的任意一行(即任意一个列的定义),在弹出的快捷菜单中选择【属性】命令,可以打开如图5-12所示的表属性对话框,在该对话框中选择表选项卡,可以指定表的属性,比如表名、所有者、表的标识列等。图5-12中将表的名称设置为Readers, 所有者设置为dbo。 (8)在属性对话框中选择【关系】选项卡,可以设置列上的外键约束。选择【索引/键】选项卡,可以设置列上的索引,以及主键约束和惟一性约束。选择【check约束】选项卡,可以设置列上的检查约束。 (9)定义好所有列后,单击图5-11工具栏上的 按钮,表就创建完成了。
创建惟一性约束的步骤如下: (1)在如图5-12所示的属性对话框的【索引/键】选项卡中,单击【新建】按钮。 (2)在列名列表中选择要定义惟一性约束。 (3)选中【创建UNIQUE】复选框,表示创建惟一性约束。 (4)在索引名框中输入约束名,或接受默认的名字。 • 创建外键约束的步骤如下: (1)在图5-12所示的属性对话框的【关系】选项卡中,单击【新建】按钮。 (2)在【外键表】下拉列表框中选择要定义外健约束的表,并在其下的列表中选择表中要定义外键约束的列。 (3)在【主键表】下拉列表框中选择外键引用的表,并在其下的列表中选择表中外键引用的列。 (4)在【关系名】框中输入约束的名称,或接受默认的名称。 (5)选择【级联更新相关的字段】复选框指定使用级联修改。 (6)选择【级联删除相关的记录】复选框指定使用级联删除。
创建检查约束的步骤如下: (1)在如图5-12所示的属性对话框的【check约束】选项卡中,单击【新建】按钮。 (2)在【约束表达式】框中输入检查表达式。 (3)在【约束名】框中输入约束的名称,或接受默认的名称。
使用Transact-SQL命令创建表 在Transact-SQL中,使用CREATE TABLE命令创建表。语法格式如下: CREATE TABLE [database_name.[owner]. |owner.] Table_name ( { <column_definition> --列定义 |column_name AS computed_column_expression --计算列定义 |<table_contraint> } [,…n] ) [ON {filegroup|DEFAULT}] [TEXTIMAGE_ON {filegroup|DEFAULT}]
【例5-9】创建图书信息表Books。 CREATE TABLE books ( 编号 char(15) PRIMARY KEY NOT NULL CONTRAINT PK_Books PRIMARY KEY, 书名 varchar(42) NULL , 作者 varchar(8) NULL , 出版社 varchar(28)NULL , 定价 real NULL CONTRAINT CK_Books CHECK(定价>0) )
【例5-10】创建图书借阅信息表Borrowinf。 CREATE TABLE borrowinf ( 读者编号 char(8) NOT NULL REFERENCE Readers(编号) ON DELETE CASCADE , 图书编号char (15) NOT NULL FOREIGN KEY (图书编号) REFERENCES Books(编号) ON DELETE NO ACTION, 借期 datetime NULL DEFAULT (getdate()) , 还期 datetime NULL ) ON DELETE子句有两个选项。 • NO ACTION:被其他表外键引用的行不能被删除,这是SQL Server 7.0以前版本的做法。 • CASCADE:被其他表外键引用的行可以被删除,而且其他表中通过外键引用了该行的行都将被删除。
【例5-11】创建读者信息表readers。 CREATE TABLE readers ( 编号char (10) NOT NULL PRIMARY KEY, 姓名char (8) NULL , 读者类型 int NULL , 限借阅数量 int NULL, 借阅期限 int NULL )
5.2.3 修改表 可以使用ALTER TABLE 语句或企业管理器进行表的修改。 • ALTER TABLE命令格式 ALTER TABLE table_name { [ ALTER COLUMN column_name {new_data_type[(precision[,scale])][NULL|NOT NULL] |{ADD|DROP}ROWGUIDCOL}] | ADD { [<column_definition>] |column_name AS computed_column_expression}[,...n] | [ WITH CHECK | WITH NOCHECK ] | ADD { <table_constraint>}[,...n] | DROP{ [CONSTRAINT]constraint_name | COLUMN column } [ ,...n ] | { CHECK | NOCHECK } CONSTRAINT {ALL|constraint_name[,...n]} }
修改列属性 表中的每一列都有列名、数据类型、数据长度以及是否允许为空值等属性,这些属性可以在表创建后修改。 修改列属性使用子句ALTER COLUMN。比如,以下的语句将rooks表的出版社列改为最大长度为30的varchar型数据,且不允许空值。 ALTER TABLE Books ALTER COLUMN 出版社 varchar(30) NOT NULL 默认状态下,列是被设置为允许空值的,将一个原来允许空 值的列改为不允许空值,必须满足以下两个条件: ·表中记录在该列上均不为空值。 ·该列上没有创建索引。
添加和删除列 向表中增加—列时,应使新增加的列有默认值或允许为空值,如果既没有提供默认值也不允许为空值,那么新增列的操作将出错。 向表中添加列需要使用ALTER TABLE的ADD子句。 例如,向表books中添加出版日期列,DataTime型,允许空值,可以使用如下语句: ALTER TABLE books ADD 出版日期 datetime NULL 又如,向readers表中添加电子邮件地址列,且要求输入的电子邮件地址必须包含:‘@’符号,可以使用以下语句: ALTER TABLE readers ADD 邮件地址 varchar(50) NULL CONSTRAINT CK_EA CHECK(邮件地址like,'%@%')
删除—列需要使用ALTER TABLE的子句。 比如,删除readers表的邮件地址列,可以使用以下语句: ALTER TABLE readers DROP COLUMN邮件地址 • 修改约束 如果创建表borrowinf时没有定义主键约束(该表的主键由读者编号、图书编号、借期3个属性列组成),则可以用以下语句定义主键: ALTER TABLE Readers ADD CONSTRAINT PK_BH 表中已有的数据在这几列上需要满足以下两个条件: ·不能有重复的数据。 ·不能有空值。 删除主键约束PK_BH,可以使用以下语句: ALTER TABLE Readers DROP CONSTRAINT PK_BH PRIMARY KEY(读者编号,图书编号,借期)
修改约束时几个子句的说明: (1) WITH NOCHECK子句 添加的约束只对在以后改变或插入的行发生作用,而不检查已存在的行。 比如,要对books表的定价列添加约束,使定价大于O,可以使用如下代码: ALTER TABLE Books WITH NOCHECK ADD CONSTRAINT CK_Books (定价>0) (2) NOCHECK CONSTRAINT子句和CHECK CONSTRAINT子句 可以在ALTER TABLE语句中使用NOCHECK CONSTRAINT子句,使表的指定列上的检查约束无效,此时就可以添加一些不满足原来约束要求的数据了。使用CHECK CONSTRAINT子句可以使检查约束重新有效。这两个子句后面都要用约束名作为参数。
例,为readers表添加了邮件地址列,并定义了检查约束使邮件地址必须包含“@”符号。邮件地址列的定义如下:例,为readers表添加了邮件地址列,并定义了检查约束使邮件地址必须包含“@”符号。邮件地址列的定义如下: ALTER TABLE readers ADD邮件地址varchar (50) NULL CONSTRAINT CK_EA CHECK (邮件地址like '%@%') 使用以下语句使这一约束无效: ALTER TABLE Readers NOCHECK CONSTRAINT CK_EA 为了使约束重新有效,可使用如下语句: ALTER TABLE Readers CHECK CONSTRAINT CK_EA
5.2.4 向表中添加数据 创建表只是建立了表结构,之后,应该向表中添加数据。只有System Administrator角色成员、数据库和数据库对象所有者及其授权用户才能向表中添加数据。在添加数据时,对于不同的列数据类型,插入数据的格式不一样,因此,应严格遵守它们各自的要求。添加数据按输入顺序保存,条数不限,只受存储空间的限制。 • 使用企业管理器添加数据 启动企业管理器后,展开【数据库】文件夹,再展开要添加数据的数据库(如MyDb),可以看到所有的数据库对象,单击【表】,用鼠标右击右边列表中要操作的表(例如readers),运行弹出快捷菜单中的【打开表】命令,在弹出的子菜单中单击【返回所有行】命令,打开该表的数据窗口。如图5-13所示。在数据窗口中,用户可以添加多行新数据,同时还可以修改表中数据。使用该窗口的快捷菜单,可以实现表中数据各行记录间跳转、剪贴、复制和粘贴等。
使用Transact-SQL命令添加数据 在Transact-SQL中,使用INSERT命令添加数据,它主要有以下几种形式: ·INSERT …VALUES:使用VALUES子句为所添加的数据行提供列值。 ·INSERT…SELECT:将SELECT语句的查询结果添加到到表中。 ·INSERT…DEFAULT VALUES:将每列的默认值赋予新添加的数据行。 INSERT命令的主要语句格式如下: INSERT [INTO]{ table_name| view_name} {[ ( column_list ) ]{ VALUES( { DEFAULT | NULL | expression } [ ,...n] )| select_statement | DEFAULT VALUES }