- 零基础学SQL Server 2008
- 王浩等编著
- 257字
- 2021-03-31 03:36:00
第2章 SQL Server数据库基础综述
SQL Server数据库具有关系型数据库的所有特征,与许多主流数据库产品相同,目的都是方便、有效地存取数据,对数据进行有效的维护管理等。数据库之所以流行,并在企业运营、信息管理等扮演着越来越重要的角色,是因为其已经形成了完善的理论,并为数据管理提供了系统的科学支持。因此,理解数据库的基础知识,有助于更好地操作和使用数据库。本章重点介绍数据库的基本概念,并结合SQL Server数据库对这些概念进行讲解,方便读者理解和应用。
本章重点:
❑ 了解数据库的概念和功能。
❑ 掌握数据库中的各个对象。
❑ 熟悉数据库中的数据类型和语言。
2.1 数据库基本概念
数据库管理技术经过长期的发展,已经形成了系统的科学理论,本节就数据库知识的基本概念做一简单介绍,使读者了解数据库的基本内容和数据库的理论框架。
1. 数据与信息
数据(Data)是描述事物的符号记录,它具有多种表现形式,可以是文字、图形、图像、声音、语言等。SQL Server 2008数据库就是存储管理这样的记录的计算机系统。增强的功能使得SQL Server 2008数据库能够更加方便地管理声音、图像等数据,并可以对文字进行全文搜索。
信息具有可感知、可存储、可加工、可传递和可再生等自然属性,信息已是社会各行各业不可缺少的资源,这是信息的社会属性。数据是经过组织的符号记录的集合,而信息是具有特定意义的数据。
2. 数据库
数据库(Database,DB)是指长期储存在计算机内的、有组织的、可共享的数据集合。数据中的数据按一定的数学模型组织、描述和储存,具有较小的冗余度,较高的数据独立性和易扩展性,并可为各种用户共享。
3. 数据库系统
数据库系统(Database System,DBS)广义上讲是由数据库、硬件、软件和人员组成,其中管理的对象是数据。例如,一个生产型企业的数据库系统,广义上可能包括“生产数据集合”、“SQL Server 2008数据库软件系统”、“数据库服务器等硬件”和“数据管理和设计人员”。
4. 数据库管理系统
数据库管理系统(Database Management System,DBMS)是位于用户与操作系统之间的一层数据管理软件,是数据库系统的核心,在操作系统的支持下,解决如何科学地组织和储存数据,如何高效地获取和维护数据库的系统软件。其主要功能包括数据定义功能、数据操纵功能、数据库的运行管理和数据库的建立与维护。数据库管理系统可以分为层次型、网状型、关系型、面向对象型DBMS。
SQL Server 2008就是这样的数据库管理系统,SQL Server支持关系型数据库模型,并对传统的数据库管理系统有了许多新的扩展。
2.2 数据库管理系统的基本功能
数据库管理系统主要是实现对共享数据的有效组织、管理和存取,因此应具有系统的管理和维护的功能,其中最基本的功能有以下五种。
1. 定义数据
数据定义,数据库管理系统提供定义数据类型和数据存储形式的功能。每个记录的每个字段中的信息为一个数据。因记录的信息不同,其数据类型也应不同。通过定义数据类型,可以在一定程度上保证数据的完整性。
数据库管理系统提供数据定义语言(Data Definition Language,DDL),用户可以对数据库的结构描述定义,包括数据库的完整性、安全保密定义,如口令、级别、存取权限等。这些定义存储在数据字典中,是数据库管理系统的基本依据,如后面讲述的CREATE、DROP等语句均属于该类型。数据定义语言涉及T-SQL语言中的CREATE TABLE、CREATE VIEW、CREATE INDEX等语句。
2. 处理数据
数据操作,数据库管理系统提供多种处理数据的方式,一般采用数据操纵语言(Data Manipulation Language,DML),实现对数据库中数据的基本操作,如检索、插入、修改和删除。数据操纵语言涉及的T-SQL语言中的INSERT、UPDATE、DELETE等语句。例如,经常使用“SELECT”语句在一张表中查找信息,在几个相关的表或文件中进行复合的查找;使用“UPDATE”语句使用相应的命令更新一个字段或多个记录的内容;用一个命令对数据进行统计,甚至可以使用数据库管理系统工具进行编程,以实现更加复杂的功能。
DML分为两类:宿主型和自含型。所谓宿主型,是指将DML语句嵌入某种主语言(如C、COBOL等)中使用;自含型是指可以单使用DML语句,供用户交互使用。
在SQL Server 2008数据库中,微软公司对这两种方式进行支持和扩展,即可以通过SQL Server Management Studio工具,编写T-SQL的DML语句操作数据,也可以使用第三方语言操作数据进行程序开发。
3. 数据库运行管理
数据控制,数据库管理系统对数据提供一定的保护措施,即在运行期间,多用户环境下的并发控制、安全性检查和存取控制、完整性检查和执行、运行日志的组织管理、事务管理和自动恢复等是数据库管理系统的重要组成部分。
数据控制语言(Data Control Language,DCL)是用来设置或者更改数据库用户或角色权限的语句。SQL Server 2008数据库中,这些语句包括GRANT、DENY、REVOKE等语句,在默认状态下,只有sysadmin、dbcreator、db_owner或db_securityadmin等角色的成员才有权利执行数据控制语言。在SQL Server 2008中,流程控制语句主要用来控制SQL语句、语句块或者存储过程的执行流程。
在保证在多个用户共享数据时,只有被授权的用户才能查看或修改数据,以保证数据的安全性,即根据用户的职责,不同级别的人对数据库具有不同的权限,数据库管理系统应该确保数据的安全性。
4. 数据组织、存储和管理
数据库管理系统分类组织、存储和管理各种数据,包括数据字典、用户数据、存取路径等;要确定以何种文件结构和存取方式在存储级上组织这些数据,以提高存取效率。实现数据间的联系、数据组织和存储的基本目标,是提高存储空间利用率。
数据查询语言(Data Query Language,DQL)基本结构是由SELECT子句、FROM子句、WHERE子句组成的查询块,即“SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>”的格式, SQL Server 2008数据库对标准的数据查询语言进行了功能上的扩展,使该语言更加方便易用,数据查询语言将在第8章进行详细讲述。
5. 数据库的建立和维护
数据库的建立和维护,包括数据库的初始建立、数据的转换、数据库的转储和恢复、数据库的重组和重构、性能监测和分析等。
2.3 数据库的类型
数据库技术发展阶段的划分应该以数据模型的发展演变作为主要依据和标志。总体来说,数据库技术从开始到现在一共经历了三个发展阶段:第一代是网状、层次数据库系统;第二代是关系数据库系统;第三代是以面向对象数据模型为主要特征的数据库系统。SQL Server 2008数据库是以关系数据模型为基础的数据库,同时增加了许多下一代数据库系统的新特性。
1. 层次型数据库
层次型数据库管理系统是紧随网状数据库而出现的。现实世界中很多事物是按层次组织起来的。层次数据模型的提出,首先是为了模拟这种按层次组织起来的事物。层次数据库也是按记录来存取数据的。
层次数据模型中最基本的数据关系是基本层次关系,它代表两个记录型之间一对多的关系,即双亲子女关系。数据库中有且仅有一个记录型无双亲,称为根节点。其他记录型有且仅有一个双亲。在层次模型中从一个节点到其双亲的映射是唯一的,所以对每一个记录型(除根节点外),只需要指出它的双亲,就可以表示出层次模型的整体结构。
2. 网状型数据库
网状数据库。第一代包括网状和层次数据库系统,是因为它们的数据模型虽然分别为层次和网状模型,但实质上层次模型只是网状模型的特例而已。这二者都是格式化数据模型,都是在20世纪60年代后期研究和开发的,不论体系结构、数据库语言,还是数据的存储管理,都具有共同特征,所以它们应该划分为第一代。
3. 关系型数据库
第二代数据库系统支持关系数据模型。关系模型不仅具有简单、清晰的优点,而且有关系代数作为语言模型,有关系数据理论作为理论基础。因此关系数据库具有形式基础好、数据独立性强、数据库语言非过程化等特点。现在的主流数据库如SQL Server、Oracle、MySQL都满足关系数据模型。
2.4 SQL Server的数据库对象
一个数据库往往由多种数据对象构成,SQL Server数据库的数据元素包括数据表、视图、索引等,本节就这些数据对象进行介绍,并结合案例数据库进行说明。这些数据对象的维护、管理的具体使用,将在后面的章节详细介绍。
1. 数据表
数据表,这里简称“表”(Table),是包含数据库中所有数据的数据库对象。表定义为一个列集合。数据在表中的组织方式与在电子表格中相似,都是按行和列的格式组织的。每一行代表一条唯一的记录,每一列代表记录中的一个字段。
在SQL Server 2008数据库中,表是数据最原始的存储位置。用户可以在SQL Server Management Studio工具的“对象资源管理器”窗口中查看到“表”目录。该目录下显示数据库中的所有数据表。例如,在AdventureWorks示例数据库中,包含公司雇员数据的表中,每一行记录代表一名雇员,各列分别代表该雇员的信息,如雇员编号、姓名、地址、职位以及家庭电话号码等。用户可以通过以下步骤查看SQL Server 2008数据库中的数据表。
(1)单击“开始|所有程序|Microsoft SQL Server 2008|SQL Server Management Studio”命令,启动SQL Server Management Studio工具。
(2)在“对象资源管理器”窗口中,连接到SQL Server 2008数据库引擎实例,再展开该实例。
(3)图2.1显示了在AdventureWorks示例数据库中的“表”目录。一个数据库可由多个数据表构成。
图2.1 查看SQL Server数据库的数据表
(4)右击“HumanResources.Department”表,在弹出的快捷菜单中选择“编辑前200行”命令,图2.2显示了AdventureWorks示例数据库中,打开HumanResources.Department表的结果。
图2.2 查看AdventureWorks数据库的Department数据表
说明 SQL Server 2008通过“编辑前200行”或“选择前1000行”来打开表,没有单独的打开表命令。
2. 视图
视图(View)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图在数据库中并不是直接存储为物理数据,而是“引用”了数据表中的数据。除非是SQL Server 2008数据库中物化的索引视图(在后面的章节会讲述该视图)。
视图的行和列数据来自定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。
在SQL Server中分布式查询也可用于定义使用多个异类源数据的视图。例如,如果有多台不同的服务器分别存储在不同地区的数据,而用户需要将这些服务器上结构相似的数据组合起来,这种方式就很有用。通过视图进行查询没有任何限制,通过它们也可以进行数据修改。
对于SQL Server 2008数据库,参考2.4.1节启动SQL Server Management Studio工具,在“对象资源管理器”窗口中,可以浏览到“视图”目录,如图2.3所示。可以看到,其中包括了系统视图和用户定义视图。
图2.3 查看SQL Server数据库的视图
3. 索引
数据库中的索引(Index),帮助用户快速查找表或索引视图中的指定信息。索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针。通过创建设计良好的索引以支持查询,可以显著提高数据库查询和应用程序的性能。索引可以减少为返回查询结果集而必须读取的数据量。索引还可以强制表中的行具有唯一性,从而确保表数据的数据完整性。
索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一种数据结构(B树)中,使SQL Server可以快速有效地查找与键值关联的行。
SQL Server 2008数据库提供了丰富的索引类型,主要包括聚集索引、非聚集索引、唯一索引、包含性索引等,还提供了索引视图、全文、XML等高级索引,这些索引的具体使用,请参考第14章。
4. 主键
数据表中一般都包括这样的一列或者一组列,它用于唯一标识表中每一行,这样的一列或多列称为表的主键(Primary Key),它用于强制数据表的实体完整性。在创建或修改表时,用户可以通过定义主键约束来创建主键。一个表只能有一个主键约束,并且主键约束中的列不能接收空值。由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束。
5. 外键
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键(Foreign Key)。由此可见,外键表示了两个关系之间的联系。以另一个关系的外键做主关键字的表被称为主表,具有此外键的表被称为主表的从表,外键又称为外关键字。
6. 存储过程
存储过程(Stored Procedure)是由流控制语句和SQL语句编写的一组代码,存储过程经编译和优化后,存储在数据库服务器中,使用时只要调用即可运行。
在SQL Server 2008数据库中,存储过程可以使用T-SQL语言,或者是符合.NET规范的各种语言编写。SQL Server 2008中的存储过程和其他编程语言中的过程类似,主要有以下共性:
(1)接收输入参数、输出参数,向调用过程或批处理返回多个值。
(2)包含用于在数据库中执行操作的编程语句,如T-SQL语句或者其他语言。
(3)向调用过程或批处理返回状态值,指明过程执行的成功或失败。
用户可以使用T-SQL语言的EXECUTE语句来运行存储过程。存储过程与函数不同,因为存储过程不返回取代其名称的值,也不能直接在表达式中使用。
在SQL Server 2008数据库中,可以通过SQL Server Management Studio工具的“对象资源管理器”窗口查看存储过程。在“对象资源管理器”窗口的“数据库|可编程性|存储过程”目录下查看到该数据库的所有存储过程。该目录显示的存储过程包括“系统存储过程”和“用户存储过程”。“系统存储过程”是数据库在创建时建立的、数据库系统使用的存储过程。
例如,AdventureWorks示例数据库的uspUpdateEmployeePersonalInfo存储过程,用来使用所指定EmployeeID的输入参数中指定的值来更新员工数据表。在这里该示例给读者一个感性的认识,存储过程将在第9章进行详细的说明。
【实例】uspUpdateEmployeePersonalInfo存储过程的代码如下:
01 set ANSI_NULLS ON 02 set QUOTED_IDENTIFIER ON 03 GO 04 ALTER PROCEDURE [HumanResources].[uspUpdateEmployeePersonalInfo] 05 @EmployeeID [int], 06 @NationalIDNumber [nvarchar](15), 07 @BirthDate [datetime], 08 @MaritalStatus [nchar](1), 09 @Gender [nchar](1) 10 WITH EXECUTE AS CALLER 11 AS 12 BEGIN 13 SET NOCOUNT ON; 14 BEGIN TRY 15 UPDATE [HumanResources].[Employee] 16 SET [NationalIDNumber] = @NationalIDNumber 17 ,[BirthDate] = @BirthDate 18 ,[MaritalStatus] = @MaritalStatus 19 ,[Gender] = @Gender 20 WHERE [EmployeeID] = @EmployeeID; 21 END TRY 22 BEGIN CATCH 23 EXECUTE [dbo].[uspLogError]; 24 END CATCH; 25 END;
【代码说明】
❑ AdventureWorks示例数据库将在第4章进行详细地说明。
❑ 其中输入参数是EmployeeID [int]、@NationalIDNumber [nvarchar](15)、@BirthDate [datetime]、@MaritalStatus [nchar](1)、@Gender [nchar](1)。
用户可以通过EXEC HumanResources.uspUpdateEmployeePersonalInfo语句来运行该存储过程,具体执行代码可以参考以下语句。
01 USE AdventureWorks; 02 GO 03 EXEC HumanResources.uspUpdateEmployeePersonalInfo 04 @EmployeeID = 10, 05 @NationalIDNumber = N'123-45-6789', 06 @BirthDate = '19771030', 07 @MaritalStatus = N'S', 08 @Gender = N'M'; 09 GO
【代码说明】
❑ 第3行使用EXEC HumanResources.uspUpdateEmployeePersonalInfo语句运行存储过程。该过程根据EmployeeID 10更新Employee表中的NationalIDNumber、BirthDate、MaritalStatue和Gender列。
❑ 执行存储过程HumanResources.uspUpdateEmployeePersonalInfo时,要求指定所有参数值,如代码第4~8行所示。
7. 触发器
触发器(Trigger)是特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由某个事件来触发。例如,当对一个表进行操作(Insert、Delete、Update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如,可以根据客户当前的账户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
SQL Server 2008数据库提供了两大类触发器:DML触发器和DDL触发器。DDL触发器是SQL Server 2008的新增功能。当服务器或数据库中,发生数据定义语言事件时,将调用这些触发器。例如,当用户创建、删除数据表时,数据库引擎将发送触发消息。
8. 数据类型
在SQL Server 2008中,每个列、局部变量、表达式和参数都具有一个相关的数据类型(Data Type)。数据类型是一种属性,用于指定对象可保存的数据的类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。
SQL Server提供系统数据类型集,该类型集定义了可与SQL Server一起使用的所有数据类型。还可以在T-SQL或Microsoft.NET Framework中定义自己的数据类型。别名数据类型是基于系统提供的数据类型。用户定义类型从使用Microsoft.NET Framework支持的编程语言之一创建的类的方法和运算符中获取它们的特征。
9. 约束
约束(Constraint)可以应用到列或整个表。列约束被指定为列定义的一部分,并且只应用到某一列。表约束从列的定义独立地声明,并可以应用到表中的几个列。约束类型如表2.1所示。
表2.1 约束类型
通过限制列可接受的值,CHECK约束可以强制域的完整性。此类约束类似于FOREIGN KEY约束,因为可以控制放入列中的值。它们在确定有效值的方式上有所不同:FOREIGN KEY约束从其他表获得有效值列表,而CHECK约束通过不基于其他列中的数据的逻辑表达式确定有效值。例如,可以通过创建CHECK约束将salary列中值的范围限制为从$15 000到$100 000之间的数据。这将防止输入的薪金值超出正常的薪金范围。可以通过任何基于逻辑运算符返回TRUE或FALSE的逻辑表达式创建CHECK约束。对于上面的示例,逻辑表达式为:salary >=15000 AND salary<=100000。
10. 默认值
如果用户在插入行时没有为列指定值,默认值(Default)则指定列中使用什么值。默认值可以是计算结果为常量的任何值,如常量、内置函数或数学表达式。
11. 角色
角色(Role)是一个强大的工具,使用户集中到一个集合中,然后对该集合应用权限。对一个角色授予、拒绝或废除的权限,也适用于该角色的任何成员。
可以建立一个角色来代表单位中一类工作人员所执行的工作,然后给这个角色授予适当的权限。当工作人员开始工作时,只须将他们添加为该角色成员。当他们离开工作时,将他们从该角色中删除。而不必在每个人接受或离开工作时,反复授予、拒绝和废除其权限。权限在用户成为角色成员时自动生效。
如果根据工作职能定义了一系列角色,并给每个角色指派了适合这项工作的权限,则很容易在数据库中管理这些权限。之后,不用管理各个用户的权限,而只须在角色之间移动用户即可。如果工作职能发生改变,则只须更改一次角色的权限,并使更改自动应用于角色的所有成员,操作比较容易。
12. 用户
用户(User)是访问数据库的身份,在SQL Server 2008数据库中,每个Windows账户或SQL Server登录名都必须与已授权用户对其进行访问的每个数据库中的用户名相关联,或者该数据库必须已启用guest访问。数据库用户名由db_owner或db_accessadmin固定数据库角色的成员来定义,并存储在每个数据库的sysusers表中。每个数据库用户名都与存储在sys.database_principals.uid中的一个数据库用户ID相关联。
13. 架构
架构(Schema)是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。在SQL Server 2008数据库中架构是一个新的、重要的概念。在后面的章节中将详细说明。
2.5 数据类型
数据类型决定了数据存储的空间和格式,理解数据类型有助于用户正确、有效地存储数据,并为数据库设计和管理奠定良好基础。此外,数据类型的选择也会影响数据存储、查询等的方式和效率。
1. 数据类型和特点
数据类型定义数据表的列中允许的数据值。在SQL Server 2008中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。数据类型是一种属性,用于指定对象可保存的数据的类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等,一般要求使用满足需要的最小的数据类型。为对象分配数据类型时可以为对象定义4个属性:
❑ 对象包含的数据种类。
❑ 所存储值的长度或大小。
❑ 数值的精度(仅适用于数字数据类型)。
❑ 数值的小数位数(仅适用于数字数据类型)。
2. 数字数据类型
SQL Server 2008提供了多种数字数据类型,各种数字数据类型的名称和精度如表2.2所示。
表2.2 数字数据类型
3. 字符数据类型
SQL Server 2008提供了多种字符数据类型,各种字符数据类型的名称和精度如表2.3所示。
表2.3 字符数据类型
4. 日期时间数据类型
SQL Server 2008提供了多种日期时间数据类型,各种日期时间数据类型的名称和精度如表2.4所示。
表2.4 日期时间数据类型
5. 二进制数据类型
SQL Server 2008提供了多种二进制数据类型,各种二进制数据类型的名称和精度如表2.5所示。
表2.5 二进制数据类型
6. 其他数据类型
SQL Server 2008提供了多种其他数据类型,这些数据类型的名称和精度如表2.6所示。
表2.6 其他数据类型
2.6 小结
本章简单介绍了一些SQL Server的概念和功能,其中2.4节描述了SQL Server中的常见对象,这里只是让读者有一个基本的概念,后面的多个章节会详细描述这些对象。2.5节是从语言角度来说明数据库中的一些命令。希望读者通过本章的学习对SQL Server有个初步的认识。
2.7 本章练习
1. 以下哪种不是SQL Server 2008的数字类型?( )
A. float
B. int
C. decimal
D. num
2. 以下哪种不是SQL Server 2008的字符类型?( )
A. varchar
B. char
C. string
D. nchar
3. 说出2种以上的SQL Server 2008中常用的日期类型。
4. 说出5种以上的SQL Server 2008中常见的数据库对象。