`

数据库基础知识

阅读更多
一  数据库
数据库:由存储特定结构化数据集的表集合组成。
表是包含行(记录或元组)和列(特性)的集合。
表中的每一列都设计为存储某种类型的信息(例如,日期、名称、美元金额或数字)。
表有几种控制(约束、规则、触发器、默认值和自定义用户数据类型)用于确保数据的有效性。
表有索引,利用索引可以快速地找到行。可将声明引用完整性 (DRI) 约束添加到表上,以确保不同表中相互关联的数据保持一致。
数据库还可以存储过程,这些过程使用 Transact-SQL 编程代码对数据库中的数据执行操作,如存储对表数据提供自定义访问的视图。
例如,创建名为 MyCoDB 的数据库来管理公司的数据。在 MyCoDb 数据库中,可以创建一个名为 Employees 的表来存储每个职员的信息,该表可以包含名为 EmpId、LastName、FirstName、Dept 和 Title 的列。必须给表添加一些约束,以确保没有两个职员使用同一 EmpId,同时确保 Dept 列仅包含贵公司中有效的部门编号。您可以定义索引,以确保能够根据职员 ID 或姓氏快速地找到职员的数据。对于每一个职员,都需要向 Employees 表添加一行数据,所以可以创建名为 AddEmployee 的存储过程,将该过程自定义为接受新职员的数据值,并执行向 Employees 表中添加行的操作。可能需要一份部门职员的概要,这种情况下定义一个名为 DeptEmps 的视图,合并 Departments 和 Employees 表中的数据并产生输出。
设计数据库时,应考虑以下事项:
• 数据库的用途及该用途将如何影响设计。应创建符合用途的数据库计划。
• 数据库规范化规则,防止数据库设计中出现错误。
• 对数据完整性的保护。
• 数据库和用户权限的安全要求。
• 应用程序的性能需求。设计数据库时必须利用 Microsoft® SQL Server™ 2000 中能够提高性能的功能。对于性能而言,在数据库大小和硬件配置之间权衡也是很重要的。
• 维护。
• 估计数据库大小。

二 表
设计表时应注意:
• 表所包含的数据的类型。
• 表的各列及每一列的数据类型(如果必要,还应注意列宽)。
• 哪些列允许空值。
• 是否要使用以及何时使用约束、默认设置或规则。
• 所需索引的类型,哪里需要索引,哪些列是主键,哪些是外键。
列的数据类型:二进制数据由十六进制数表示为binary、varbinary 和 image。
              字符数据由字母、符号和数字组成。char、varchar 和 text。
              Unicode 数据使用 SQL Server 中的 nchar、varchar 和 ntext 数据类型进行存储。
              日期和时间数据由有效的日期或时间组成。datetime 和 smalldatetime。
              数字数据包括正数、负数、小数、分数和整数。整型数据使用 bigint、int、smallint 和 tinyint。小数数据使用 decimal 或 numeric。近似数字数据以 float 和 real存储。
              货币数据表示正的或负的货币值。money 和 smallmoney。

强制列中数据完整性的机制:
PRIMARY KEY 约束:一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。
FOREIGN KEY 约束:通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。第二个表的这个列就成为第一个表的外键。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。
级联引用完整性约束:
ON DELETE NO ACTION
指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚 DELETE。
ON UPDATE NO ACTION
指定如果试图更新某行中的键值,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚 UPDATE。
ON DELETE CASCADE
指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则也将删除所有包含那些外键的行。如果在目标表上也定义了级联引用操作,则对从那些表中删除的行同样采取指定的级联操作。
ON UPDATE CASCADE
指定如果试图更新某行中的键值,而该行的键值由其它表的现有行中的外键所引用,则所有外键值也将更新成为该键指定的新值。如果在目标表上也定义了级联引用操作,则对在那些表中更新的键值同样采取指定的级联操作。
例如,假设有一个数据库包含三个表:TableA、TableB 和 TableC。针对 TableA 中的主键,用 ON DELETE CASCADE 定义 TableB 中的外键。针对 TableB 中的主键,用 ON DELETE CASCADE 定义 TableC 中的外键。如果 DELETE 语句删除 TableA 中的行,则该操作也将删除 TableB 中具有与 TableA 中所删除的主键匹配的任何外键中的所有行,然后删除 TableC 中具有与 TableB 中所删除的主键匹配的任何外键中的所有行。
UNIQUE 约束:使用 UNIQUE 约束确保在非主键列中不输入重复值。
CHECK 约束:CHECK 约束通过限制输入到列中的值来强制域的完整性。
DEFAULT 定义:若没有指定列值,则是隐性要求将默认值装载到该列中。
为空性:空值或 NULL 并不等于零 (0)、空白或零长度的字符串(如""),NULL 意味着没有输入。NULL 的存在通常表明值未知或未定义。
Sql代码

   1. CREATE TABLE Parts 
   2.   (PartID            int PRIMARY KEY, 
   3.    PartName          char(10), 
   4.    PartMaterial      char(10), 
   5.    PartColor         char(10), 
   6.    PartDescription   AS PartMaterial + PartColor 
   7.   ) 
三  索引
在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。书中的索引是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的行所在的存储位置。
设计索引要考虑的准则包括:
• 一个表如果建有大量索引会影响 INSERT、UPDATE 和 DELETE 语句的性能,因为在表中的数据更改时,所有索引都须进行适当的调整。另一方面,对于不需要修改数据的查询(SELECT 语句),大量索引有助于提高性能。
• 覆盖的查询可以提高性能。覆盖的查询是指查询中所有指定的列都包含在同一个索引中。例如,如果在一个表的 a、b 和 c 列上创建了组合索引,则从该表中检索 a 和 b 列的查询被视为覆盖的查询。创建覆盖一个查询的索引可以提高性能,因为该查询的所有数据都包含在索引自身当中;检索数据时只需引用表的索引页,不必引用数据页,因而减少了 I/O 总量。
• 对小型表进行索引可能不会产生优化效果,因为 SQL Server 在遍历索引以搜索数据时,花费的时间可能会比简单的表扫描还长。
• 可以在视图上指定索引。
• 可以在计算列上指定索引。

使用聚集索引: 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引)。
使用非聚集索引: 非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。如果在表中未创建聚集索引,则无法保证这些行具有任何特定的顺序。
使用唯一索引: 唯一索引可以确保索引列不包含重复的值。
Sql代码

   1. CREATE NONCLUSTERED INDEX DescIdx ON 
   2.          ObjTable(ObjName ASC, ObjWeight DESC) 

CREATE NONCLUSTERED INDEX DescIdx ON
         ObjTable(ObjName ASC, ObjWeight DESC)



四 视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。
创建索引视图:若经常在查询中引用这类视图,可通过在视图上创建唯一聚集索引来提高性能。在视图上创建唯一聚集索引时将执行该视图,并且结果集在数据库中的存储方式与带聚集索引的表的存储方式相同。
创建分区视图:分区视图在一个或多个服务器间水平连接一组成员表中的分区数据,使数据看起来就象来自一个表。
创建分布式分区视图,首先应当:为 Server2 添加一个名为 Server2 的、带有连接信息的链接服务器定义,并添加一个名为 Server3 的链接服务器定义以访问 Server3。然后在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。
Sql代码

   1. CREATE VIEW Customers AS 
   2.    SELECT * FROM 服务器1.数据库名.表的拥有者.表名(Customers_33) 
   3. UNION ALL 
   4.    SELECT * FROM Server2.CompanyDatabase.TableOwner.Customers_66 
   5. UNION ALL 
   6.    SELECT * FROM Server3.CompanyDatabase.TableOwner.Customers_99 

CREATE VIEW Customers AS
   SELECT * FROM 服务器1.数据库名.表的拥有者.表名(Customers_33)
UNION ALL
   SELECT * FROM Server2.CompanyDatabase.TableOwner.Customers_66
UNION ALL
   SELECT * FROM Server3.CompanyDatabase.TableOwner.Customers_99



五 存储过程
Transact-SQL 编程语言是应用程序和 SQL Server 数据库之间的主要编程接口。使用 Transact-SQL 程序时,可用两种方法存储和执行程序:可以在本地存储Transact-SQL程序,并创建向 SQL Server 发送命令并处理结果的应用程序;也可以将Transact-SQL程序在 SQL Server 中存储为存储过程,并创建执行存储过程并处理结果的应用程序。
可使用 Transact-SQL EXECUTE 语句运行存储过程。存储过程与函数不同,因为存储过程不返回取代其名称的值,也不能直接用在表达式中。
创建存储过程时,应指定:
1.指定参数:所有输入参数和向调用过程或批处理返回的输出参数。
2.设计存储过程:执行数据库操作(包括调用其它过程)的编程语句。
3.从存储过程中返回数据:返回结果集或返回至调用过程或批处理以表明成功或失败(以及失败原因)的状态值。
Sql代码

   1. CREATE PROC showind3 @table varchar(30) = NULL 
   2. AS IF @table IS NULL 
   3.    PRINT 'Give a table name' 
   4. ELSE 
   5.    SELECT TABLE_NAME = sysobjects.name, 
   6.    INDEX_NAME = sysindexes.name, INDEX_ID = indid 
   7.    FROM sysindexes INNER JOIN sysobjects 
   8.    ON sysobjects.id = sysindexes.id 
   9.    WHERE sysobjects.name = @table 

CREATE PROC showind3 @table varchar(30) = NULL
AS IF @table IS NULL
   PRINT 'Give a table name'
ELSE
   SELECT TABLE_NAME = sysobjects.name,
   INDEX_NAME = sysindexes.name, INDEX_ID = indid
   FROM sysindexes INNER JOIN sysobjects
   ON sysobjects.id = sysindexes.id
   WHERE sysobjects.name = @table


六 用触发器强制执行业务规则
SQL Server提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。
触发器可以支持约束的所有功能,在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。
   设计触发器:
• 执行 INSTEAD OF 触发器代替通常的触发动作。INSTEAD OF 触发器还可在带有一个或多个基表的视图上定义,而在这些视图上这些触发器可扩展视图可支持的更新类型。
• 在执行了 INSERT、UPDATE 或 DELETE 语句操作之后执行 AFTER 触发器。AFTER 触发器只能在表上指定。
创建触发器时需指定:
• 名称。
• 在其上定义触发器的表。
• 触发器将何时激发。
• 激活触发器的数据修改语句。有效选项为 INSERT、UPDATE 或 DELETE。多个数据修改语句可激活同一个触发器。例如,触发器可由 INSERT 或 UPDATE 语句激活。
• 执行触发操作的编程语句。
Sql代码

   1. CREATE TABLE my_table* 
   2. (a int NULL, b int NULL) 
   3. GO 
   4.  
   5. CREATE TRIGGER my_trig 
   6. ON my_table 
   7. FOR INSERT 
   8. AS 
   9. IF UPDATE(b) 
  10.    PRINT 'Column b Modified' 
  11. GO 

CREATE TABLE my_table*
(a int NULL, b int NULL)
GO

CREATE TRIGGER my_trig
ON my_table
FOR INSERT
AS
IF UPDATE(b)
   PRINT 'Column b Modified'
GO


七   用户定义函数
函数是由一个或多个 Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。SQL Server并不将用户限制在定义为 Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
Sql代码

   1. CREATE FUNCTION CubicVolume 
   2. -- Input dimensions in centimeters 
   3.    (@CubeLength decimal(4,1), @CubeWidth decimal(4,1), 
   4.     @CubeHeight decimal(4,1) ) 
   5. RETURNS decimal(12,3) -- Cubic Centimeters. 
   6. AS 
   7. BEGIN 
   8.    RETURN ( @CubeLength * @CubeWidth * @CubeHeight ) 
   9. END 

CREATE FUNCTION CubicVolume
-- Input dimensions in centimeters
   (@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
    @CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
AS
BEGIN
   RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END


然后可以在允许整型表达式的任何地方(如表的计算列中)使用该函数:
Sql代码

   1. CREATE TABLE Bricks 
   2.    ( 
   3.     BrickPartNmbr   int PRIMARY KEY, 
   4.     BrickColor      nchar(20), 
   5.     BrickHeight     decimal(4,1), 
   6.     BrickLength     decimal(4,1), 
   7.     BrickWidth      decimal(4,1), 
   8.     BrickVolume AS 
   9.               ( 
  10.                dbo.CubicVolume(BrickHeight,BrickLength, BrickWidth) 
  11.               ) 
  12.    ) 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics