第一章
数据库系统概述
数据库的4个基本概念
数据、数据库、数据库管理系统、数据库系统是与数据库技术密切相关的4个基本概念
数据
数据是数据库中存储的基本对象,描述事物的符号记录称为数据,数据的表现形式还不能完全表达其内容,需要经过解释,数据和关于数据的解释是不可分的,数据的解释是指对数据含义的说明,数据的含义称为数据的语义,数据与其语义是不可分的。
数据库
存放数据的仓库。严格来说,数据库是长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
数据库数据具有永久存储、有组织和可共享三个特点。
数据库管理系统
数据库管理系统是位于用户和操作系统之间的一层数据管理软件,数据库管理系统和操作系统一样是计算机的基础软件,主要功能包括:
1.数据定义功能
2.数据组织、存储和管理
3.数据操纵功能
4.数据库的事务管理和运行管理
5.数据库的建立和维护功能
6.其他功能
数据库系统
数据库系统是由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统
数据管理技术的产生和发展
数据管理是指对数据进行分类、组织、编码、存储、检索和位数,它是数据处理的中心问题,而数据的处理是指对各种数据进行收集、存储、加工和传播的一系列活动的总和。在应用需求的推动下,在计算机硬件、软件发展的基础上,数据管理技术经历了人工管理、文件系统、数据库系统三个阶段。
人工管理阶段
特点:
1.数据不保存
2.应用程序管理数据
3.数据不共享
4.数据不具有独立性
文件管理阶段
特点:
1.数据可以长期保存
2.由文件系统管理数据
3.数据共享性差,冗余度大
4.数据的独立性差
数据库系统阶段
用数据库系统来管理数据比文件系统具有更明显的优点,从文件系统到数据库系统标志着数据管理技术的飞跃
人工管理阶段 | 文件系统阶段 | 数据库系统阶段 | ||
---|---|---|---|---|
背景 | 应用背景 | 科学计算 | 科学计算、数据管理 | 大规模数据管理 |
硬件背景 | 无直接存储设备 | 磁盘、磁鼓 | 大容量磁盘、磁盘阵列 | |
软件背景 | 没有操作系统 | 有文件系统 | 有数据库管理系统 | |
处理方式 | 批处理 | 联机实时处理、批处理 | 联机实时处理、分布处理、批处理 | |
特点 | 数据的管理者 | 用户(程序员) | 文件系统 | 数据库管理系统 |
数据面向的对象 | 某一应用程序 | 某一应用 | 现实世界(一个部门、企业、跨国组织等) | |
数据的共享程度 | 无共享、冗余度极大 | 共享性差,冗余度大 | 共享性高,冗余度小 | |
数据的独立性 | 不独立、完全依赖于程序 | 独立性差 | 具有高度的物理独立性和一定的逻辑独立性 | |
数据的结构化 | 无结构 | 记录内有结构,整体无结构 | 整体结构化,用数据模型描述 | |
数据控制能力 | 应用程序自己控制 | 应用程序自己控制 | 由数据库管理系统提供数据安全性、完整性、并发控制和恢复能力 |
数据库系统的特点
1.数据结构化
数据库系统实现整体数据的结构化,这是数据库的主要特征之一,也是数据库系统与文件系统的本质区别。所谓“整体”结构化是指数据库中的数据不再仅仅针对某一个应用,而是面向整个组织和企业;不仅数据内部是结构化的,而且整体式结构化的,数据之间是有联系的。
2.数据的共享性高、冗余度低且易扩充
数据共享可以大大减少数据冗余,节约存储空间。数据共享还能够避免数据之间的不相容性与不一致性。由于数据面向整个系统,是有结构的数据,不仅可以被多个应用共享使用,而且容易增加新的应用,这就使得数据库系统弹性大、易扩充。
3.数据独立性高
数据独立性是借助数据库管理数据的一个显著优点,它已经成为数据库领域中一个常用的术语和重要概念,包括数据的物理独立性和逻辑独立性。
物理独立性是指用户的应用程序与数据库中数据的物理存储是相互独立的。
逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的。
数据独立性是由数据库管理系统提供的二级映像功能来保证的。
4.数据由数据库管理系统统一管理和控制
1.数据的安全性保护
数据的安全性保护是指保护数据防止不合法使用造成数据泄密和破坏
2.数据的完成性检查
数据的完整性指数据的正确性、有效性和相容性
3.并发控制
4.数据库恢复
综上所述,数据库是长期储存在计算机内,有组织的、可共享的大量数据的集合。它可以供各种用户共享,具有最小冗余度和较高的数据独立性。数据库系统在数据库建立、运用和维护时对数据进行统一控制,以保证数据的完整性和安全性,并在多用户同时使用数据库时进行并发控制,在发生故障后对数据库进行恢复。
数据库系统的出现使信息系统从以加工数据的程序为中心转向围绕共享的数据库为中心的新阶段,这样既便于数据的集中管理,又能简化应用程序的研制和维护,提高了数据的利用率和相容性,提高了决策的可靠性。
数据模型
数据模型也是一种模型,它是对现实世界的数据特征的抽象。数据模型是数据库系统的核心和基础。
两类数据模型
数据模型应该满足三方面要求:一是能够比较真实地模拟现实世界,而是容易为人所理解,三是便于在计算机上实现。分为概念模型,逻辑模型和物理模型。
其中第一类是概念模型,第二类是逻辑模型和物理模型。
第一类逻辑模型,也成为信息模型,它是按用户的观点来对数据和信息建模,主要用于数据库设计。
第二类中的逻辑模型主要包括层次模型、网状模型、关系模型、面向对象数据模型、对象关系数据模型、半结构化数据模型等。它是按计算机系统的观点对数据建模,主要用于数据库管理系统的实现。
第二类中的物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方式和存取方法,或在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。物理模型的具体实现是数据库管理系统的任务,数据库设计人员要了解和选择物理模型,最终用户则不必考虑物理级的细节。
数据模型是数据库系统的核心和基础。
建立步骤为:首先将现实世界抽象为信息世界,然后将信息世界转换为机器世界
从现实世界到概念模型的转换是由数据库设计人员完成的;从概念模型到逻辑模型的转换可以由数据库设计人员完成,也可以用数据库设计工具协助设计人员完成;从逻辑模型到物理模型的转换主要是由数据库管理系统完成的。
概念模型
信息世界中的基本概念
1.实体
客观存在并可相互区别的事物称为实体。
2.属性
实体所具有的某一特性称为属性。
3.码
唯一标识实体的属性集称为码。
4.实体型
用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。
5.实体集
同一类型实体的集合称为实体集。
6.联系
实体之间的联系通常指不同实体集之间的联系。实体之间的联系有一对一、一对多和多对多等多种类型。
概念模型的一种表示方法:实体-联系方法
数据模型的组成要素
一般地讲,数据模型是严格定义的一组概念的集合,这些概念精确地描述了系统的静态特性、动态特性和完整性约束条件。因此数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成。
数据结构
数据结构描述数据库的组成对象以及对象之间的联系。数据结构是所描述的对象类型的集合,是对系统静态特征的描述。
数据操作
数据操作是指对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则。数据库主要有查询和更新(包括插入、删除、修改)两大类操作,数据操作是对系统动态特征的描述。
数据的完整性约束条件
数据的完整性约束条件是一组完整性规则。完整性规则则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。
数据模型应该反映和规定其必须遵守的基本的和通用的完整性约束条件。
数据模型还应该提供定义完整性约束条件的机制,以反映具体应用所牵涉的数据必须遵守的特定的语义约束条件。
常用的数据类型
层次模型
网状模型
关系模型
面向对象数据模型
对象关系数据模型
半结构化数据模型
其中,层次模型和网状模型统称为格式化模型。
层次模型
层次模型用树形结构来表示各类实体以及实体间的联系。
1.层次模型的数据结构
在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型:
(1)有且只有一个节点没有双亲结点,这个节点称为根节点。
(2)根以外的其他节点有且只有一个双亲节点。
每个记录类型可包含若干个字段,这里记录类型描述的是实体,字段描述实体的属性。各个记录类型及其字段都必须命名。各个记录类型,同一记录类型中各个字段不能同名。每个记录类型可以定义一个排序字段,也成为码字段,如果定义该排序字段的值是唯一的,则它能唯一地标识一个记录值。
一个层次模型在理论上可以包含任意有限个记录类型和字段,但实际的系统都会因为存储容量或实现复杂度而限制层次模型中包含的记录类型个数和字段的个数。
在层次模型中,同一双亲的子女节点称为兄弟节点,没有子女节点的节点称为叶节点。
层次模型像一颗倒立的树,节点的双亲是唯一的。
层次模型的一个基本特点是,任何一个给定的记录值只能按其层次路径查看,没有一个子女记录值能够脱离双亲记录值而独立存在。
2.层次模型的数据操纵与完整性约束
层次模型的操纵主要有查询、插入、删除和更新。进行插入、删除、更新操作时要满足层次模型的完整性约束条件,进行插入操作时,如果没有相应的双亲结点值就不能插入它的子女节点值,进行删除操作时,如果删除双亲节点值,则相应的子女节点值也将被同时删除。
3.层次模型的优缺点
优点:
1.层次模型的数据结构比较简单清晰。
2.层次数据库的查询效率高,其性能由于关系数据库,不低于网状数据库。
3.层次数据模型提供了良好的完整性支持。
缺点:
1.现实世界有很多联系是非层次性的
2.如果一个节点具有多个双亲结点,用层次模型表示这类关系就很笨拙,只能通过引入冗余数据或创建非自然的数据结构来解决,对插入和删除的限制比较多,因此应用程序的编写比较复杂。
3.查询子女节点必须通过双亲节点。
4.由于结构严密,层次命令趋于程序化。
网状模型
网状模型的典型代表是DETG系统,亦称CODASYL系统。
1.网状模型的数据结构
在数据库中,把满足以下两个条件的基本层次联系集合称为网状模型:
(1)允许一个以上的节点无双亲。
(2)一个节点可以有多于一个的双亲。
网状模型是一种比层次模型更具普遍性的结构。它去掉了层次模型的两个限制,允许多个节点没有双亲节点,允许节点有多个双亲节点;此外它还允许两个节点之间有多种联系(称之为复合联系)。因此,网状模型可以更直接地去描述现实世界,而层次模型实际上是网状模型的一个特例。
层次模型中子女节点与双亲节点的联系是唯一的,而在网状模型中这种联系可以不唯一。
2.网状模型的数据操纵与完整性约束
网状模型一般来说没有层次模型那样严格的完整性约束条件,但具体的网状数据库系统对数据操纵都加了一些限制,提供了一定的完整性约束。
3.网状模型的优缺点
优点:
1.能够更为直接地描述现实世界。
2.具有良好的性能,存取效率高。
缺点:
1.结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于用户最终掌握。
2.网状模型的DDL,DML复杂并且要嵌入某一种高级语言中,用户不易掌握,不容易使用。
3.由于记录之间的联系是通过存取路径实现的,应用程序在访问数据时必须选择适当的存取路径,因此用户必须了解系统结构的细节,加重了编写应用程序的负担。
关系模型
1.关系模型的数据结构
关系模型与以往模型不同的是,它是建立在严格的数学概念的基础上的。从用户观点看,关系模型由一组关系组成,每个关系的数据结构只是一张规范的二维表。
**关系:**一个关系对应通常说的一张表。
**元组:**表中的一行即为一个元组。
**属性:**表中的一列即为一个属性,给每一个属性起一个名称即属性名。
**码:**也成为码键,表中的某个属性组,它可以唯一确定一个元组。
**域:**域是一组具有相同数据类型的值的集合。
**分量:**元组中的一个属性值。
**关系模式:**对关系的描述,一般表示为:
关系名(属性1,属性2,…,属性n)
2.关系模型的数组操纵与完整性约束
关系模型的数据操纵主要包括查询、插入、删除和更新数据,这些操作必须满足关系的完整性约束条件。关系的完整性约束条件包括三大类:实体完整性、参照完整性和用户定义的完整性。
3.关系模型的优缺点
优点:
1.关系模型与格式化模型不同,它是建立在严格的数学概念的基础上的。
2.关系模型的概念单一。无论是实体还是实体之间的关系都用关系来表示。对数据的检索和更新结果也是关系。所以其数据结构简单、清晰,用户易懂易用。
3.关系模型的存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作。
缺点:
由于存取路径对用户是隐蔽的,查询效率往往不如格式化数据模型,为了提高性能,数据库管理系统必须对用户的查询请求进行优化,因此增加了开发数据库管理系统的难度。
数据库系统的结构
从数据库应用开发人员角度看,数据库系统通常采用三级模式结构,这是数据库系统内部的系统结构。从数据最终用户角度看,数据库系统的结构分为单用户结构、主从式结构、分布式结构、客户-服务器结构、浏览器-应用服务器/数据服务器多层结构等。这是数据库系统外部的体系结构。
数据库系统模式的概念
在数据模型中有“型”和“值”的概念。型是指对某一类数据的结构和属性的说明,值是型的一个具体赋值。
模式是数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及型的描述,不牵涉具体的值。模式的一个具体值称为模式的一个实例。同一个模式可以有很多实例。
模式是相对稳定的,而实例是相对变动的。模式反映的是数据的结构及其联系,而实例反映的是数据库某一时刻的状态。
数据库系统的三级模式结构
数据库系统的三级模式结构是指数据库是由外模式、模式、内模式三级构成。
模式
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。它是数据库系统模式结构的中间层,既不涉及数据的物理存储细节和硬件环境,又与具体的应用开发工具及高级程序涉及语言无关。
模式实际上是数据库在逻辑级上的视图。一个数据库只有一个模式。数据库模式以某一种数据模型为基础,同一综合地考虑了所有用户的需求,并将这些需求有机地结合成一个逻辑整体。定义模式时不仅要定义数据的逻辑结构,还要定义数据之间的关系。
数据库管理系统提供模式数据定义语言来严格定义模式。
外模式
外模式也称子模式或用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
一个数据库可以有多个外模式,同一外模式也可以为某一用户的多个应用系统所使用,但是一个应用程序只能使用一个外模式。
外模式是保证数据库安全性的一个有力措施,每个用户只能看见和访问所对应的外模式中的数据,数据库中的其余的数据是不可见的。
数据库管理系统提供外模式数据定义语言来严格定义外模式。
内模式
内模式也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。
数据库的二级映像功能与数据独立性
数据库系统的三级模式是数据的三个抽象级别,它把数据的具体组织留给数据库管理系统管理,使用户能逻辑地、抽象地处理数据,而不必关心数据在计算机中的具体表示方式与存储方式。
外模式/模式映像
模式描述的是数据的全局逻辑结构,外模式描述的是数据的局部逻辑结构。对应于同一个模式可以有任意多个外模式,对于每一个外模式,数据库系统都有一个外模式/模式映像,它定义了该外模式与模式之间的对应关系,这些映像定义通常包含在各自外模式的描述中。
当模式改变时,由数据库管理员对各个外模式/模式映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
模式/内模式映像
数据库中只有一个模式,也只有一个内模式。内模式定义了数据全局逻辑结构与存储结构之间的对应关系。当数据的存储结构改变时,由数据库管理员对模式/内模式作相应改变,可以使模式保持不变,从而应用程序也不必改变,保证了数据与程序的物理独立性,简称数据的物理独立性。
数据与程序之间的独立性使得数据的定义和描述可以从应用程序分离出去。由于数据的存取由数据库管理系统管理,从而简化了应用程序的编制,大大减少了应用程序的维护和修改。
数据库系统的组成
数据库系统由数据库、数据库管理系统、应用程序和数据库管理员组成,下面分别介绍这几部分内容
硬件平台及数据库
1.要有足够大的内存,存放操作系统、数据库管理系统的核心模块、数据缓冲区和应用程序。
2.由足够大的硬盘或磁盘阵列等设备存放数据库,有足够大的磁盘(或光盘)作数据备份。
3.要求系统有较高的通道能力,以提高数据传送率。
软件
1.数据库管理系统。
2.支持数据库管理系统运行的操作系统。
3.具有与数据库接口的高级语言及其编译系统,便于开发应用程序。
4.以数据库管理系统为核心的应用开发工具。
5.为特定应用环境开发的数据库应用系统。
人员
数据库管理员
1.决定数据库中的信息内容和结构。
2.决定数据库的存储结构和存储策略。
3.定义数据的安全性要求和完整性约束条件。
4.检控官数据库的使用和运行。
(1)周期性转储数据库:数据文件、日志文件。
(2)系统故障修复。
(3)介质故障修复。
(4)监视审计文件。
5.数据库的改建和重构、重组
(1)性能监控和调优。
(2)定期对数据库进行重组织,以提高数据库的性能。
(3)需求增加和改变时,数据库需重构造。
系统分析员和数据库设计人员
系统分析员
1.负责应用系统的需求分析和规范说明。
2.要和用户及数据库管理员相结合,确定系统的硬件软件配置。
3.参与数据库系统的概要设计。
数据库设计人员
1.参加用户需求调查和系统分析。
2.确定数据库中的数据。
3.设计数据库各级模式。
应用程序员
1.设计和编写应用系统的程序模块。
2.进行调试和安装。
用户
这里用户指最终用户,最终用户通过应用系统的用户接口使用数据库。
1.偶然用户
这类用户不经常访问数据库,但每次访问数据库时往往需要不同的数据库信息,这类用户一般是企业或机构的高中级管理人员。
2.简单用户
主要工作是查询和更新数据库。银行的职员,航空公司的机票预定工作人员、宾馆总台服务员等。
3.复杂用户
工程师、科学家、经济学家、科学技术工作者。直接使用数据库语言访问数据库,甚至能够基于数据库管理系统的应用程序接口编制自己的应用程序。
第二章
关系数据结构及其形式化定义
关系数据库系统是支持关系模型的数据库系统。按照数据模型的三个要素,关系模型有关系数据结构、关系操作集合和关系完整性约束三部分组成
关系
关系模型的数据结构非常简单,只包含单一的数据结构—关系。在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表
在关系模型中,现实世界的实体以及实体间的各种联系均用单一的结构类型,即关系表示
关系模型是建立在集合代数的基础之上的
域
域是一组具有相同数据类型的值的集合
笛卡尔积
定义一组域,允许其中的某些域是相同的,的笛卡尔积为
其中,每一个元素叫做一个元组,或简称元组,元组中的每一个值叫做一个分量
一个域允许的不同的取值个数称为这个域的基数
若为有限集,其基数为,则的基数M为
关系
定义的子集叫做在域上的关系,表示为,这里R表示关系的名字,n是关系的目或者度
关系中的每个元素是关系中的元组,通常用t来表示:
当n = 1时,称该关系为单元关系,或一元关系
当n = 2时,称该关系为二元关系
关系是笛卡尔积的有限子集,n木关系必有n个属性
若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码。候选码的诸属性称为主属性,不包含任何候选码中的属性称为非主属性或者非码属性
在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性是这个关系模式的候选码,称为全码
一般来说,的笛卡尔积是没有实际语义的,只有它的某个真子集才有实际含义
关系可以有三种类型
1.基本关系(通常又称为基本表或基表)
它是实际存在的表,是实际存储数据的逻辑表示
2.查询表
它是结果查询对应的表
3.视图表
它是由基本表或其他视图导出的表,是虚表,不对应实际存储的数据
由于笛卡尔积不满足交换律,所以
当关系作为关系数据模型的数据结构时,需要给予如下的限定和扩充
1.无限关系在数据库系统之中是无意义的。因此,限定关系数据模型中的关系必须是有限集合
2.通过为关系的每个列附加一个属性名的方法取消关系属性的有序性
因此,基本关系具有以下6条性质:
1.列是同质的,即每一列中的分量是同一类型的数据,来自同一个域
2.不同的列可出自同一个域,称其中的每一列为一个属性,不同的属性要给予不同的属性名
3.列的顺序无所谓,即列的次序可以任意交换
4.任意两个元组的候选码不能取相同的值
5.行的顺序无所谓,即行的次序可以任意交换
6.分量必须取原子值,即每一个分量都必须是不可分的数据项
关系模型要求关系必须是规范化的,即要求关系必须满足一定的规范条件,这些规范条件中最基本的一条就是,关系的每一个分量必须是一个不可分的数据项,规范化的关系简称为范式
关系模式
关系数据库中,关系模式是型,关系是值,关系模式是对关系的描述
关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪儿些属性构成,这些属性来自哪儿些域,以及属性与域之间的映像关系
如果两个元组的主码相等,那么元组的其他值也一定相等,因为主码唯一标识一个元组,住吗相等就表示这是同一个元组
关系的描述称为关系模式,可以形象化的表示为
R为关系名
U为组成该关系名的属性名的集合
D为U中属性所来自的域
DOM为属性向域的映像集合
F为属性间数据的依赖关系集合
关系是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断更新着数据库中的数据
关系数据库
在关系模型中,实体与实体间的联系都是可以用关系来表示的。在一个给定的应用领域中,所有关系的集合构成一个关系数据库,关系数据库也有型的值之分,关系数据库的型称为关系模式,关系数据库的值是这些关系模式在某一时刻对应的关系的集合
关系模型的存储结构
我们已经知道,在关系数据模型中实体及实体间的联系都用表来表示,但表是关系数据的逻辑模型。在关系数据库的物理组织中,有的关系数据库管理系统中一个表对应一个操作文件,将物理组织交给操作系统完成;有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理
关系操作
基本的关系操作
关系模型中常用的关系操作包括查询操作和插入、删除、修改操作两大部分
关系的查询表达能力很强,是关系操作中最主要的部分。查询操作又可以分为选择、投影、连接、除、并、差、交、笛卡尔积等,其中选择、投影、并、差、笛卡尔积是5中基本操作
关系操作的特点是集合操作方式,即操作对象和结果都是集合,这种操作方式也成为一次一集合的方式,相应地,非关系数据模型的数据操作方式则为一次一记录的方式
关系数据的语言分类
关系数据语言
1.关系代数语言(ISBL)
2.关系演算语言
元组的关系演算语言(ALPHA、QUEL)
域关系演算语言(QBE)
3.具有关系代数和关系演算双重特点的语言(SQL)
早期的关系操作能力通常用代数方式或逻辑方式来表示,分别称为关系代数和逻辑演算。关系代数用对关系的运算来表达查询要求,关系演算则用谓词来表达查询要求。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算
关系代数、元素关系演算和域关系演算均是抽象的结构化查询语言,这些抽象的语言与具体的关系数据库管理系统中实现的实际语言并不完全一样。但他们能用作评估实际系统中查询语言能力的标准或基础
另外,还有一种介于关系代数和关系演算之间的结构化查询语言。SQL不仅具有丰富的拆线呢功能,而且具有数据定义和数据控制功能,是集查询、数据定义语言、数据操纵语言和数据控制语言于一体的关系数据语言
SQL是一种高度非过程化的语言,用户不必请求数据库管理员为其建立的特殊存取路径,存取路径的选择由关系数据库管理系统的优化机制来完成
关系数据库管理系统中研究和开发了查询优化方法,系统可以自动选择较优的存取路径,提高查询效率
关系的完整性
关系模型的完整性规则是对关系的某种约束条件,也就是说关系的值随着时间变化时应该满足一些约束条件。这些约束条件实际上是现实世界的要求。任何关系在任何时刻都要满足这些语义约束
关系模型有三类完整性约束:实体完整性、参照完整性和用户自定义完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,用户定义的完整性是应用领域需要遵循的约束条件按,体现了具体领域中的语义约束
实体完整性
若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值,所谓的空值就是“不知道”或“不存在”或“无意义”的值
1.实体完整性是针对基本关系而言的
2.现实世界中的实体是可区分的,即他们具有某种唯一性标识
3.相应地,关系模型中以住吗作为唯一性标识
4.主码中的属性即主属性不能取空值
参照完整性
设F是基本关系R的一个或一组属性,但不是关系R的码,是基本关系S的主码,如果F与翔对应,则称F是R的外码,并称基本关系R为参照关系,基本关系S为被参照关系或目标关系
外码不一定要与相应的主码同名,不过在实际应用中为了方便识别,当外码与相应的主码属于不同关系时,往往给他们取相同的名字
参照完整性规则
若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须
1.或者取空值(F的每个属性值均为空值)
2.或者等于S中某个元素在主码值
用户自定义完整性
用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所设计的数据必须满足的语义要求
关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询
关系代数常用的运算符包含两大类:集合运算符和专门的关系运算符
运算符 | 含义 | |
---|---|---|
集合运算符 | ∪ | 并 |
- | 差 | |
∩ | 交 | |
× | 笛卡尔积 | |
专门的关系运算符 | σ | 选择 |
π | 投影 | |
⋈ | 连接 | |
÷ | 除 |
传统的集合运算
传统的集合运算是二目运算,包括并、差、交、笛卡尔积4种运算
设关系R和关系S具有相同的目n(即两个关系都有n个属性),且相应的属性取自同一个域,t是元组变量,t∈R表示t是R的一个元组
1.并
2.差
3.交
4.笛卡尔积
专门的关系运算
专门的关系运算包括选择、投影、链接、除运算等
选择
选择又称为限制,它是在关系R种选择满足给定条件的诸元组,是从行的角度进行的运算
投影
关系R上的投影是从R种选择出若干属性列组成新的关系,是从列的角度进行的运算
投影之后不仅取消了原属性种的某些列,而且还可能取消某些元组,因为取消了某些属性列之后,就可能出现重复行,应取消这些完全相同的行
连接
连接是从两个关系的笛卡尔积种选取属性间满足一定条件的元组
连接运算中有两种最为重要也最为常用的连接,一种是等值连接,另一种是自然连接
等值连接是从关系R与S的广义笛卡尔积中选取A、B属性值相等的那些元组
自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中八重复的属性列去掉
一般的连接操作是从行的角度进行运算,但自然连接还需要取消重复列
两个关系R和S在做自然连接时,选择两个关系在公共属性上值相等的元组构成新的关系。此时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃的,同样,S中某些元组也可能被舍弃。这些被舍弃的元组称为悬浮元组
如果把悬浮元组也保存在结果关系中,而在其他属性上填空值,那么这种连接就叫做外连接;如果只保留左边关系R中的悬浮元组就叫做左外连接;如果只保留右边关系S中的悬浮元组就叫做右外连接
除运算
设关系R除以关系S的结果为T,则T包含所有在R但不再S中的属性及其值,且T的元组与S的元组的所有组合都在R中
除操作是从行和列的角度进行计算
关系代数中,这些运算经有限次复合形成的表达式称为关系表达式关系代数表达式
第三章
结构化查询语言是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。其功能不仅仅是查询,而是包括数据库模式创建、数据库数据的插入与修改、数据库安全性完整性定义与控制等一系列功能。
SQL概述
SQL的产生与发展
目前,没有一个数据库系统能够支持SQL标准的所有概念和特性。同时,许多软件厂商对SQL的基本命令集还进行了不同程度的扩充和修改,又可以支持标准以外的一些功能特性。
SQL的特点
SQL集数据查询、数据操纵、数据定义和数据控制功能与一体,主要包括以下几个部分:
综合统一
1.模式数据定义语言
2.外模式数据定义语言
3.数据存储有关的描述语言
4.数据操纵语言
高度非过程化
用SQL进行数据操作是,只要提出“做什么”,而无需指出“怎么做”,因此无需了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。大大减轻了用户负担,有利于提高数据独立性。
面向集合的操作方式
以同一种语法结构提供多种使用方式
语言简洁、易学易用
SQL的基本概念
支持SQL的关系数据库管理系统同样支持关系数据库三级模式结构。
用户可以用SQL对基本表和视图进行查询或其他操作,基本表和视图一样,都是关系。
基本表是本身独立存在的表,在关系数据库管理系统中一个关系就对应一个基本表,一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。
存储文件的逻辑结构组成了关系数据可以的内模式。存储文件的物理结构对最终用户是隐蔽的。
视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据。这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。
学生-课程数据库
Student
学号 Sno | 姓名 Sname | 性别 Sex | 年龄 Sage | 所在系 Sdept |
---|---|---|---|---|
202115121 | 李勇 | 男 | 20 | CS |
202115122 | 刘晨 | 女 | 19 | CS |
202115123 | 王敏 | 女 | 18 | MA |
202115125 | 张立 | 男 | 19 | IS |
Course
课程号 Cno | 课程名 Cname | 先行课 Cpno | 学分 Ccredit |
---|---|---|---|
1 | 数据库 | 5 | 4 |
2 | 数学 | 2 | |
3 | 信息系统 | 4 | 4 |
4 | 操作系统 | 6 | 3 |
5 | 数据结构 | 7 | 4 |
6 | 数据处理 | 2 | |
7 | PASCAL语言 | 6 | 4 |
SC
学号 Sno | 课程号 Cno | 成绩 Grade |
---|---|---|
201215121 | 1 | 92 |
201215121 | 2 | 85 |
201215121 | 3 | 88 |
201215122 | 2 | 90 |
201215122 | 3 | 80 |
数据定义
关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有模式、表、视图和索引等。
操作对象 | 操作方式 | ||
---|---|---|---|
创建 | 删除 | 修改 | |
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个默模式下通常包括多个表、视图和索引等数据库对象。
模式的定义与删除
定义模式
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
如果没有指定<模式名>,那么<模式名>隐含为<用户名> ,要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得了数据库管理员授予的CREATE SCHEMA的权限。
定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象,例如基本表、视图、索引等。
目前在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句,也就是说用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图,定义授权。
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>]
删除模式
DROP SCHEMA <模式名>[<CASCADE>|<RESTRICT>]
其中CASCADE和RESTRICT两者必选起义,选择CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部删除;选择RESTRICT(限制),表示如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。只有当该模式中没有任何下属对象时才能执行DROP SCHEMA语句
基本表的定义、删除与修改
定义基本表
CREATE TABLE <表名> (<列名><数据类型>[列级完整性约束条件],[,<列名><数据类型>[列级完整性约束条件]],...[,<表级完整性约束条件>])
建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由关系数据库管理系统自动检查该操作是否违背这些完整性约束条件。如果完整性约束条件设计该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
参照表和被参照表可以是同一个表
数据类型
数据类型 | 含义 |
---|---|
CHAR(n),CHARACTER(n) | 长度为n的定长字符串 |
VARCHAR(n),CHARACTERVARYING(n) | 最大长度为n的变长字符串 |
CLOB | 字符串大对象 |
BLOL | 二进制大对象 |
INT,INTEGER | 长整数(4字节) |
SMALLINT | 短整数(2字节) |
BIGINT | 大整数(8字节) |
NUMERIC(p,d) | 定点数,由p位数字(不包括符号、小数点)组成,小数点后面有d位数字 |
DECIMAL(p,d),DEC(p,d) | 同NUMERIC |
REAL | 取决于机器精度的单精度浮点数 |
DOUBLE PRECITION | 取决于机器精度的双精度浮点数 |
FLOAT(n) | 可选精度的浮点数,精度至少为n位数字 |
BOOLEAN | 逻辑布尔量 |
DATE | 日期,包含年、月、日,格式为YYYY-MM-DD |
TIME | 时间,包含一日的时、分、秒,格式为HH:MM:SS |
TIMESTAMP | 时间戳类型 |
INTERVAL | 时间间隔类型 |
模式与表
每一个基本表都属于某一个模式,一个模式包含多个基本表。定义基本表时一般可以有三种方法定义它所属的模式:
1.在表名中明显地给出模式名
CREATE TABLE "S-T".Student(...);/*Student所属的模式是S-T*/
2.在创建模式语句中同时创建表
3.设置所属的模式,这样在创建表时不必给出模式名
当用户创建基本表(其他数据库对象也一样)时若没有指定模式,系统根据搜索路径来确定该对象所属的模式,搜索路径包含一组模式列表,关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名。若搜索路径中的模式名都不存在,系统将给出错误。
修改基本表
ALTER TABLE <表名>
[ADD [COLUMN] <新列名><数据类型>[完整性约束]]
[ADD <表级完整性约束>]
[DROP [COLUMN] <列名> [CASCADE|RESTRICT]]
[DROP CONSTRAINT <完整性约束名> [CASCADE|RESTRICT]]
[ALTER COLUMN <列名><数据类型>];
删除基本表
DROP TABLE [CASCADE|RESTRICT];
若选择RESTRICT,则该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK、FOREIGN KEY等约束),不能有视图,不能由触发器,不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除。
若选择CASCADE,则该表的删除没有限制条件,在删除基本表的同时,相关的依赖对象,例如视图,都将被一起删除。
索引的建立和删除
顺序文件上的索引是针对按指定属性值升序或降序的存储关系,在该属性上建立一个顺序索引文件,索引文件由属性值和相应的元组指针组成。
B+树索引是将索引属性组织成B+树形式,B+树的叶节点为属性值和相应的元素指针。B+树索引具有动态平衡的优点。
散列索引是建立若干个桶,将索引属性按照其散列函数映射到相应的桶中,同种存放索引属性值和相应的元素指针。散列索引具有查找速度快的特点。
位图索引是用位向量记录索引属性中可能出现的值,每个位向量对应一个可能值。
索引虽然能够加速数据库的查询,但需要占用一定的存储空间,当基本表更新时,索引要进行相应的维护,这些都会增加数据库的负担,因此要根据实际应用的需要有选择的创建索引。
一般说来,建立与删除索引由数据库管理员或者表的属主负责完成。关系数据库管理系统在执行查询时会自动选择合适的索引作为存储路径,用户不必也不能显式地选择索引。索引时关系数据库管理系统的内部实现技术,属于内模式的范畴。
建立索引
CREATE [UNIQUE][CLUSTER] INDEX <索引名>
<表名>是要建索引的基本表的名字。索引可以建立在该表的一列或多列上,各列之间用逗号分隔。每个<列名>后面还可以用<次序>指定索引值的排列次序,可选ASC或者DESC,默认为ASC。
UNQIUE表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER表示要建立的索引是聚簇索引。
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>
删除索引
DROP INDEX <索引名>
数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。在查询优化和查询处理时,数据字典中的信息是其重要依据。
数据查询
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...
FROM <表名或视图名> [,<表名或视图名>]|(SELECT语句)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING <条件表达式>]]
[GROUP BY<列名2>[ASC|DESC]]
如果GROUP BY子句带HAVING语句,则只有满足指定条件的组才予以输出。
如果有ORDERED BY子句,则结果表还要按<列名2>的值进行升序或者降序排序
单表查询
单表查询是指仅涉及一个表的查询。
查询表中的若干列
1.查询指定列
2.查询全部列(<目标列表达式>为*或者全部列名)
3.查询经过计算的值(<目标列表达式>也可以是算术表达式、字符串常量、函数等)
选择表中的若干元组
1.消除取值重复的行(DISTINCT)
2.查询满足条件的元组
查询条件 | 谓词 |
---|---|
比较 | >、<、=、>=、<=、!=、<>、!>、!<;NOT加上述比较运算符 |
确定范围 | BETWEEN AND、NOT BETWEEN AND |
确定集合 | IN、NOT IN |
字符匹配 | LIKE、NOT、LIKE |
空值 | IS NULL、NOT NULL |
多重条件(逻辑运算) | AND、OR、NOT |
BETWEEN后面是范围的下限,AND后是范围的上限
字符串的匹配
[NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>']
其含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有通配符%和_,%代表任意长度(长度可以为0的字符串)的字符串,例如a%b表示以a开头,b结尾的任意长度的字符串。_表示任意单个字符。
OEDERED BY子句
用户可以用OEDERED BY子句对查询结果按照一个或者多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。
对于空值,排序时显示的次序由具体系统实现来决定。例如按升序排序,含空值的元组最后显示;按降序排,空值的元组则最先显示。
聚集函数
COUNT(*)
COUNT([DISTINCT|ALL] <列名>)
SUM([DISTINCT|ALL] <列名>)
AVG([DISTINCT|ALL] <列名>)
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为默认值),则表示不取消重复列。
当聚集函数遇到空值时,除COUNT(*)外,都要跳过空值只处理非空值。
聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。
GROUP BY子句
将查询结果按某一列或多列的值分组,值相等的为一组。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。
WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。
连接查询
若一个查询同时涉及两个以上的表,则称之为连接查询。
等值于非等值连接查询
连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,当连接条件为=时,为等值连接,否则为非等值连接。连接谓词中的列名为连接字段,连接条件中的各连接字段类型必须是可比的,但名字不必相同。
若在等值连接中把目标列中重复的属性去掉则为自然连接。
自身链接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身链接。
外连接
左外连接列出左边关系中所有的元组,右外连接列出右边关系中所有的元组。
多表连接
连接操作除了可以是两表连接、一个表与其自身连接,还可以是两个以上的表进行连接,后者称为多表连接。
嵌套查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询称为嵌套查询。
上层的查询块称为外查询或父查询,下层的查询块称为内层查询或者子查询。
子查询的SELECT语句中不能使用ORDERED BY子句,ORDERED BY子句只能对最终查询结果排序。
嵌套查询使用户可以用多个简单查询构成复杂的查询,从而增强SQL的查询能力,以层层嵌套的方式来构造程序正式SQL中"结构化"的含义所在。
带有IN谓词的子查询
子查询的查询条件依赖于父查询称为相关子查询,子查询的查询条件不依赖于父查询称为不相关子查询,整个查询语句称为相关嵌套查询语句。
有些嵌套查询可以用连接运算代替,有些是不能代替的。
带有比较运算符的子查询
带有比较运算符的子查询是指父查询于子查询之间用比较运算符进行连接。当用户能确切知道内层查询返回的是单个值时,可以用>、<、=、>=、<=、!=或<>等比较运算符。
带有ANY(SOME)或ALL谓词的子查询
>ANY | 大于子查询结果中的某个值 |
---|---|
>ALL | 大于子查询结果中的所有值 |
<ANY | 小于子查询结果中的某个值 |
<ALL | 小于子查询结果中的所有值 |
>=ANY | 大于等于子查询结果中的某个值 |
>=ALL | 大于等于子查询结果中的所有值 |
<=ANY | 小于等于子查询结果中的某个值 |
<=ALL | 小于等于子查询结果中的所有值 |
=ANY | 等于子查询结果中的某个值 |
=ALL | 等于子查询结果中的所有值 |
!=(或<>)ANY | 不等于子查询结果中的某个值 |
!=(或<>)ALL | 不等于子查询结果中的所有值 |
事实上,用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高。=ANY等价于IN,<ANY等价于<MAX,<>ALL等价于NOT IN,<ALL等价于<MIN。
带有EXISTS谓词的子查询
EXISTS代表存在量词∃。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。
集合查询
集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT。注意:参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。
使用UNION将多个查询结果合并起来时,系统会自动去掉重复元组,如果要保留重复元组则用UNION ALL操作。
基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表称为主查询的查询对象。
需要说明的是,通过FROM子句生成派生表时,AS关键字可以省略,但必须为派生关系指定一个别名。而对于基本表,别名是可选择项。
SELECT语句的一般格式
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...
FROM <表名或视图名> [,<表名或视图名>]|(SELECT语句)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING <条件表达式>]]
[GROUP BY<列名2>[ASC|DESC]]
目标列表达式的可选格式
1.*
2.<表命>.*
3.COUNT([DISTINCT|ALL] * )
4.[<表名>.]<属性列名表达式>[,[<表名>.]<属性列名表达式>]...
其中,<属性名表达式>可以是由属性列、作用于属性列的聚集函数和常量的任意算数运算(+,-,*,/)组成的运算公式。
聚集函数的一般格式
COUNT [DISTINCT|ALL] <列名>
SUM [DISTINCT|ALL] <列名>
AVG [DISTINCT|ALL] <列名>
MAX [DISTINCT|ALL] <列名>
MIN [DISTINCT|ALL] <列名>
WHERE子句的条件表达式的可选格式
1.<属性列名>θ<属性列名><属性列名>θ<常量><属性列名>θ[ANY|ALL](SELECT语句)
2.<属性列名> [NOT] BETWEEN <属性列名> AND <属性列名><属性列名> [NOT] BETWEEN <常量> AND <常量><属性列名> [NOT] BETWEEN (SELECT语句) AND (SELECT语句)
3.<属性列名> [NOT] IN (<值1>,[,<值2>]...)<属性列名> [NOT] IN (SELECT语句)
4.<属性列名> [NOT] LIKE <字符串>
5.<属性列名> IS [NOT] NULL
6.[NOT] EXISTS (SELECT语句)
7.<条件表达式> AND <条件表达式> AND <条件表达式>...<条件表达式> OR <条件表达式> OR <条件表达式>...
数据更新
插入数据
1.插入元组
INSERT
INTO <表名> [(<属性列1> [,<属性列2>]...)]
VALUES(<常量1> [,<常量2>]...);
INTO子句中没有出现的属性列,心猿族在这些列上将取空值。但必须注意的是,在表定义时说明了NOT NULL的属性列不能取空值,否则会出错。
如果INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。
字符串常熟 要用单引号(英文符号)括起来。
2.插入子查询结果
INSERT
INTO <表名> [(<属性列1> [,<属性列2>...])
子查询;
修改数据
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]...
[WHERE<条件>];
1.修改某一个元组的值
2.修改多个元组的值
3.带子查询的修改语句
删除数据
DELETE
FROM <表名>
[WHERE <条件>];
1.删除某一个元组的值
2.删除多个元组的值
3.带子查询的删除语句
空值的处理
所谓空值就是“不知道”或“不存在”或“无意义”的值。
1.空值的产生
外连接也会产生空值,空值的关系运算也会产生空值。
2.空值的判断
用IS NULL和IS NOT NULL来表示。
3.空值的约束条件
属性定义(或者域定义)中有NOT NULL约束条件的不能取空值,加了UNIQUE限制的属性不能取空值。
4.空值的算数运算、比较运算和逻辑运算
x | y | x AND y | x OR y | NOT x |
---|---|---|---|---|
T | T | T | T | F |
T | U | U | T | F |
T | F | F | T | F |
U | T | U | T | U |
U | U | U | U | U |
U | F | F | U | U |
F | T | F | T | T |
F | U | F | U | T |
F | F | F | F | T |
视图
视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
视图一经定义,就和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。
定义视图
建立视图
CTRATE VIEW <视图名> [(<列名> [,<列名>])]
AS <子查询>
[WITH CHECK OPTION];
WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。
组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各个属性名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成,但在下列三种情况下必须明确指定组成视图的所有列名:
1.某个目标列不是单纯的属性名,而是聚集函数或列表达式
2.多表连接是选出了几个同名列作为视图的字段
3.需要在视图中为某个列启用新的更合适的名字
关系数据库管理系统执行CREATE VIEW语句的结果只是把视图的定义存入数据字典,并不执行其中的SELECT语句,只是在对视图查询时,才按视图的定义从基本表中将数据查出。
若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和列,且保留了主码,则称这类视图为行列子集视图。
视图不仅可以建立在单个基本表上,也可以建立在多个基本表上。
视图不仅可以建在一个或多个基本表上,也可以建立在一个或多个已经定义好的视图上,或建立在基本表与视图上。
定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据通过各种计算派生出的数据一般是不存储的。带虚拟列的视图也称为带表达式的视图。
带有聚集函数和GROUP BY子句的查询来定义视图,这种视图称为分组视图。
修改视图的方式为:为了避免映像关系被破坏,最好在修改基本表之后删除由该基本表导出的视图,然后重建这个视图。
删除视图
DROP VIEW <视图名> [CASCADE];
视图删除后视图的定义将从数据字典中删除。如果该视图上还导出了其他视图,则使用CASCADE级联删除语句把该视图和由它导出的所有视图一起删除了。
基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图的定义没有从字典中清除,删除这些视图定义需要显式地使用DROP VIEW语句。
查询视图
关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则总数据字典中取出视图的定义,把定义中的子查询 和用户的查询结合起来,转换称等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解。
在一般情况下,视图查询的转换是直截了当的。但有些情况下,这种转换不能直接进行,查询时会出现问题,例如:WHERE子句中是不能用聚集函数作为条件表达式的,此种无法转换。
目前多数关系数据库系统对行列子集视图的查询均能进行正确转换,但对非行列子集视图的查询就不一定能做转换了。
但定义视图并查询视图与基于派生表的查询是有区别的。视图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接引用该视图。而派生表只是在语句执行时临时定义,语句执行后该定义即被删除。
更新视图
更新视图是指通过视图来插入、删除和修改数据。
由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作。
为防止用户通过视图对数据进行增加、删除、修改时,有意无意的对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHEKC OPTION子句。这样在视图上增、删、改数据时,关系数据库管理系统会检查视图定义中的条件,若不能满足条件则拒绝执行该操作。
在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。
一般地,行列子集视图是可更新的。除行列子集视图外,有些视图理论上是可更新的,但它们的确切特征还是尚待研究的课题,还有些视图从理论上就是不可更新的。
目前,各个关系数据库管理系统一般都只允许对行列子集视图进行更新,而且各个系统对视图的更新还有更进一步的规定。
应该指出的是:不可更新的视图与不允许更新的视图是两个不同的概念。前者指理论上已经证明其是不可更新的视图,后者指实际系统中不支持其更新,但它本身可能是可更新的视图。
视图的作用
1.视图能够简化用户的操作
2.视图时用户能以多种角度看待统一数据
3.视图对重构数据库提供了一定程度的逻辑独立性
4.视图能够对机密数据提供安全保护
5.适当利用视图可以更清晰的表达查询