一、数据库系统概述
1. 数据库的概念
数据库描述了现实世界中的某些方面,构成了现实世界中的一个微小世界。数据库是一个逻辑上紧密相连的数据集。该数据集中的数据具有某些固有的语义含义。数据库是为某个特定目标设计、建立和使用的,它拥有确定的用户组和这些用户组感兴趣的预定的应用。数据库是一个持久数据的集合,这些数据用于某种应用系统中,是由一个或几个数据表格组成的,数据表格是由数据组成的,是一个统一管理的相关数据的集合,数据库的特点是能被各种用户共享,具有最小的冗余度,数据间有紧密的联系但又有较高的对程序的独立性。
数据库中的表、视图、存储过程、索引等具体存储数据或对数据进行操作的实体,称为数据库的对象。数据库是这些对象的集合,该集合中容纳着各种各样的数据库对象。
(1) 表。
一个数据库由一个或多个表组成。表是一种按行和列排列的数据集合。例如,可能有名为authors的作者信息表。每列包含某种类型的信息,如作者的姓。每行包含有关特定作者的所有信息 (名、姓、地址,等等)。
在一个数据库中,你可能有若干表,每个表用于一个特定主题。例如,pubs数据库可能包含用于作者、书名等的表。每个主题使用单独的表可以消除重复数据,使数据存储更有效并减少数据输入错误。
表是数据库关系图的基本构件。在数据库关系图中,各个表以矩阵形式布局,以便可以看到为数据库表中的每一列定义的所有属性。
表是组织和存储数据的对象,它由行和列组成。行和列的顺序是任意的,没有限制,是根据设计人员设计的,其命名应该跟存储的内容相关,这样便于管理。譬如,表中的记录姓名的列命名为Name。表的名字也应该和存储的内容相关,如数据库中的存储员工信息的表命名为Employee。需要注意的是,在同一表里,列的名字必须唯一。同理,在同一个数据库中,表的名字也必须是唯一的。
为了对数据库内表对象有个更深刻的了解,可以将其逻辑化并且通过关系模型中的二维关系表格显示出来。
在数据库管理系统中,数据是存储在表对象中的,因此创建表是使用数据库存储数据的前提。
表对象的创建主要有两种方法: 一种是通过每种数据库管理系统的用户界面菜单进行创建,这种方法的具体操作决定于不同的数据库管理系统,它的优点是可以快速、直观地创建所需的表对象; 另一种方法是使用SQL语言提供的创建表语句,它虽然使用起来不直观而且需要掌握SQL的语法规则,但是作为一种标准在所有的数据库管理系统中都适用。
(2) 字段。
表中每一列中的数据就是一个字段,表中的列对应的数据就是一个字段。字段具有自己的属性,如字段大小、类型等。不同的数据库系统对字段属性的定义也有差别,如字段的类型在某些数据库管理系统中是固定值,但在另一些系统中则是可变的。
字段类型是字段最重要的属性,它决定了字段能够存储哪种数据。SQL规范支持的五种基本字段类型分别为字符型、文本型、数值型、逻辑型和日期时间型。
(3) 索引。
在数据库管理系统中,索引提供了一种无须扫描整张表就能实现对数据进行快速查询的途径,使用索引可以优化查询。这就像为了找到某本书中一个句子可以逐页搜索,或者通过使用该书的目录,快速定位到要搜索的主题然后找到需要的句子。显然后一种方法操作起来更快。
在数据库中,表的索引与附在某本书后面的索引非常相似,因此为数据表建立索引是加快查询速度的有效手段。用户可以根据应用环境的需要,在基本表上建立一个或者多个索引,以提供多种存取路径,加快查找速度。索引一般由数据库管理员或者表的拥有者 (创建该表的用户) 进行创建。系统在存储数据时会自动选择合适的索引作为存取路径,用户无法手动选择索引。索引也存储数据,只不过索引中的数据反映的不是实际信息,而是方便搜索用的路径信息。
索引有两种类型,分别是聚簇索引和非聚簇索引。聚簇索引和目录表非常相似,记录的索引顺序与物理顺序相同。在非聚簇索引中,记录的物理顺序与逻辑顺序没有必然的联系。
通常情况下使用的是聚簇索引,但是每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。通常要对一个表按照标识字段建立聚簇索引,但也可以对其他类型的字段建立聚簇索引,如字符型、数值型或日期时间型字段。从建立了聚簇索引的表中取出数据要比建立了非聚簇索引的表快。当需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好。
由于索引是冗余的数据结构,因而索引对于保证正确性来说不是必需的。但是,索引对事务的高效处理十分重要,既包括更新事务又包括查询。
①创建非聚簇索引。
通过CREATEINDEX语句创建非聚簇索引,下面SQL语句创建了一个名为USERID的非聚簇索引。
CRE.ATE UNIQUE INDEX USERlD ON User Infomation (UID ASC,Age DESC)
其中,UNIQUE是表示此索引的每一个索引值只对应唯一的数据记录,USERID为用户定义的索引名,UserInfomation为索引基于的表名,表中的UID字段按升序且Age字段按降序建立唯一索引。
②创建聚簇索引。
通过CREATECLUSTERINDEX语句创建聚簇索引,如下SQL语句是用来创建一个名为USERNAME的聚簇索引。
CRE.ATE UNIQUE INDEX USERNAME ON UserInfomation (Name)
其中,与创建非聚簇索引不同的是关键字CLUSTER,它表示要建立的索引是聚簇索引,使用这条语句将会在User Infomation表的Name列上建立一个聚簇索引,User Infomation表中记录将按照Name值的升序存放。
③删除索引。
索引一经建立,就由系统使用和维护它,不需要用户进行维护。如果建立索引的列中的数据经常增加和删除,系统会花费很多的时间进行维护索引。这时候就应该把这样的索引删除,来提高系统的性能。删除索引的同时,系统也会删除数据字典中有关该索引的描述。下面是使用SQL语句删除索引的示例。
DROP INDEX USERNAME
其中,DROP INDEX是用来删除索引的SQL语句,USERNAME为要删除的索引名。使用这条语句将会把User Infomation表中的USERNAME索引删除。
(4) 视图。
视图是关系数据库内,提供给用户以多种角度观察数据库中数据的重要机制。视图是从一个或者多个基本表中导出的表,它存储的不是真正的数据,只是一个与基本表不同的虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,视图中查询出来的数据也随之变化。合理地使用视图具有如下优点。
①能够简化用户的操作。
②使用户能够以多种角度看待同一数据。
③对重构数据库提供了一定的逻辑对立性。
④对机密数据提供安全保护,对不同的用户使用不同的视图。
视图一经定义,就可以进行类似于对基本表的操作,如对视图的查询、删除等,在视图中还可以建立子视图。但是对视图的数据更新操作,不同的数据库管理系统会有不同的处理方式。
(5) 数据字典。
数据字典存储有关数据的来源、说明与其他数据的关系、用途和格式等信息,它本身就是一个数据库,存储“关于数据项的数据”。数据字典是个指南,它为数据库提供了路线图,而不是原始数据。换句话说,数据字典通常是指数据库中数据定义的一种记录,类似一个数据库的数据结构,但其内容要比数据库的数据结构描述丰富得多。数据字典在不同的数据库管理系统中也有一些差异。
在数据库系统中,数据字典通常是由基本表和用户可存取的视图构成的。基本表数据字典的基础是一组基本表组成,存储相关的数据库的信息。这些信息仅由数据库系统读和写,它们很少被数据库用户直接存取。为了让读者更清楚地认识数据字典,下面给出Oracle数据库中数据字典为数据库本身所提供的信息。
①Oracle用户的名字。
②每个用户所授的特权和角色。
③模式对象的名字: 表、视图、索引、聚集、同义词、序列、过程、函数以及触发器等。
④关于完整性约束的信息。
⑤列的默认值。
⑥有关数据库中对象的空间分布信息及当前使用情况。
2. 数据管理技术的发展阶段
近50年来,数据库从概念到内容再到形式都已经发生了深刻的变革。可以大致将数据库的发展划分为如下几个历史阶段。
(1) 20世纪60年代以前的文件处理阶段。
在20世纪60年代以前,数据库创建原理类似于传统的纸质介质的数表。在进行商品交易时,人们可以通过手工在纸质介质中画一个表格来记录商品交易的内容,如记录商品交易中的商品编号、商品名称、交易价格、交易数量、交易日期、交易金额以及经手人等,但一个纸质的表格存在诸多问题,它的记录不规范,一经形成便不能随意编辑修改,不能自动统计,不能进行有效的数据传递和方便的携带等,而且容易损坏。因此,能否在计算机上设计一个系统,该系统能够创建一个类似的纸质表格,并能够通过这样的表格记录数据,就成为当时人们对于计算机应用开发的一个基本问题。随着数据库技术的出现,这个问题就迎刃而解了。人们可以通过计算机创建一个数据表,包括表头与表体两个部分,表头用于描述数据表记录栏目的名称,表体用于记录的具体内容,如表3-1所示。
表3-1 商品交易记录表
其中,表头中的每一个列标题称为字段名 (field name),每一个列称为一个字段(field),如商品名称是一个字段名,交易单价是一个字段名等; 在表体中,每一行称为一个记录行 (record),每一行已经载有的记录称为一条记录,其中已经产生记录的行数称为记录数 (record number)。
在当时,这样的一个表是作为一个文件在计算机上进行访问、记录和存取的,这样的文件称为数据库文件 (databasefile)。目前一些数据库类型文件的扩展名为dbf就是这样得来的。当然有的数据库类型的扩展名为db,意味着它是数据库文件,因此,这一阶段叫做文件处理阶段。客观上,在这一阶段,人们还没有形成真正意义上的数据库概念,它仅相当于目前在一个Word文档中创建一个数据表。
(2) 20世纪70年代的数据库管理系统阶段。
人们发现,对于一些事务的处理往往用一个数据文件还不能完全解决问题,需要多个数据表形成一个数据表的集合才能解决。在这个数据表的集合中,表与表之间的数据或信息往往会存在一定的关系,因此作为独立的文件数据表系统不能满足数据处理的一般要求。文件形式的数据表一次只能处理一个数据表,甚至一次操作只能处理表中的一条记录,缺少成批数据处理功能和数据表的关联功能。因此,一个广泛意义的数据库概念产生了,也就是说,数据库是数据表的集合,是进行数据存取、数据访问、数据搜索、数据关联的数据处理的工具。数据处理应该是一个系统的范畴,由此数据库系统,尤其是数据库管理系统 (DBMS)的概念就被提出来了。在20世纪60年代末,世界上第一个商品化的数据库系统在美国应运而生。对于数据库及其数据库的结构形式的研究也广泛兴起,其中包括层次结构和网状结构数据库的研究、关系数据库的研究、数据建模工具的研究、数据查询语言的研究、查询优化、索引技术的研究、事务管理的研究、并发控制和恢复的研究等,各种各样的数据库管理系统得到了开发与应用。目前,最典型的具有代表性的数据库管理系统就是大型后台数据库管理系统Oracle,它已经在全世界得到广泛的认可和应用。Microsoft Office各个版本中集成的Access应用程序,也是一个广泛应用的数据库管理系统,这是人人皆知的。此外,许多的应用系统开发平台均带有自身的数据库管理系统,如Visual Basic6.0的开发平台中,它自身带有一个可视化的数据库管理系统,用于创建数据库及其数据库中的数据表; 在Bor-land Delphi应用系统开发平台中,它带有一个数据库桌面应用程序Database Desktop,可以快速创建数据表并采用适当的方法建立一个数据库。对于数据库中的每一个数据表,可以通过该数据库管理系统对数据表进行编辑、浏览、查询等操作,从而实现对数据的管理。
(3) 20世纪80年代中期——先进数据库系统阶段。
我们已经知道,20世纪60年代的文件系统数据表是一个孤立的计算机文件,存在许多缺陷,因此,数据库管理系统 (DBMS) 得到了发展。作为数据库管理系统,它是一种集数据库创建、数据表创建、数据收集、整理与加工于一体的工具,在此基础上,人们可以对已经存储的数据进行编辑、添加、删除、排序等操作。但它是模式化的,也就是说,这样的数据库管理系统往往在处理数据时,其数据处理的格式是相对简单的、固定的、机械的,但操作和应用会比较烦琐。而在信息爆炸的今天,各个企业、事业或各类应用系统使用的单位信息往往是复杂的,不同单位的信息结构和类型往往存在很大的不同,因此对于数据的处理用一些数据库管理系统来进行是远远不能满足要求的。因此,一种与应用程序相结合的方案便应运而生,这就是各种应用系统开发平台,在这些平台下,数据库管理系统仅仅是作为应用系统开发的基本工具,仅用于数据库或数据表的创建 (注意: 在20世纪90年代后期,数据库和数据表是两个不同的概念,数据库是数据表的集合,数据库中存在至少一个以上的数据表,而数据表则成为数据库的元素,每一个数据表用于存储各种类型的信息)。而对于数据表的信息或数据的添加、删除、成批数据处理、数据报表的产生等,则通过应用程序的开发来完成,形成各种数据处理的窗口。在这些窗口中,采用所谓的对象来对这些操作即事务进行处理,这就是面向对象编程技术的产生。由于采用面向对象编程产生的数据库信息系统是针对具体企业的具体管理事务进行开发的,因此这样的数据库应用系统比基本的数据库管理系统在功能、灵活性、针对性和各种功能方面强大得多。
此外,数据库在支持数据信息类型方面也强大得多,它不仅可以存储、加工常规意义下的数据,即数字、数值或文本信息,还支持如图形、图像、声音、视频、消息与各种压缩格式的数据,因此,数据库在应用上越来越广泛。
由于信息的复杂度越来越高,分散度越来越大,各种信息的关联与耦合成为必要,因此,在这一阶段,虽然人们使用过层次型数据库和网状型数据库,但关系数据库成为数据库应用中的主流数据库,几乎在一切的数据库应用系统的开发中,均采用关系数据库进行数据库的设计,从而可以通过开发的应用系统对各种复杂的相互关联的信息进行数据处理。
(4) 20世纪90年代至今——基于Web的数据库系统。
由于信息业务的复杂性,信息不仅从数量上剧增,而分散化的程度也正在加剧,信息收集、服务,加工和利用总是存在信息处理与信息发布分离的现象,人们已经不能完全采用在固定的地点或时间进行信息处理了,企业或事业单位的业务往往分布在全国各地甚至世界各地。因此,一种基于Internet、服务器与浏览器 (Browse/Server,这种结构的应用系统称为B/S结构的应用系统) 的应用系统开发成为必然,这种系统也就是基于网络技术的Web数据库应用系统,而且具有分布式的特点。因此,一般情况下,B/S结构的应用系统、Web数据库系统和分布式数据库系统是三个等价的概念。
分布式数据库系统是计算机网络技术与数据库技术相互渗透和有机结合的产物,主要研究在计算机网络上对于不同时间、不同地域的数据如何进行发布和处理的问题。因此,在这一阶段,分布式数据库系统的基本原理和实现技术包括结构特点、功能方法、相关算法及系统的实现技术等得到广泛的研究。在分布式的数据库应用系统中,关系模型是数据库系统中主流的数据模型,而分布式数据库管理系统在并发控制、数据丢失与恢复等方面兼容了集中式数据库管理系统 (单机版本的数据库应用系统) 的所有内容,因此这一阶段,分布式应用系统的开发就成为数据库应用系统开发的主流。
3. 数据库的组成
集成的数据库环境是由数据库、数据管理系统、数据库开发工具、应用系统平台、数据管理员和数据库用户所构成的。
(1) 数据库。
数据库 (Database) 是为了满足一定范围内许多用户的需要,在计算机里建立的一组互相关联的数据集合。数据库系统采用一种称为“数据库管理系统”的软件来集中管理和维护数据库里的数据,对数据的存储、更新、检索 (查找) 等操作采用统一的处理和控制方式; 数据能同时为多个应用程序和用户服务 (数据共享); 尽量消除信息的重复存储 (减少数据冗余量); 保证数据库中数据的完整性和一致性等许多方面。例如,一个学校的各个部门,如学籍管理部门、教务部门、各个系、宿舍管理部门、学生会等,都经常要在学生档案册里查询各种信息,只要将全校学生的档案数据建成一个学生档案数据库,提供给学校各个部门共同使用即可。
目前的数据库系统正在向可视化、开放式、多媒体数据信息等方向发展,并具有数据仓库、数据开采、知识发现、决策支持等功能,从而来适应社会公众对信息的收集、处理、管理,以开采数据、进行有效决策等需求。
(2) 数据库管理系统。
在早期,数据只能放在程序中进行处理,处理能力十分有限,且一个程序中的数据不能为其他程序共享。高级语言出现之后,可以将数据组织成数据文件的形式,一个数据文件可被一个程序或相关的几个程序调用,但数据仍不能脱离程序而独立存在,其共享性、安全性等性能仍然十分有限。随着计算机技术的进步以及信息管理研究和应用的深入,出现了数据库管理系统,使数据处理技术发展到了一个崭新的阶段。
数据库管理系统(Database Management Systems,DBMS) 是用于创建和管理数据库的系统软件,是数据库系统的核心组成部分。其主要功能有: 定义数据库的结构及其中数据的格式,规定数据在外存储器的存储安排方式,负责各种与数据有关的控制和管理任务。用户通过数据库管理系统的支持,访问数据库中的数据。比较常见的数据库管理系统有dbase/Fox Base/Fox-Pro/Visual Fox Pro系列产品、Oracle、Informix、Sybase以及微软公司的Access、SQL Serve等。
数据库管理系统的主要功能包括:
①定义数据库。
②装入数据库。
③操纵数据库。
④控制数据库。
⑤维护数据库。
⑥数据通信。
从程序的角度看,数据库管理系统是完成上述功能的许多系统程序所组成的一个集合。每个程序都有自己的功能,一个程序或几个程序一起完成数据库管理系统的一项工作,或一个程序完成几项工作,以设计方便与系统性能良好为原则。由于各个数据库管理系统的功能不完全一样,所以包含的程序也不相同。
(3) 数据库软件支持系统。
数据库系统的软件包含的主要程序有:
①操作系统。
支持数据库运行的操作系统。如Windows Server、Linux。
②数据库管理系统。
数据库管理系统是为数据库的建立、使用和维护配置的软件,如SQL、Oracle等。
③数据库的编译系统与应用程序。
数据库系统的核心软件,它是在操作系统的支持下进行数据管理工作的。
(4) 数据库硬件支持系统。
由于数据库系统的数据存储量和访问量一般都很大,因此整个系统对硬件的要求很高:
①磁盘空间要足够大。
②CPU处理速度要快。
③内存足够大。
4. 数据库的分类
(1) 按国际上通用的分类方法,数据库分为以下三大类:
①参考数据库。
参考数据库(Reference databases) 是能指引用户到另一信息源获取原文或其他细节的数据库,包括书目数据库 (Bibliographic databases) 如题录库、文摘索引库、图书馆机读目录库和指南数据库(Referral databases或Directory databases),如企业名录库、产品数据库等。
②源数据库
源数据库 (Source databases) 指能直接提供所需原始资料或具体数据的数据库。包括数值数据库 (Numeric databases)、全文数据库 (Full text databases)、术语数据库 (Terminolog-ical databases) 和图像数据库 (Graphic databases)。具体的如新闻消息全文库、法律法规全文库、商情全文库、期刊论文数据库、财务数据库、科技报告数据库、各种统计数据库、含有图片或照片的产品目录库、资料库等。
③混合型数据库。
混合型数据库 (Mixed databases) 能同时存储多种类型数据的数据库。近几年兴起的超文本技术将文献与文献之间的关系连接起来。各种形式的信息不是以一整篇文献为单元存储在系统中,而是通过关系链路将同一文本或不同文本中的信息单元组织起来。这样,用户从任一信息点出发可以遍历与其相关的各个信息单元,可以不必事先周密地考虑所有的检索词语和检索规则也能准确、迅速地获得所需信息。
(2) 按具体的数据库品牌来划分,主要的数据库分为以下9种:
①IBM的DB2。
DB2是IBM出口的一系列关系型数据库管理系统,分别在不同的操作系统平台上服务。虽然DB2产品是基于UNIX的系统和个人计算机操作系统,在基于UNIX系统和微软在Win-dows系统下的Access方面,DB2追寻了Oracle的数据库产品。IBM公司研制的一种关系型数据库系统——DB2主要应用于大型应用系统,具有较好的可伸缩性,可支持从大型机到单用户环境,应用于OS/2、Windows等平台下。DB2提供了高层次的数据利用性、完整性、安全性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和SQL命令。DB2采用了数据分级技术,能够使大型机数据很方便地下载到LAN数据库服务器,使得客户机/服务器用户和基于LAN的应用程序可以访问大型机数据,并使数据库本地化及远程连接透明化。它以拥有一个非常完备的查询优化器而著称,其外部连接改善了查询性能,并支持多任务并行查询。DB2具有很好的网络支持能力,每个子系统可以连接十几万个分布式用户,可同时激活上千个活动线程,对大型分布式应用系统尤为适用。
②Oracle。
Oracle Database,又名Oracle RDBMS,或简称Oracle,是甲骨文公司的一款关系数据库管理系统。到目前仍在数据库市场上占有主要份额。劳伦斯·埃里森和他之前的同事Bob Miner和Ed Oates在1977年建立了软件开发实验室咨询公司 (SDL,Software Development Laboratories) Oracle数据库是一种大型数据库系统,一般应用于商业、政府部门,它的功能很强大,能够处理大批量的数据,在网络方面也用得非常多。不过,一般的中小型企业都比较喜欢用Mysql,SQL server等数据库系统,它的操作很简单,功能也非常齐全。只是较Oracle数据库而言,在处理大量数据方面有些不如。
③Informix。
Informix是IBM公司出品的关系数据库管理系统 (RDBMS) 家族。作为一个集成解决方案,它被定位为作为IBM在线事务处理 (OLTP) 旗舰级数据服务系统。IBM对Informix和DB2都有长远的规划,两个数据库产品互相吸取对方的技术优势。在2005年早些时候, IBM推出了Informix Dynamic Server (IDS) 第10版。目前的最新版本是IDS11 (v11.50,代码名为“Cheetah2”),在2008年5月6日全球同步上市。
④Sybase。
Sybase是美国Sybase公司研制的一种关系型数据库系统,是一种典型的UNIX或Win-dows NT平台上客户机/服务器环境下的大型数据库系统。Sybase提供了一套应用程序编程接口和库,可以与非Sybase数据源及服务器集成,允许在多个数据库之间复制数据,适于创建多层应用。系统具有完备的触发器、存储过程、规则以及完整性定义,支持优化查询,具有较好的数据安全性。Sybase通常与Sybase SQLAnywhere用于客户机/服务器环境,前者作为服务器数据库,后者为客户机数据库,采用该公司研制的Power Builder为开发工具,在我国大中型系统中具有广泛的应用。
⑤SQL Server。
SQL Server是一个关系数据库管理系统。它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,于1988年推出了第一个OS/2版本。在Windows NT推出后,Mi-crosoft与Sybase在SQL Server的开发上就分道扬镳了,Microsoft将SQL Server移植到Win-dows NT系统上,专注于开发推广SQL Server的Windows NT版本。Sybase则较专注于SQL Server在UNIX操作系统上的应用。
⑥PostgreSQL。
Postgre SQL是一种特性非常齐全的自由软件的对象—关系型数据库管理系统 (ORD-BMS),可以说是目前世界上最先进,功能最强大的自由数据库管理系统。PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,版本4.2为基础的对象关系型数据库管理系统 (ORDBMS)。POSTGRES领先的许多概念只是在非常迟的时候才出现在商业数据库中。
⑦Access。
Microsoft Office Access (前名Microsoft Access) 是由微软发布的关联式数据库管理系统。它结合了Microsoft Jet Database Engine和图形用户界面两项特点,是Microsoft Office的成员之一。其实Access也是微软公司另一个通信程序的名字,想与Pro Comm以及其他类似程序来竞争。可是事后微软证实这是个失败计划,并且将它中止。数年后他们把名字重新命名于数据库软件。另外,Access还是C语言的一个函数名和一种交换机的主干道模式。
⑧Fox Pro。
Fox Pro最初由美国Fox公司1988年推出,1992年Fox公司被Microsoft公司收购后,相继推出了Fox Pro2.5、2.6和Visual Fox Pro等版本,其功能和性能有了较大的提高。Fox-Pro2.5、2.6分为DOS和Windows两种版本,分别运行于DOS和Windows环境下。Fox Pro比Fox BASE在功能和性能上又有了很大的改进,主要是引入了窗口、按钮、列表框和文本框等控件,进一步提高了系统的开发能力。
⑨mySQL
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购,而2009年,SUN又被Oracle收购,对于MySQL的前途,没有任何人抱乐观的态度。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
(3) 从发展阶段来划分,数据库可以分为以下三类:
①层次模型数据库。
1969年IBM公司研制了基于层次模型数据库管理系统,并作为商品化软件投入市场,该系统至今还有其特定用户,技术还在继续发展。
②网状模型数据库。
从20世纪60—70年代初,美国数据库系统语言协会下属的数据库任务组对数据库的方案和技术进行了系统研究,提出了数据库管理系统报告。该报告提出了数据库系统的许多基本概念、方法和技术,成为网状数据模型的典型代表,奠定了数据库发展的基础。数据库管理系统的存取效率较高,但数据独立性差,用户使用不方便。目前一些实时性要求较高的专用系统仍采用网状模型。
③关系模型数据库。
关系模型数据库是当前最主流的数据库类型,将在下一节中做详细介绍。
二、关系数据库
关系数据库是采用关系模型作为数据的组织方式的数据库。关系数据库产品一问世,就以其简单清晰的概念,易懂易学的数据库语言,使用户不需了解复杂的存取路径细节,不需说明“怎么干”,只需指出“干什么”就能操作数据库,从而深受广大用户喜爱,涌现出许多性能优良的商品化关系数据库管理系统,即RDBMS。著名的DB2、Oracle、Ingres、Sy-base、Informix等都是关系数据库管理系统。关系数据库产品也从单一的集中式系统发展到可在网络环境下运行的分布式系统,从联机事务处理到支持信息管理、辅助决策,系统的功能不断完善,数据库的应用领域迅速扩大。
关系数据库 (Relational Database,RDB) 就是基于关系模型的数据库。在计算机中,关系数据库是数据和数据库对象的集合。所谓数据库对象是指表、视图、存储过程、触发器等。关系数据库管理系统 (Relational Database Management System,RDBMS) 就是管理关系数据库的计算机软件。
1. 关系数据库
关系数据库的特点在于它将每个具有相同属性的数据独立地存储在一个表中。对任何一个表而言,用户可以新增、删除和修改表中的数据,而不会影响表中的其他数据。下面先来了解关系数据库中的一些基本概念。
(1) 键码 (Key)。
它是关系模型中的一个重要概念,在关系中用来标识行的一列或多列。
(2) 候选关键字 (Candidate Key)。
它是唯一地标识表中的一行而又不含多余属性的一个属性集。
(3) 主关键字 (Primary Key)。
它是被挑选出来,作为表行的唯一标识的候选关键字。一个表只有一个主关键字,主关键字又称为主键。
(4) 公共关键字 (Common Key)。
在关系数据库中,关系之间的联系是通过相容或相同的属性或属性组来表示的。如果两个关系中具有相容或相同的属性或属性组,那么这个属性或属性组被称为这两个关系的公共关键字。
(5) 外关键字 (Foreign Key)。
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外关键字。由此可见,外关键字表示了两个关系之间的联系。外关键字又称作外键。
2. 关系数据库管理系统的功能
关系数据库管理系统从功能上主要可分为四部分:
(1) 数据库模式定义语言。
数据库模式定义语言 (Database Definition Language,DDL) 是用于描述数据库中要存储的现实世界实体的语言。一个数据库模式包含该数据库中所有实体的描述定义。这些定义包括结构定义、操作方法定义等。不同的数据库管理系统提供的数据库模式定义语言不同,关系数据库都使用SQL语言描述关系模式。关系数据库的模式通过SQL语言中的CREATE语句实现。
(2) 数据库操纵语言。
关系数据库管理系统提供的数据库操纵语言 (Database Manipulation Language,DML)是终端用户和应用程序实现对数据库中的数据进行各种操纵的语言。数据库操纵语言包括的基本操作功能有: 增加、删除、修改、检索、显示输出等。
(3) 数据库系统运行控制。
关系数据库管理系统实现对数据库的各种操作,是在数据库管理程序控制下完成的。它是关系数据库管理系统运行的核心,主要包括事务管理和并发控制、数据完整性约束检查、数据库的建立和维护等功能。
(4) 数据库维护和服务。
数据库的维护主要是指对数据库和数据对象的安全保护,以及数据库的初始化、恢复和重构等。数据库的服务性功能主要是指初始化数据的装入,数据的导入/导出、数据在网上的发布,图形或报表的显示和输出功能等。
3. 常见的数据库对象
数据库对象是一种数据库组件,是数据库的主要组成部分。常见的数据库对象有以下几种,部分在前文中已做详细介绍,此处仅简单说明。
(1) 表 (Table)。
数据库中的表与我们日常生活中使用的表格类似,它也是由行 (Row) 和列 (Column)组成的。列由同类的信息组成,每列又称为一个“字段”,每列的标题称为列名。行包括了若干列信息项,一行数据称为一条“记录”,它表达有一定意义的信息组合。一个数据库表由一条或多条记录组成,没有记录的表称为空表。每个表中通常都有一个主关键字,用于唯一地确定一条记录。
(2) 索引 (Index)。
索引是根据指定的数据库表列建立起来的顺序,它提供了快速访问数据的途径,并且可以监督表的数据,使其索引所指向的列中的数据不重复。
(3) 视图 (View)。
视图看上去同表一样,具有一组命名的列和数据项,但它其实是一个虚拟的表,在数据库中并不实际存在。视图是由查询数据库表产生的,它限制了用户能看到和修改的数据。由此可见,视图可以用来控制用户对数据的访问,并能简化数据的显示,即通过视图只显示那些需要的数据信息。
(4) 图表 (Diagram)。
图表其实就是数据库表之间的关系示意图,利用它可以编辑表与表之间的关系。
(5) 默认值 (Default)。
默认值它是在表中创建列或插入数据时,对没有指定其具体值的列或列数据项赋予事先设定好的值。
(6) 规则 (Rule)。
规则它是对数据库表中数据信息的约束命令,并且限定的是表中的列。
(7) 触发器 (Trigger)。
触发器它是一个用户定义的SQL事务命令的集合。当对一个表进行插入、更改、删除时,这组命令就会自动执行。
(8) 存储过程 (Stored Procedure)。
存储过程是为完成特定的功能而汇集在一起的一组SQL语句,是经编译后存储在数据库中供用户调用的SQL程序。
(9) 用户 (User)。
用户就是有权限访问数据库的人。
4. 关系数据库的规范化
为了建立冗余较小、结构合理的数据库,将关系数据库中关系应满足的规范划分为若干等级,每一级称为一个“范式”。
范式的概念最早是由E.F.Codd提出的,他从1971年相继提出了三级规范化形式,即满足最低要求的第一范式 (1NF),在1NF基础上又满足某些特性的第二范式 (2NF),在2NF基础上再满足一些要求的第三范式 (3NF)。1974年,E.F.Codd和Boyce共同提出了一个新的范式概念,即Boyce-Codd范式,简称BC范式。1976年Fagin提出了第四范式(4NF),后来又有人定义了第五范式 (5NF)。至此,在关系数据库规范中建立了一个范式系列: 1NF、2NF、3NF、BCNF、4NF和5NF。
下面详细介绍在关系数据库中常用的三个范式。
(1) 第一范式 (1NF)。
在任何一个关系数据库中,第一范式是对关系模型的基本要求,不满足第一范式的数据库就不是关系数据库。
所谓第一范式是指数据库表的每一列都是不可再分割的基本数据项,同一列不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式中表的每一行只包含一个实例的信息。例如,有些客户信息,不能将客户信息都放在一列中显示,也不能将两列或多列放在一列中显示; 客户信息的每一行只表示一个客户的信息,一个客户的信息在表中只出现一次。简而言之,第一范式就是无重复的列。
(2) 第二范式 (2NF)。
第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。第二范式要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分,通常需要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键。
第二范式要求实体的属性完全依赖于主关键字。所谓“完全依赖”是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。简而言之,第二范式就是非主属性非部分依赖于主关键字。
(3) 第三范式 (3NF)。
满足第三范式必须先满足第二范式。也就是说,第三范式要求一个数据库表中不包含已在其他表中包含的非主关键字信息。例如,存在一个业务员信息,其中每个业务员有业务员编号、业务员姓名、家庭住址、电话等信息。那么在客户信息中列出业务员编号后就不能再将业务员姓名、家庭住址、电话等与业务员有关的信息加入客户信息中。如果不存在业务员信息,则根据第三范式也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其他非主属性。
三、SQL语言
1.SQL语言简介
SQL是结构化查询语言 (Structured Query Language) 的缩写,它实际上包括查询、定义、操纵和控制四个部分,是一种功能齐全的数据库语言。该语言早在20世纪70年代中期由Boyce和Chamberlin提出。由于SQL具有语言简洁、方便实用、功能齐全等突出优点,很快得到推广和应用,随着关系数据库的流行,SQL在计算机界和广大用户中已经得到公认。
目前,各种数据库管理系统几乎都支持SQL,或者提供SQL的接口。这就使得无论是大型机、中型机,或者小型机以至微机上的各种数据库系统都有了共同的存取语言标准接口,为更广泛的数据共享开创了乐观的前景。
SQL作为查询标准语言的影响已波及数据库领域之外,在人工智能、软件工程等领域的产品中也开始采用SQL作为数据和图形及其他对象的检索工具。SQL有两种使用方法,一种是以与用户交互的方式联机使用,另一种是作为子语言嵌入到其他程序设计语言中使用。前者称为交互式SQL,适合非计算机专业人员,即最终用户即附查询。后者称为宿主型SQL,适合于程序设计人员用高级语言编写应用程序并与数据库打交道时,嵌入到主语言中使用。这两种使用方法的基本语法结构一致,这里只介绍交互式SQL。由于它是在联机条件下直接使用的,有时也将每一个独立的操作叫做命令。
2. 数据定义
(1) 定义、修改与删除基表。
①定义基表。
CREATETABLE<表名> ( <列名><数据类型> [列级完整件约束条件]
[,<列名><数据类型> [列级完整性约束条件]…]
[<表级完整性约束条件>]);
列级完整性约束条件格式:
[NOTNULL[UNIQUE]][DEFAULT字值| USER| NULL]
表级完整性约束条件有三个任选项。用于定义主键的PRIMARYKEY子句,用于定义外键的FOREIGNKEY子句和用于定义列值限制条件的CHECK子句。格式:
[,PRIMARYKEY ( <列名>…)]
[,FOREIGNKEY[外键名]( <列名>…) REFERENCES<表
名> [ONDELETERESTRICT| CASCADE| SETNULL]]
[,CHECK (条件) …]
IBMDB2SQL主要支持以下数据类型:
SMALLINT 半字长二进制整数。
INTEGER或INT 全字长二进制整数。
DECIMAL (p [,q]) 或DEC (p [,q]) 压缩十进制数,共p位,其中小数点后有q位。
0≤q≤p≤15,q=0时可以省略。
FLOAT 双字长浮点数。
CHARTER (n) 或CHAR (n) 长度为n的定长字符串。
VARCHAR (n) 最大长度为n的变长字符串。
GRAPHIC (n) 长度为n的定长图形字符串。
VARGRAPHIC (n) 最大长度为n的变长图形字符串。
DATE 日期型,格式为YYYY—MM—DD。
TIME 时间型,格式为HH.MM.SS。
TIMESTAMP 日期加时间。
例1 建立Student (学生)、Course (课程)、SC (选课) 表。
“学生”表student由学号 (Sno)、姓名 (Sname)、性别 (Ssex)、年龄 (Sage)、所在系 (Sdept) 5个属性组成,可记为:
Student (Sno,Sname,Ssex,Sage,Sdept)
其中Sno为主键。
“课程”表course由课程号 (Cno)、课程名 (Cname)、选修课号 (Cpno)、学分(Ccredit) 4个属性组成,可记为:
Course (Cno,Cname,Cpno,Ccredit)
其中Cno为主键。
“学生选课”表SC由学号 (Sno)、课程号 (Cno)、成绩 (Grade) 3个属性组成,其中(Sno,Cno) 为主键。
CREATE TABLE Student
(Sno CHAR (5) NOT NULL UNIQUE,
Sname VARCHAR (20) NOT NULL,
Ssex CHAR (1),
Sage INT,
Sdept CHAR (15),
PRIMARY KEY (Sno));
CREATE TABLE Course
(Cno CHAR (1) NOT NULL,
Cname VARCHAR (20),
Cpno CHAR (1)
Ccredit DEC (2,1),
PRIMARY KEY (Cno),
FOREIGN KEY (Cpno) REFERENCES Course ON DELETE RESTRICT);
CREATE TABLE SC
(Sno CHAR (5) NOT NULL,
Cno CHAR (1) NOT NULL,
Grade DEC (4,1) DEFAULT NULL,
PRIMARYK EY (Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student ON DELETE CASCADE,
FOREIGN KEY (Cno) REFERENCES Course ON DELETE RESTRICT);
②修改基表。
ALTER TABLE<表名>
[ADD<新列名><数据类型> [完整性约束]]
[DROP<完整性约束名>]
[MODIFY<列名><数据类型>];
例2 向student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD Scome DATE;
例3 将年龄的数据类型改为半字长整数。
ALTER TABLE Student MODIFY Sage SMALLINT;
例4 删除 (撤消) Student表主键定义。
ALTER TABLE Student DROP PRIMARY KEY;
③删除基表。
DROP TABLE <表名>;
例5 删除Student表。
DROP TABLE Student;
(2) 建立与删除索引。
①建立索引。
CREATE[UNIQUE][CLUSTER]INDEX<索引名>
ON<表名> ( <列名> [次序][,<列名> [次序]]…);
排列次序,包括ASC (升序) 和DESC (降序) 两种,缺省值为ASC。
CREATECLUSTERINDEXStusname ONStudent (Sname);
例6 为学生—课程数据库中的Student,Course,SC3个表建立索引。其中Student表按学号升序建立唯一索引,Course表按课程号升序建立唯一索引,SC表按学号升序和课程号降序建立唯一索引。
CREATE UNIQUE INDEX Stusno ON Student (Sno);
CREATE UNIQUE INDEX Coucno ON Course (Cno);
CREATE UNIQUE INDEX SCno ON SC (Sno ASC,Cno DESC);
②删除索引。
DROPINDEX<索引名>;
例7 删除Student表的Stusname索引。
DROP INDEX Stusname;
3. 查询
SELECT[ALL| DISTINCT] <目标列表达式> [,<目标列表达式>]…
FROM <表名或视图名> [,<表名或视图名>]…
[WHERE<条件表达式>]
[GROUPBY<列名1> [HAVING<条件表达式>]]
[ORDERBY<列名2> [ASC | DESC]];
(1) 单表查询。
①选择表中的若干列。
②查询指定列。
例8 查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;
例9 查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept
FROM Student;
查询全部列
例10 查询全体学生的详细记录。
SELECT *
FROM Student;
查询经过计算的值
例11 查询全体学生的姓名及其出生年份。
SELECT Sname,2004-Sage
FROM Student;
例12 查询全体学生的姓名、出生年份和所在系,要求用小写字母表示所在系名
SELECT Sname,‘Year of Birth:’,2004-Sage,ISLOWER (Sdept)
FROM Student;
SELECT Sname NAME,‘Year of Birth:’BIRTH,2004-Sagc BIRTHDAY,
ISLOWER (Sdept) DEPARTMENT
FROM Student;
结果为:
NAME BIRTH BIRTHDAYDEPARTMENT
李勇 Yearof Birth: 1976 cs
刘晨 Yearof Birth: 1977 if
王名 Yearof Birth: 1978 ma
张立 Yearof Birth: 1978 if
选择表中的若干元组
消除取值重复的行
例13 查询所有选修过课的学生的学号。
SELECT Sno
FROM SC;
假设SC表中有下列数据:
Sno Cno Grade
或
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
执行上面的SELECT语句后,结果为:
Sno
95001
95001
95001
95002
95002
比较大小:
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
! =或<> 不等于
有些产品中还包括:
! > 不大于
! < 不小于
逻辑运算符NOT可与比较运算符同用,对条件求非。
例14 查计算机系全体学生的名单。
SELECT Sname
FROM Student
WHERE Sdept= ‘CS’;
例15 查所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM student
WHERE Sage<20;
SELECT Sname,Sage
FROM student
WHERE NOT Sage>=20;
例16 查考试成绩有不及格的学生的学号。
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
确定范围:
谓词BETWEEN...AND... 和NOT BETWEEN...AND... 可以用来查找属性值在 (或不在) 指定范围内的元组,其中BETWEEN后是范围的下限 (即低值),AND后是范围的上限(即高值)。
例17 查询年龄在20至23岁之间的学生的姓名、系别和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
与BETWEEN...AND... 相对的谓词是NOT BETWEEN...AND...
例18 查询年龄不在20至23岁之间的学生姓名、系别和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
确定集合:
谓词IN可以用来查找属性值属于指定集合的元组。
例19 查信息系 (IS)、数学系 (MA) 和计算机科学系 (CS) 的学生的姓名和性别。
SELECT Sname.Ssex
FROM Student
WHERE Sdept IN( ‘IS’,‘MA’,‘CS’);
与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。
例20 查既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname.Ssex
FROM Student
WHERE Sdept NOT IN( ‘IS’,‘MA’,‘CS’);
字符匹配:
谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:
[NOT]LIKE‘<匹配串>’
其含义是查找指定的属性列值与<匹配串>相匹配的元组,<匹配串>可以是一个完整的字符串,也可以含有通配符%和_ 。其中:
% (百分号) 代表任意长度 (长度可以为0) 的字符串。
例如,a%b表示以a开头,以b结尾的任意长度的字符串,acb、adefb、ab等都满足该匹配串。
_ (下划线) 代表任意单个字符。例如,a_ b表示以a开头,以b结尾,长度为3的字符串,acb、adb等都满足该匹配串。
例21 查询学号为95001的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE‘9500l’;
该语句实际上与下面的语句完全等价:
SELECT*
FROM Student
WHERE Sno= ‘9500l’;
例22 查所有姓刘的学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE‘刘%’;
例23 查姓“欧阳”且全名为3个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE‘欧阳_ _ ’;
例24 查名字中第二个字为“阳”字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE‘_ _ 阳%’;
例25 查所有不姓刘的学生的姓名。
SELECT Snamc,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE‘刘%’;
涉及空值的查询:
谓词IS NULL和IS NOT NULL可用来查询空值和非空值。
例26 某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩,下面来查一下缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
例27 查所有有成绩的记录的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
多重条件查询:
例28 查CS系年龄在20岁以下的学生姓名
SELECT Sname
FROM Student
WHERE Sdept= ‘CS’AND Sage<20;
例19中的IN谓词实际上是多个OR运算符的缩写,因此,例l9中的查询也可以用OR运算符写成如下等价形式:
SELECT Sname.Ssex
FROM Student
WHERE Sdept= ‘IS’OR Sdept= ‘MA’OR Sdept= ‘CS’;
③对查询结果排序。
例29 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno= ‘3’
ORDER BY Grade DESC;
例30 查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列。
SELECT*
FROM Student
ORDER BY Sdept,Sage DESC;
④使用集函数。
COUNT( [DISTINCT | ALL]* ) 统计元组个数
COUNT( [DISTINCT | ALL] <列名>) 统计一列中值的个数
SUM( [DISTINCT | ALL] <列名>) 计算一列值的总和 (此列必须是数值型)
AVG( [DISTINCT | ALL] <列名>) 计算一列值的平均值 (此列必须是数值型)
MAX( [DISTINCT | ALL] <列名>) 求一列值中的最大值
MIN( [DISTINCT | ALL] <列名>) 求一列值中的最小值
例31 查询学生总人数。
SELECT COUNT (* )
FROM Student;
例32 查询选修了课程的学生人数。
SELECT COUNT (DISTINCT Sno)
FROM SC;
例33 计算1号课程的学生平均成绩。
SELECT AVG (Grade)
FROM SC
WHERE Cno= ‘l’;
例34 查询学习l号课程的学生最高分数。
SELECT MAX (Grade)
FROM SC
WHERE Cno= ‘1’;
⑤对查询结果分组。
例35 查询各个课程号与相应的选课人数。
SELECT Cno,COUNT (Sno)
FROM SC
GROUP BY Cno;
例36 查询信息系选修了3门以上课程的学生的学号,为简单起见,假设SC表中有一列Dept,它记录了学生所在系。
SELECT Sno
FROM SC
WHERE Dept= ‘IS’
GROUP BY Sno
HAVING COUNT (* ) >3;
(2) 连接查询。
①等值与非等值连接查询。
[<表名l>.] <列名1><比较运算符> [<表名2>.] <列名2>
其中比较运算符主要有: =、>、<、>=、<=、! =。
此外,连接谓词还可以使用下面形式:
[<表名1>.] <列名1>BETWEEN[<表名2.] <列名2>AND[<表名2>.] <列名3>
当连接运算符为“=”时,称为等值连接。使用其他运算符称为非等值连接。
例37 查询每个学生及其选修课程的情况。
SELECT Student.* ,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
例38 Student表和SC表的笛卡尔积。
SELECT Student.* ,SC.*
FROMStudent,SC
例39 自然连接Student表和SC表。
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno;
或
SELECT Student.* ,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno;
②自身连接。
例40 查询每一门课的间接选修课 (即选修课的选修课)。
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;
Cno Cpno
1 7
3 5
5 6
③外连接。
例41
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno (* );
Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
9500l 李勇 男 20 CS 1 92
9500l 李勇 男 20 CS 2 85
9500l 李勇 男 20 CS 3 88
95002 刘晨 女 19 IS 2 90
95002 刘晨 女 19 IS 3 80
95003 王名 女 18 MA
95004 张立 男 18 IS
④复合条件连接。
例42 查询选修2号课程且成绩在90分以上的所有学生。
SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND
SC.Cno= ‘2’AND
SC.Grade>90;
结果表为;
Student.Sno Sname
95002 刘晨
例43 查询每个学生选修的课程名及其成绩。
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Snoand SC.Cno=COURSE.Cno;
(3) 嵌套查询。
SELECT Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno= ‘2’);
①带有IN谓词的子查询。
例44 查询与“刘晨”在同一个系学习的学生。
查询与“刘晨”在同一个系学习的学生,可以首先确定“刘晨”所在的系名,然后再查找所有在该系学习的学生。所以可以分步来完成此查询:
确定“刘晨”所在系名:
SELECT Sdept
FROM Student
WHERE Sname=‘刘晨’;
结果为: IS
查找所有在IS系学习的学生。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept= ‘IS’;
分步写查询毕竟比较麻烦,上述查询实际上可以用子查询来实现,即将第一步查询嵌入到第二步查询中,用以构造第二步查询的条件。SQL语句如下:
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname=‘刘晨’);
本例中的查询也可以用前面学过的表的自身连接查询来完成:
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept=S2.Sdept ANDS2.Sname=‘刘晨’;
本例中父查询和子查询均引用了Student表. 也可以像表的自身连接查询那样用别名将父查询中的Student表与子查询中的Student表区分开:
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1
WHERE S1.Sdept IN
(SELECT S2.Sdept
FROM Student S2
WHERE S2.Sname=‘刘晨’);
例45 查询选修了课程名为信息系统的学生学号和姓名。
完成此查询的基本思路是:
首先在Course关系中找出“信息系统”课程的课程号Cno。
然后在SC关系中找出Cno等于第一步给出的Cno集合中某个元素的Sno。
最后在Student关系中选出Sno等于第二步中求出Sno集合中某个元素的元组。取出Sno和Sname送入结果表列。
将上述想法写成SQL语句就是:
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno IN
(SELECT Cno
FROM Course
WHERE Cname=‘信息系统’));
DBMS按照由内向外的原则求解此SQL语句,首先处理最内层查询块,即课程名“信息系统”的课程号:
SELECT Cno
FROM Course
WHERE Cname=‘信息系统’
查询结果为3。从而可以把上面的SQL语句简化为:
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno IN( ‘3’));
对此SQL语句再处理内层查询,
SELECT Sno
FROM SC
WHERE Cno IN( ‘3’)
结果为95001和95002。从而可以把上面的SQL语句进一步简化为:
SELECT Sno,Sname
FROM Student
WHERE Sno IN( ‘95001’,‘95002’);
这样就可以求得最终结果。
本查询同样可以用连接查询实现:
SELECT Student.Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND
SC.Cno=Course.Cno AND
Course.Cname=‘信息系统’;
②带有比较运算符的子查询。
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户能确切知道内层查询返回的是单值时,可以用>、<、=、> =、< =、! =或< >等比较运算符。
例如,在例44中,由于一个学生只可能在一个系学习,也就是说内查询刘晨所在系的结果是一个唯一值,因此该查询也可以用比较运算符来实现,其SQL语句如下;
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1
WHERE S1.Sdept =
(SELECT S2.Sdept
FROM Student S2
WHERE S2.Sname=‘刘晨’);
需要注意的是,子查询一定要跟在比较运算符之后。下列写法是错误的:
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1
WHERE (SELECT S2.Sdept
FROM Student S2
WHERE S2.Sname=‘刘晨’) =S1.Sdept;
例45中信息系统的课程号是唯一的,但选修该课程的学生并不止一个,所以例45也可以用“=”运算符和IN谓词共同完成:
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno=
(SELECT Cno
FROM Course
WHERE Cname=‘信息系统’));
③带有ANY或ALL谓词的子查询
>ANY 大于子查询结果中的某个值
<ANY 小于子查询结果中的某个值
>=ANY 大于等于子查询结果中的某个值
<=ANY 小于等于子查询结果中的某个值
=ANY 等于子查询结果中的某个值
! =ANY或<>ANY 不等于子查询结果中的某个值
>ALL 大于子查询结果中的所有值
<ALL 小于子查询结果中的所有值
>=ALL 大于等于子查询结果中的所有值
<=ALL 小于等于子查询结果中的所有值
=ALL 等于子查询结果中的所有值 (通常没有实际意义)
! =ALL或<>ALL 不等于子查询结果中的任何一个值
例46 查询其他系中比IS系某一学生年龄小的学生名单。
SELECT S1.Sname,S1.Sage
FROM Student S1
WHERE S1.Sage<ANY
(SELECT S2.Sage
FROM Student S2
WHERE S2.Sdept= ‘IS’)
AND S1.Sdept<> ‘IS’
ORDER BY S1.Sage DESC;
注意,S1.Sdept<>‘IS’条件是父查询块中的条件,不是子查询块中的条件。
用集函数实现:
SELECT S1.Sname,S1.Sage
FROM Student S1
WHERE S1.Sage<
(SELECT MAX (S2.Sage)
FROM Student
WHERE S2.Sdept= ‘IS’)
AND S1.Sdept<> ‘IS’
ORDER BY Sage DESC;
例47 查询其他系中比IS系所有学生年龄都小的学生名单。
SELECT S1.Sname,S1.Sage
FROM Student S1
WHERE S1.Sage<ALL
(SELECT S2.Sage
FROM Student S2
WHERE S2.Sdept= ‘IS’)
AND S1.Sdept<> ‘IS’
ORDER BY S1.Sage DESC;
本查询同样也可以用集函数实现。即首先用子查询找出“IS”系的最小年龄 (18),然后在父查询中查所有非“IS”系且年龄小于18岁的学生姓名及其年龄。SQL语句如下:
SELECT S1.Sname,S1.Sage
FROM Student S1
WHERE S1.Sage<
(SELECT MIN (S2.Sage)
FROM Student S2
WHERE S2.Sdept= ‘IS’)
AND S1.Sdept<> ‘IS’
ORDER BY S1.Sage DESC;
事实上,用集函数实现子查询通常比直接用ANY或ALL查询效率要高。
④带有EXISTS谓词的子查询。
EXISTS代表存在量词。带有EXISTS谓词的子查询不退回任何实际数据,它只产生逻辑真值“TRUE”或逻辑假值“FALSE”。
例48 查询所有选修了1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT*
FROM SC
WHERE SC.Sno=Student.Sno AND Cno= ‘l’);
例49 查询所有未修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT*
FROM SC
WHERE SC.Sno=Student.Sno AND Cno= ‘l’);
例50 查询选修了全部课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT*
FROM Course
WHERE NOT EXISTS
(SELECT*
FROM SC
WHERE SC.Sno=Student.Sno
AND SC.Cno=Course.Cno));
例51 查询至少选修了学生95002选修的全部课程的学生号码。
本题的查询要求可以做如下解释,查询这样的学生,凡是95002选修的课,他都选修了。换句话说,若有一个学号为x的学生,对所有的课程y,只要学号为95002的学生选修了课程y,则x也选修了y; 那么就将他的学号选出来。
即不存在这样的课程y,学生95002选修了y,而学生x没有选。用SQL语言可表示如下:
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT*
FROM SC SCY
WHERESCY.Sno=95002AND
NOTEXISTS
(SELECT*
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno));
(4) 集合查询。
集合操作主要包括并操作UNION、交操作INTERSECT和差操作MINUS。
例52 查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT*
FROM Student
WHERE Sdept= ‘CS’
UNION
SELECT*
FROM Student
WHERE Sage<=19;
本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集。
例53 查询选修了课程1或者选修了课程2的学生。
本例实际上是查询选修课程1的学生集合与选修课程2的学生集合的并集。
SELECT Sno
FROM SC
WHERE Cno= ‘1’
UNION
SELECT Sno
FROMSC
WHERE Cno= ‘2’;
注: 标准SQL只有并,没有交和差,但实际上,交或差都可以用其他方法实现,具体实现根据不同的查询而不同 (用语义替换)。
4. 数据更新。
(1) 插入数据。
①插入单个元组。
INSERT INTO <表名> [( <属性列1> [,<属性列2>…)]
VALUES ( <常量1> [,<常量2>…])
例54 将一个新学生记录 (学号: 95020; 姓名: 陈冬; 性别: 男; 所在系: IS; 年龄: 18岁) 插入Student表中。
INSERT INTO Student
VALUES( ‘95020’,‘陈冬’,‘男’,‘IS’,‘18’);
例55 插入一条选课记录( ‘95020’,‘1’)
INSERT INTO SC (Sno,Cno)
VALUES( ‘95020’,‘1’);
②插入子查询结果。
INSERT INTO<表名> [<属性列1> [,<属性列2>…]]
子查询;
例56 对每一个系,求学生的平均年龄,并把结果存入数据库。
对于这道题,首先要在数据库中建立一个有两个属性列的新表,其中一列存放系名,一列存放相应系的学生平均年龄。
CREATE TABLE Deptage
(Sdept CHAR (15),Avgage SMALLINT);
然后对数据库的student表按系分组求平均年龄,再把系名和平均年龄存入到新表中。
INSERT INTO Deptage (Sdept,Avgage)
SELECT Sdept,AVG (Sage)
FROM Student
GROUP BY Sdept;
(2) 修改数据。
UPDATE <表名>
SET<列名>=<表达式> [,<列名>=<表达式>…]
[WHERE <条件>];
①修改某一个元组的值。
例57 将学生95001的年龄改为22岁
UPDATE Student
SET Sage=22
WHERE Sno= ‘95001’;
②修改多个元组的值。
例58 将所有学生的年龄增加1岁。
UPDATE Student
SET Sage=Sage+1;
③带子查询的修改语句。
例59 将计算机科学系全体学生的成绩置零。
UPDATE SC
SET Grade=0
WHERE‘CS’=
(SELECT Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
或
UPDATE SC
SET Grade=0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept= ‘CS’);
④修改操作与数据库的一致性。
第一条UPDATE语句修改Student表:
UPDATE Student
SET Sno= ‘96089’
WHERE Sno= ‘95007’;
第二条UPDATE语句修改SC表
UPDATE SC
SET Sno= ‘96089’
WHERE Sno= ‘95007’;
(3) 删除数据
DELETE FROM<表名>
[WHERE<条件>];
①删除某一个元组的值。
例60 删除学号为95019的学生记录。
DELETE
FROM Student
WHERE Sno= ‘95019’;
②删除多个元组的值。
例61 删除所有学生的选课记录。
DELETE FROM SC;
③带子查询的删除语句。
例62 删除计算机科学系所有学生的选课记录。
DELETE FROM SC
WHERE ‘CS’=
(SELECT Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
5. 视图
(1) 定义视图。
①建立视图。
CREATEVIEW<视图名> [( <列名> [,<列名>]…)]
AS<子查询>
如果CREATEVIEW语句仅指定了视图名,省略了组成视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下列三种情况下必须明确指定组成视图的所有列名:
a. 其中某个目标列不是单纯的属性名,而是集函数或列表达式。
b. 多表连接时选出了几个同名列作为视图的字段。
c. 需要在视图中为某个列启用新的更合适的名字。
例63 建立信息系学生的视图。
CREATE VIEW IS_ Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= ‘IS’;
本例中省略了视图IS_ Student的列名,隐含了该视图由子查询中SELECT子句中的3个目标列名组成。DBMS执行此语句就相当于建立虚表:
IS_ Student (Sno,Sname,Sage)
②删除视图。
DROP VIEW<视图名>;
例64 删除视图IS_ Student。
DROP VIEWIS_ Student;
(2) 查询视图。
对视图的查询转换为对基表的查询的过程称为视图的消解 (view resolution)。
例65 在信息系学生的视图中找出年龄小于20岁的学生。
SELECT Sno,Sage
FROM IS_ Student
WHERE Sage<20;
DBMS执行此查询时,将其与IS_ Student视图定义中的子查询
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= ‘IS’;
结合起来,转换成对基表student的查询
SELECT Sno,Sage
FROM Student
WHERE Sdept= ‘IS’ANDSage<20;
(3) 更新视图。
更新视图包括插入 (INSERT)、删除 (DELETE) 和修改 (UPDATE) 三类操作。
例如,如定义的视图S_ G是由“学号”和“平均成绩”两个属性列组成的,其中平均成绩一项是由SC表中多个元组分组后计算平均值得来的。如果想把视图S_ G中学号为95001的学生的平均成绩改成90分,SQL语句如下:
UPDATE S_ G
SET Grade=90
WHERE Sno= ‘95001’;
但这个对视图的更新是无法转换成对基表SC的更新的,因为系统无法修改各科成绩,以便平均成绩成为90分。所以S_ G视图是不可更新的。
由一个基表定义的视图,只有含有基表的主键或候补键,并且视图中没有用表达式或函数定义的属性,才允许更新;
由多表连接所定义的视图不允许更新。
定义中用到GROUP BY子句或集函数的视图不允许更新。
(4) 视图的用途。
①视图能够简化用户的操作。
②视图使用户能以多种角度看待同一数据。
③视图对重构数据库提供了一定程度的逻辑独立性。
例如,将学生关系
Student (Sno,Sname,Ssex,Sage,Sdept) 分为
SX (Sno,Sname,Ssex) 和
SY (Sno,Sage,Sdept)
两个关系,这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:
CREATE VIEW Student (Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,Sname,Ssex,Sage,Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno;
④视图能够对机密数据提供安全保护。
四、关系数据库设计
1. 需求分析阶段
需求分析是设计数据库的起点,需求分析的结果是否准确反映了用户的实际要求,将直接影响到后面各个阶段的设计,并关系到数据库设计的成败。需求分析阶段的主要任务包括确定设计内容、信息的收集和分析、撰写系统需求说明书。
(1) 确定设计内容。
这部分需要用户的积极配合。设计人员要了解不同用户的实际需求,深入实地调查研究,在各类用户的参与下,弄清现行系统的组织结构、功能划分、总体工作流程; 通过调查与分析,确定在新系统中计算机能够处理的范围和内容,明确哪些功能由计算机完成,哪些由人工完成,最终确定数据库系统实现的功能。比如,在医院信息系统整体规划中,药品管理部分会涉及药房药品信息、处方信息、收费信息等数据收集和处理。
(2) 信息的收集和分析。
需求分析要获得数据库设计所必需的数据信息,这些信息包括用户的数据需求、处理需求、完整性与安全性需求等。数据需求是指用户需要从数据库中获得信息的内容与性质。由用户的信息要求可以导出数据要求,即在数据库中需要存储哪些数据。处理需求是指用户对信息加工处理的要求,包括处理流程、发生频度、响应时间、安全保密要求等。数据的完整性与安全性需求是指数据的保密措施和存取控制要求,数据自身的或数据之间的约束条件。
(3) 系统需求说明书。
需求说明书是在需求分析活动后建立的文档资料,它是对应用系统需求分析的全面描述。需求分析说明书的内容有: 系统目标、功能、性能、运行环境以及分析过程中得到的功能结构图、数据流图、数据字典等。需求说明书是需求分析阶段的产物,是用户和设计开发人员在对系统的需求取得认同基础上的文字说明,应该能够准确表达用户的需求。
在需求分析阶段,为了高效进行需求分析,往往采用结构化分析方法。结构化分析方法以数据流图为主要工具、逐步求精地建立系统模型。结构化分析方法常采用数据字典、判定表、判定树等辅助工具。数据流图以图形的方式来表达数据处理系统中信息的变换和传递过程。数据字典则给出数据流图中所有数据元素的逻辑定义。
2. 数据库概念设计
在需求分析阶段,数据库设计人员充分调查并描述了用户的应用需求,还采用流程图等工具撰写了需求说明书。但说明书描述的需求仅仅是现实世界的具体需求。将需求分析阶段得到的用户需求抽象为信息结构 (即概念模型) 的过程就是概念结构设计。
数据库概念结构设计的常用方法是实体—联系方法。用实体—联系方法对具体数据进行抽象加工,将实体集合抽象成实体类型,用实体间联系反映现实世界事物间的内在联系。概念设计可分为局部视图设计和集成局部视图两个步骤。
(1) 局部视图设计。
一个整体的系统模型可以有多个局部视图。各个部门对于数据的需求和处理方法各不相同,它们都有自己的视图。概念设计首先根据需求分析阶段产生的各个部门的数据流图和数据字典中的相关数据,设计出各自的局部视图。局部视图的设计过程主要包括三步: 确定实体类型和属性、确定实体间的联系、画出局部E-R图。可以根据数据流图中的数据文件及其相关内容来确定视图中的所有实体类型及其属性,然后进行必要的调整。接下来确定实体间的联系和画出E-R图。
(2) 集成局部视图。
当所有局部视图设计完毕,就可以进行视图集成。集成视图的主要任务是归并和重构局部视图,使之成为一个统一的整体视图。视图集成是一个相当困难的工作,往往必须凭设计者的经验与技巧才能很好地完成。集成局部E-R视图需要两步: 合并,将各个分E-R图合并起来生成初步的E-R图; 修改与重构,消除不必要的冗余,生成整体E-R图。
3. 数据库逻辑设计
数据库逻辑设计阶段的任务就是将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化,以形成本数据库的数据库逻辑模型。该模型必须满足数据库的存取、一致性及运行等各方面的用户要求。数据库逻辑设计一般包括以下几步。
(1) DBMS的选择。
根据应用环境的特征、数据特点来确定所需要的DBMS功能与特性,由此选择一个特定的DBMS。DBMS的选取要受多种因素的影响,既有技术方面的,也有经济、组织方面的。在选取时要全盘考虑。
(2) 概念模型向数据模型的转换。
将概念模型转换成选定的DBMS可处理的逻辑数据模型。最普遍的数据模型是关系、网状、层次、面向对象模型。这里简单介绍E-R模型向关系模型的转换,这种转换一般遵循如下转换规则:
①一个实体转换成一个关系模式。实体的属性就是关系的属性,实体的码 (关键字)就是关系的码。但是对于联系的处理又有不同。
②一个1∶1联系可以转换成为一个独立的关系模式,也可以与任意一端对应的关系模式合并。如果转换成一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是该关系的候选码。如果与另一端对应的关系模式合并,则需要在该关系模式的属性中加入另一关系模式的码和联系本身的属性。
③一个1∶n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换成一个独立的关系模式,其方式等同于1∶1联系的处理方式,不同的是,这时建立的关系模式的码为n端实体的码。如果与另一端对应的关系模式合并,则只能与n端关系合并,需要在n端关系模式的属性中加入1端关系模式的码和联系本身的属性。
④一个m∶n联系需转换成一个独立的关系模式。与该联系相连的各实体的码以及联系本身的属性均作为关系的属性。各实体的码组成联系关系的码。
(3) 外模式的设计。
将概念模型转换为全局逻辑模型后,还应该根据局部应用需求,结合具体的DBMS的特点设计用户的外模式。外模式是用户看得到的数据模式,不同的用户都有自己的外模式。设计外模式时要考虑用户对数据的使用要求、习惯及安全性要求。
(4) 数据库定义。
用目标DBM所提供的数据定义语言和描述规则来描述逻辑数据模型和子模型,以便得到数据库模式和子模式。
4. 数据库物理设计
数据库物理模型设计的目标是从一个满足用户信息需求并已确定的逻辑模型出发,设计一个在限定的软、硬件条件和应用环境下可实现的并具有尽可能高的运行效率的物理数据库结构。在物理设计阶段,设计人员需要考虑如下内容:
(1) 选择数据库文件的存储结构。
数据库文件存储结构的选择与对文件进行的处理有关。对需要成批处理的数据文件可选用顺序存储结构,而经常需要随机查询某记录时,则选用散列方式的存储结构比较合适。
(2) 选择索引。
选择索引的目的在于提高访问效率。但由于索引的建立会增加系统开销,数据更新时要同时更新索引,降低了数据更新操作的效率,因此,应根据应用需要,对用户经常在应用中要求访问的数据项建立索引。
在物理设计过程中,还有许多控制因素是可供选择的,例如,存储空间的分配等。因而,从不同的角度考虑会产生多种选择方案,对这些方案要进行评价,从中选择最佳方案。
五、数据仓库和数据挖掘概述
1. 数据仓库
(1) 定义。
数据仓库是决策支持系统和联机分析应用数据源的结构化数据环境。数据仓库研究和解决从数据库中获取信息的问题。数据仓库的特征在于面向主题、集成性、稳定性和时变性。
数据仓库之父William H.Inmon在1991年出版的《Building the Data Warehouse》一书中所提出的定义被广泛接受——数据仓库 (Data Warehouse) 是一个面向主题的 (Subject Ori-ented)、集成的 (Integrated)、相对稳定的 (Non-Volatile)、反映历史变化 (Time Variant)的数据集合,用于支持管理决策 (Decision Making Support)。
广义地说,基于数据仓库的决策支持系统由三个部件组成: 数据仓库技术,联机分析处理技术和数据挖掘技术,其中数据仓库技术是系统的核心,在这个系列后面的文章里,将围绕数据仓库技术,介绍现代数据仓库的主要技术和数据处理的主要步骤,讨论在通信运营维护系统中如何使用这些技术为运营维护带来帮助。
(2) 特点。
数据仓库的特点表现在以下几个方面:
①数据仓库是面向主题的,操作型数据库的数据组织面向事务处理任务,而数据仓库中的数据是按照一定的主题域进行组织。主题是指用户使用数据仓库进行决策时所关心的重点方面,一个主题通常与多个操作型信息系统相关。
②数据仓库是集成的,它将所需数据从原来的数据仓库中抽取出核心数据来,对其进行加工与集成、统一与综合之后才能进入数据仓库。
③数据仓库是不可更新的,主要是为决策分析提供数据,所涉及的操作主要是数据的查询。
④数据仓库是随时间而变化的,传统的关系数据库系统比较适合处理格式化的数据,能够较好地满足商业商务处理的需求。稳定的数据以只读格式保存,且不随时间改变。
⑤数据仓库是汇总的。操作性数据映射成决策可用的格式。
⑥数据仓库是大容量的。时间序列数据集合通常都非常大。
⑦数据仓库是非规范化的。Dw数据可以是而且经常是冗余的。
⑧元数据。将描述数据的数据保存起来。
⑨数据源。数据来自内部的和外部的非集成操作系统。
(3) 数据仓库的体系结构。
①数据源。
数据源是数据仓库系统的基础,是整个系统的数据源泉。通常包括企业内部信息和外部信息。内部信息包括存放于DBMS中的各种业务处理数据和各类文档数据。外部信息包括各类法律法规、市场信息和竞争对手的信息等;
②数据的存储与管理。
数据的存储与管理是整个数据仓库系统的核心。数据仓库真正的关键是数据的存储和管理。数据仓库的组织管理方式决定了它有别于传统数据库,同时也决定了其对外部数据的表现形式。要决定采用什么产品和技术来建立数据仓库的核心,则需要从数据仓库的技术特点着手分析。针对现有各业务系统的数据,进行抽取、清理,并有效集成,按照主题进行组织。数据仓库按照数据的覆盖范围可以分为企业级数据仓库和部门级数据仓库 (通常称为数据集市)。
③OLAP (联机分析处理) 服务器。
OLAP服务器对分析需要的数据进行有效集成,按多维模型予以组织,以便进行多角度、多层次的分析,并发现趋势。其具体实现可以分为: ROLAP (关系型在线分析处理)、MOLAP (多维在线分析处理) 和HOLAP (混合型线上分析处理)。ROLAP基本数据和聚合数据均存放在RDBMS之中; MOLAP基本数据和聚合数据均存放于多维数据库中; HOLAP基本数据存放于RDBMS之中,聚合数据存放于多维数据库中。
④前端工具。
前端工具主要包括各种报表工具、查询工具、数据分析工具、数据挖掘工具以数据挖掘及各种基于数据仓库或数据集市的应用开发工具。其中数据分析工具主要针对OLAP服务器,报表工具、数据挖掘工具主要针对数据仓库。
⑤数据抽取工具。
数据抽取工具把数据从各种各样的存储方式中拿出来,进行必要的转化、整理,再存放到数据仓库内。对各种不同数据存储方式的访问能力是数据抽取工具的关键,应能生成CO-BOL程序、MVS作业控制语言 (JCL)、UNIX脚本、和SQL语句等,以访问不同的数据。数据转换都包括,删除对决策应用没有意义的数据段; 转换到统一的数据名称和定义; 计算统计和衍生数据; 给缺值数据赋给缺省值; 把不同数据的定义方式统一。
⑥数据仓库数据库。
数据仓库数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
⑦元数据。
元数据是描述数据仓库内数据的结构和建立方法的数据。可将其按用途的不同分为两类,技术元数据和商业元数据。技术元数据是数据仓库的设计和管理人员用于开发和日常管理数据仓库使用的数据。包括: 数据源信息; 数据转换的描述; 数据仓库内对象和数据结构的定义; 数据清理和数据更新时用的规则; 源数据到目的数据的映射; 用户访问权限,数据备份历史记录,数据导入历史记录,信息发布历史记录等。商业元数据从商业业务的角度描述了数据仓库中的数据,它包括: 业务主题的描述,包含的数据、查询、报表。
2. 数据挖掘。
(1) 数据挖掘的概念。
数据挖掘 (Data Mining,DM) 又被称为数据库中的知识发现 (Knowledge Discover in Database,KDD),是目前人工智能和数据库领域研究的热点问题。所谓数据挖掘是指从数据库的大量数据中揭示出隐含的、先前未知的并有潜在价值的信息的非平凡过程。数据挖掘是一种决策支持过程,它主要基于人工智能、机器学习、模式识别、统计学、数据库、可视化技术等,高度自动化地分析企业的数据,做出归纳性的推理,从中挖掘出潜在的模式,帮助决策者调整市场策略,减少风险,做出正确的决策。知识发现过程由以下三个阶段组成:①数据准备。
②数据挖掘。
③结果表达和解释。数据挖掘可以与用户或知识库交互。
数据挖掘是通过分析每个数据,从大量数据中寻找其规律的技术,主要有数据准备、规律寻找和规律表示3个步骤。数据准备是从相关的数据源中选取所需的数据并整合成用于数据挖掘的数据集; 规律寻找是用某种方法将数据集所含的规律找出来; 规律表示是尽可能以用户可理解的方式 (如可视化) 将找出的规律表示出来。数据挖掘的任务有关联分析、聚类分析、分类分析、异常分析、特异群组分析和演变分析,等等。并非所有的信息发现任务都被视为数据挖掘。例如,使用数据库管理系统查找个别的记录,或通过互联网的搜索引擎查找特定的Web页面,则是信息检索 (Information Retrieval) 领域的任务。虽然这些任务是重要的,可能涉及使用复杂的算法和数据结构,但是它们主要依赖传统的计算机科学技术和数据的明显特征来创建索引结构,从而有效地组织和检索信息。尽管如此,数据挖掘技术也已用来增强信息检索系统的能力。
(2) 数据挖掘的起源。
需要是发明之母。近年来,数据挖掘引起了信息产业界的极大关注,其主要原因是存在大量数据,可以广泛使用,并且迫切需要将这些数据转换成有用的信息和知识。获取的信息和知识可以广泛用于各种应用,包括商务管理,生产控制,市场分析,工程设计和科学探索等。
数据挖掘利用了来自以下一些领域的思想: 第一,来自统计学的抽样、估计和假设检验。第二,人工智能、模式识别和机器学习的搜索算法、建模技术和学习理论。数据挖掘也迅速地接纳了来自其他领域的思想,这些领域包括最优化、进化计算、信息论、信号处理、可视化和信息检索。一些其他领域也起到重要的支撑作用。特别地,需要数据库系统提供有效的存储、索引和查询处理支持。源于高性能 (并行) 计算的技术在处理海量数据集方面常常是重要的。分布式技术也能帮助处理海量数据,并且当数据不能集中到一起处理时更是至关重要。
(3) 数据挖掘的作用。
①分类 (Classification)。
首先从数据中选出已经分好类的训练集,在该训练集上运用数据挖掘分类的技术,建立分类模型,对于没有分类的数据进行分类。
②估值 (Estimation)。
估值与分类类似,不同之处在于,分类描述的是离散型变量的输出,而估值处理连续值的输出; 分类的类别是确定数目的,估值的量是不确定的。一般来说,估值可以作为分类的前一步工作。给定一些输入数据,通过估值,得到未知的连续变量的值,然后,根据预先设定的阈值,进行分类。例如,银行对家庭贷款业务,运用估值,给各个客户记分 (Score0~1)。然后,根据阈值,将贷款级别分类。
③预测 (Prediction)。
通常,预测是通过分类或估值起作用的,也就是说,通过分类或估值得出模型,该模型用于对未知变量的预言。从这种意义上说,预言其实没有必要分为一个单独的类。预言其目的是对未来未知变量的预测,这种预测是需要时间来验证的,即必须经过一定时间后,才知道预言准确性是多少。
④聚类 (Clustering)。
聚类是对记录分组,把相似的记录在一个聚集里。聚类和分类的区别是聚集不依赖于预先定义好的类,不需要训练集。聚类通常作为数据挖掘的第一步。例如,“哪一种类的促销对客户响应最好?”,对于这一类问题,首先对整个客户做聚类,将客户分组在各自的聚类里,然后对每个不同的聚集,回答问题,可能效果更好。
⑤描述和可视化 (Description and Visualization)。
描述和可视化是对数据挖掘结果的描述和可视化处理。
(4) 数据挖掘的基本步骤。
数据挖掘的步骤会随不同领域的应用而有所变化,每一种数据挖掘技术也会有各自的特性和使用步骤,针对不同问题和需求所制定的数据挖掘过程也会存在差异。此外,数据的完整程度、专业人员支持的程度等都会对建立数据挖掘过程有所影响。这些因素造成了数据挖掘在各不同领域中的运用、规划,以及流程的差异性,即使同一产业,也会因为分析技术和专业知识的涉入程度不同而不同,因此对于数据挖掘过程的系统化、标准化就显得格外重要。如此一来,不仅可以较容易地跨领域应用,也可以结合不同的专业知识,发挥数据挖掘的真正精神。
数据挖掘完整的步骤如下:
①理解数据和数据的来源 (understanding)。
②获取相关知识与技术 (acquisition)。
③整合与检查数据 (integration and checking)。
④去除错误或不一致的数据 (data cleaning)。
⑤建立模型和假设 (model and hypothesis development)。
⑥实际数据挖掘工作 (data mining)。
⑦测试和验证挖掘结果 (testing and verification)。
⑧解释和应用 (interpretation and use)。
由上述步骤可看出,数据挖掘牵涉了大量的准备工作与规划工作,事实上许多专家都认为整套数据挖掘的过程中,有80%的时间和精力是花费在数据预处理阶段,其中包括数据的净化、数据格式转换、变量整合,以及数据表的链接。可见,在进行数据挖掘技术的分析之前,还有许多准备工作要完成。
六、数据库技术的发展方向
在数据库技术发展的历程中,先后出现了多种数据库: 早期的层次数据库、网状数据库; 20世纪70年代末开始流行至今的关系数据库; 在关系数据库之后,出现了基于面向对象程序设计思想的面向对象数据库; 20世纪80年代后逐渐成为数据库研究重点的分布式数据库; 以及近年来,为了适应移动通信应用的需求,在分布式数据库基础上提出的移动数据库。
1. 当前主流数据库——关系数据库
1970年,IBM公司San Jose研究室的研究员E.F.Codd发表了题为《大型共享数据库的关系模型》的论文,提出了数据库的关系模型,奠定了关系数据库理论基础。20世纪70年代末,关系方法的理论研究和软件系统的研制均取得了很大成果,IBM公司的San Jose研究室在IBM370系列机上研制出关系数据库实验系统System R。1981年,IBM公司又宣布研制出具有System R全部特征的数据库软件新产品SQL/DS。与System R同期,美国加州大学伯克利分校也研制了Ingres数据库实验系统,并由Ingres公司发展成为Ingres数据库产品,使关系数据库产品从研究室走向了市场。
关系数据库产品一问世,就以其简单清晰的概念和易懂易学的数据库语言,使用户不需了解复杂的存取路径细节,不需说明“怎么干”,只需指出“干什么”就能操作数据库,因而深受广大用户喜爱,涌现出许多性能优良的商品化关系数据库管理系统,即RDBMS。著名的DB2、Oracle、Ingres、Sybase、Informix等都是关系数据库管理系统。关系数据库产品也从单一的集中式系统发展到可在网络环境下运行的分布式系统,从联机事务处理到支持信息管理、辅助决策,系统的功能不断完善,使数据库的应用领域迅速扩大。
2. 面向对象数据库
面向对象程序设计是软件工程的重要发展方向之一,它可以提高程序设计的生产率、重用性以及可扩充性。为了满足各种新的数据应用的需要,诸如多媒体数据、空间数据、复杂对象、超本文、知识、时序数据等的管理,面向对象数据库引起广泛兴趣。
面向对象是一种认识方法学,也是一种新的程序设计方法学。把面向对象的方法和数据库技术结合起来可以使数据库系统的分析和设计最大限度地与人们对客观世界的认识相一致。面向对象数据库系统是为了满足新的数据库应用需要而产生的新一代数据库系统。
在数据库中提供面向对象的技术是为了满足特定应用的需要。随着许多基本设计应用,如MCAD (机械计算机辅助设计) 和ECAD (电子技术计算机辅助设计) 中的数据库向面向对象数据库的过渡,面向对象思想也逐渐延伸到其他涉及复杂数据的应用中,其中包括辅助软件工程 (CASE)、计算机辅助印刷 (CAP) 和材料需求计划 (MRP)。这些应用在程序设计方面和数据类型方面都是数据密集型的,它们需要识别于类型关系的存储技术,并能对相近数据备份进行调整。
首先,面向对象数据库支持面向对象的数据模型,具有面向对象的特性。这些特性主要包括: 支持复杂对象,具有对简单对象运用各种对象构造符组成复杂对象的能力; 具有对象标识,对象独立于它的值而存在; 具有封装性,数据库对象中既封装数据又封装程序,从而达到信息隐蔽,同时也是逻辑数据独立性的一种形式; 支持类型和类的概念,类型概括具有相同特性的一组对象的共同特性; 支持类或类型的层次结构,从而支持继承性这一有力的建模工具; 允许过载,即将同一名字用于不同类型上的数据操作; 通过与现有程序设计语言的合理连接来达到计算完备性; 具有可扩充性。
其次,面向对象数据库是一个数据库管理系统,具有数据库管理系统的基本功能。主要包括: 持久性,数据库中的数据是持久保存的; 外存管理,包括索引管理、数据聚集、数据缓冲、存取路径选择、查询优化等; 并发性,系统应该提供和目前的数据库管理系统同样级别、对多个用户并发操作数据库的支持; 故障恢复,系统应该提供和目前的数据库管理系统同样级别、将数据库从故障后的错误状态恢复到某一正确状态的功能; 即席查询功能,查询功能应该是非过程化、高效及独立于应用的。
目前,面向对象数据库系统的一些核心技术问题已基本解决,诸如数据模型、数据语言、查询处理、对象管理、消息管理、版本管理、事务管理、物理结构等都有了具体的解决办法。当前相关研究主要集中于面向对象数据库的数据模型、程序设计语言和提高性能等。
面向对象数据库的实现一般有两种方式: 一种是在面向对象的设计环境中加入数据库功能,如ORIEN、CLOS等; 另一种则是对传统数据库系统进行改进,使其支持面向对象的数据模型,如Oracle8.0,Informix9.0等。
与传统数据库相比,面向对象数据库具有许多优点,如包含更多的数据语义信息,对复杂数据对象的表达能力更强等。甚至有人预言,数据库的未来将是面向对象的时代。但是,面向对象数据库还只是一种新兴的技术,还远不如关系数据库成熟,它的数据模型并不是建立在完美的数学基础之上; 数据库语言缺乏形式化基础; 也不像关系数据库那样有一个统一的标准。因此,作为一项新兴的技术,面向对象数据库还有待进一步研究,它是一项具有重大理论意义和应用前景的数据库技术。
3. 分布式数据库
分布式数据库系统是物理上分散、逻辑上集中的数据库系统,系统中的数据存放在计算机网络的不同场地,每一场地都有自治处理 (即独立处理) 能力并能完成局部应用; 同时,每一场地也至少参与一种全局应用,程序通过网络通信子系统执行全局应用。这里的场地是指节点,就是指计算机网络中的一台计算机。
分布式数据库的主要优点如下:
(1) 局部自主。
网络上每个节点的数据库系统都具有独立处理大量的本地事务的能力,而且各局部节点之间也能够互相访问,有效地配合处理更复杂的事务。因此,分布式数据库系统特别适合各个部门在地理位置分散的组织机构,例如,银行业务、飞机订票、企业管理等。
(2) 高可靠性和可用性。
分布式系统比集中式系统有更高的可靠性,在个别节点或个别通信链路发生故障的情况下可以继续工作。一个局部系统发生故障不至于导致整个系统停顿或破坏,只要有一个节点上的数据备份是可用的。可见,支持一定程度的数据冗余是充分发挥分布式数据库系统优点的先决条件之一。
(3) 效率和灵活性。
分布式系统分散了工作负荷,缓解了单机容量的压力。数据可以存储在临近的常用节点,如果本节点的数据子集包含了要查询的全部内容,显然比集中式数据库在全集上查找节省时间。
系统易于实现扩展。例如,一个单位要增加新的机构,分布式数据库系统能够在对现有系统影响较小的情况下实现扩充。因此,扩大系统规模比集中式系统更加方便、经济、灵活。
当然,分布式数据库目前仍然存在以下一些缺点:
(1) 复杂。
与集中式数据库相比,分布式数据库更复杂,为保证各场地之间的协调必须做很多额外的工作。
(2) 系统开销大。
系统开销主要包括硬件开销、通信开销、数据冗余的潜在开销以及为保证数据库全局并行性、并行操作的可串行性、安全性和完整性等的开销。
(3) 数据安全性和保密性较难处理。
每个场地的数据安全并不能保证全局的数据是安全的,安全性问题是分布式系统的固有问题。分布式系统是通过网络实现分布控制的,而通信网络本身在保证数据安全方面存在弱点,数据很容易被窃取。
4. 移动数据库
随着无线通信技术和移动通信基础设施的飞速发展,移动计算环境日益成熟,移动计算成为新兴的研究领域。移动计算涵盖分布计算技术、数据库和移动通信三大领域,因此,数据管理和访问成为移动计算中的一个重要方面。由于移动计算本身固有的一些特点,使得原来的技术如果发生重大变化,事务处理、查询、故障恢复等诸多基本操作会变得与物理位置、是否在线甚至电源供应情况密切相关。显然,传统的分布式数据库与客户服务器数据库已经不能有效支持移动计算,需要专门研究移动计算环境下的数据库。因此,移动数据库(Mobile database,也称Wireless database) 系统应运而生。
移动数据库系统是管理移动计算环境中数据的,可以把移动数据库系统视为分布式数据库系统的扩展。它所面临的问题与分布式数据库系统相似,即数据缓冲与复制、数据广播、查询处理、事务处理、故障恢复等。
在传统的分布计算系统中,各个计算节点之间都是假定通过固定网络连接,并保持网络的持续连接性,而移动计算系统改变了这种假设条件。移动计算系统是由固定节点和移动节点构成的分布计算系统,它将使用户不再需要停留在固定位置不变,而是可以携带着移动计算机自由移动,并在移动的同时通过移动通信网络保持与固定节点或其他移动节点的连接。这种移动性将创造一类全新的应用,使得人们能够更加方便地访问各种信息。
与基于固定网络的传统分布计算环境相比,移动计算环境具有以下一些主要特点:
(1) 移动性。
在移动计算环境中,一台移动计算机不仅可以在不同的地方联通网络,而且在移动的同时也可以保持网络连接。这种计算平台的移动性可能导致系统访问布局的变化和资源的移动性。而且,个人的移动性 (即在不同地方使用当地的计算设备) 也随着个人通信网 (Per-sonnel Communication network,PCN) 与网络计算机 (Network Computer,NC) 的提出而日益突出。
(2) 频繁断接性。
移动计算机在移动过程中,由于受使用方式、电源、无线通信费用、网络条件等因素的限制,一般不采用保持持续联网的工作方式,而是主动或被动地间歇性入网和断接 (discon-nection)。
(3) 网络条件多样性。
移动计算机的移动性使得不同时间可用的网络条件 (如网络带宽、通信代价,网络延迟以及服务质量等) 是变化多端的,甚至相差悬殊: 移动计算机既可以连入高带宽的固定网络中 (如LAN),也可以工作在低带宽的无线广域网中 (如CDPD),甚至根本无网可上(处于连接中断状态)。
(4) 网络通信的非对称性。
物理通信媒介的限制,至此一般的无线网络通信都是非对称的,表现在固定服务器节点可以拥有强大的发送设备,而移动计算机的发送能力非常有限,于是下行链路 (服务器到移动计算机) 的通信带宽与代价和上行链路 (移动计算机到服务器) 相差很大。
(5) 移动计算机的电源能力。
移动计算机主要依靠蓄电池供电,而现在的电池容量相当有限。例如,一台笔记本电脑在正常连续使用的情况下,一般只能维持2~6个小时。由于电池容量的提高速度远远低于CPU计算能力和内存容量的发展速度,因此,尽管目前很多节能技术已经应用于移动计算机,移动计算机的动态电源管理技术也成了一个研究热点,但是电池容量问题仍将存在。这也是移动计算机不能总保持在线联机工作的原因之一。
(6) 高可靠性。
无线网络与固定网络相比较,可靠性要低,而且容易受到干扰而出现网络故障,而且由于移动计算机的移动性,也带来很多的不安定因素。
(7) 规模可伸缩性。
由于移动设备在移动的过程中可能处于联网状态或者脱离网络状态,因此移动数据库的节点数就会不断动态变化。在这种情况下,数据库的规模是不可确定的。移动数据库必须具有规模可伸缩性这个特点。
研究表明,由于移动计算环境的上述特点,使得传统的分布式数据库技术不能支持或是不能有效支持移动计算环境。因此,研究移动数据库技术,即支持移动计算环境的分布式数据库技术,已成为目前分布式数据库研究的一个新的方向,它将在公共信息发布、企业移动办公系统、野外探索交互系统、航海系统、战场作战指挥等移动环境中发挥重要的作用。
本章习题
1. 简述计算机硬件和软件的发展过程。
2. 举例说明计算机软件的发展趋势。
3. 简述数据库的类型及其特点。
4. 简述数据库的发展方向。
5. 简述SQL语言的特点。
6. 收集市场上主流数据库系统信息,分析不同数据库系统的特点,并举例说明各数据库的应用。
[1] 1英寸=2.54厘米。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。