数据库原理
绪论
1.1 数据库系统概述
1.1.1 数据库基本概念
-
数据(data):描述事务的符号记录
数据库中存储的 基本对象
数据的含义称为数据的语义,数据与其语义是不可分的
-
数据库(DB):长期存储在计算机内、有组织的、可共享的大量数据的集合
特点:
-
永久存储
-
有组织
-
可共享
数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
-
-
数据库管理系统(DBMS):位于用户和操作系统之间的一层数据库管理软件
主要功能:
(1)数据定义功能
(2)数据组织、存储和管理
(3)数据操纵功能
(4)数据库的事务管理和运行功能
(5)数据库的建立和维护功能
数据库管理系统和操作系统一样是计算机的基础软件。
- 数据库系统(DBS):数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员和用户组成的存储、管理、处理和维护数据库的系统
1.1.2 数据管理技术的产生和发展
数据管理:对数据进行分类、组织、编码、存储、检索和维护,它是数据处理和分析的中心问题
数据处理:对各种数据进行收集、存储、加工和传播的一系列活动总和
- 人工管理阶段
特点:
-
数据不保存
-
应用程序管理数据
-
数据不共享
-
数据不具有独立性
- 文件系统阶段
特点:
- 数据可以长期保存
- 由文件系统管理数据
- 数据共享性差、冗余度大(缺)
- 数据独立性差(缺)
-
数据库系统阶段
从文件系统到数据库系统标志着数据库管理技术的飞跃
1.1.3 数据库系统的特点
1. 数据结构化
数据库系统实现整体数据的结构化,这是数据库的主要特征之一,也是数据库系统区别与文件系统的本质区别
整体结构化
- 数据库不再仅仅针对某一应用,而是面向整个组织或企业
- 不仅内部是结构化的,而且整体是结构化的,数据之间具有联系
2. 数据的共享性高、冗余度低且易扩充
- 数据共享可以大大减少数据冗余,节约存储空间
- 数据共享还能避免数据之间的不相容性与不一致性(副本不一样)
- 不仅可以被多个应用共享使用,而且容易增加新的应用,使得数据库系统弹性大,易于扩充
3. 数据独立性高
数据独立性:表示应用程序与数据库中存储的数据不存在依赖关系
物理独立性:用户的应用程序与数据库中的数据的物理存储是相互独立的
- 数据的物理存储改变时应用程序不用改变
逻辑独立性:用户的应用程序与数据库的逻辑结构是相互独立的
- 数据的逻辑结构改变时应用程序不用改变
数据独立性是由数据库管理系统提供的二级映像功能保证的
4. 数据由数据库管理系统统一管理
数据库管理系统提供的数据控制功能
- 数据的安全性保护:保护数据以防止不合法使用造成数据泄密和破坏
- 数据的完整性检查:数据的正确性、有效性和相容性
- 并发控制:对多用户的并发操作加以控制和协调,防止相互干扰而得到错误的结果
- 数据库恢复:将数据库从错误状态恢复到某一已知的正确状态
简答
数据管理的文件系统和数据库系统阶段 “ 数据独立性 ” 有何不同?
- 文件系统中数据被组织成相互独立的数据文件,程序按照文件名访问数据,“ 数据独立性 ”是一种 “ 设备独立性 ”
- 数据库系统的 “ 数据独立性 ” 包括 “ 物理独立性 ” 和 “ 逻辑独立性 ”,物理独立性是指。。。。逻辑独立性是指。。。
1.2 数据模型
- 数据模型是对现实世界数据特征的抽象
- 数据模型是用来描述数据、组织数据和对数据进行操作的
- 数据模型是数据库系统的核心和基础
- 数据模型应满足三方面要求:能比较真实地模拟现实世界、容易为人所理解、便于在计算机上实现。
1.2.1 两类数据模型
根据模型应用的不同目的,将模型划分为两大类:概念模型、逻辑模型和物理模型。
- 概念模型(信息模型):按用户的观点来对数据和信息建模,用于数据库设计
- 逻辑模型:主要包括层次模型、网状模型、关系模型、面向对象数据模型和对象关系数据模型、半结构化数据模型等。它是按计算机系统的观点对数据建模,用于数据库管理系统的实现
- 物理模型:对数据最底层的抽象,它描述数据在系统内部的表示方式和存取方法,或在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的
1.2.2 概念模型 E-R图
基本概念
- 实体:客观存在并可相互区别的事务。实体可以是具体的人、事、物,也可以是抽象的概念或联系
- 属性:实体所具有的某一特性
- 码:唯一标识实体的属性集
- 实体型:用实体名及其属性名集合来抽象和刻画同类实体
- 实体集:同一类型实体的集合
- 实体之间的联系:包括实体(型)内部的联系和实体(型)之间的联系。实体内部的联系通常是指组成实体的各属性之间的联系,实体之间的联系通常是指不同实体集之间的联系。实体之间的联系有一对一、一对多和多对多等多种类型
概念模型的一种标识方法:实体 - 联系方法
数据库的概念模型独立于具体的机器和数据库管理系统
- 实体 - 联系方法:用ER图来描述现实世界
1.2.3 数据模型及其的组成要素
数据模型的三个要素:数据结构、数据操作和数据的完整性约束条件(integrity constraints)
- 数据结构
- 数据结构描述数据库的组成对象以及对象之间的联系
- 描述的内容
- 一类是与对象的类型、性质、内容有关
- 一类是与数据之间的联系有关的对象
- 数据结构所描述的对象类型的集合,是对系统静态特性的描述
- 数据操作
- 数据操作是指对数据库中的各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则
- 数据操作的类型:查询和更新(插入、删除、修改)
- 数据模型必须定义这些操作的确切含义、操作符号、操作规则(优先级)以及实现操作的语言
- 数据操作是对系统动态特性的描述
- 数据的完整性约束条件
- 数据完整性约束条件是一组完整性规则
- 完整性规则:给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容
- 数据模型应该反映和规定其必须遵守的基本的和通用的完整性约束条件,应该提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件
1.2.4 常用的数据模型
- 层次模型
- 网状模型
- 关系模型
- 面向对象数据模型
层次模型和网状模型是格式化模型
基本层次联系是指两个记录以及它们之间的一对多(包括一对一)的联系。
1.2.5 层次模型
- 层次模型是数据库系统最早出现的数据模型
- 层次模型用树形结构来表示各类实体以及实体间的联系
- 层次模型的数据结构
满足以下条件称为层次模型
- 有且仅有一个结点没有双亲结点,这个结点是根节点
- 根节点以外的其他结点仅有一个双亲结点
层次模型的基本特点
- 任何给定的记录值只能按其层次路径查看,没有一个子女记录值能够脱离双亲记录值而独立存在
- 层次模型的数据操纵与完整性约束
层次模型的数据操纵主要有:查询、插入、删除、更新
层次模型完整性约束条件
-
无相应的双亲结点值就不能插入子女结点值
-
如果删除双亲结点值,则相应的子女结点值也被同时删除
-
更新操作时,应更新所有相应记录,以保证数据的一致性
- 层次模型的优缺点
层次模型的优点
- 层次模型的数据结构比较简单清晰
- 层次数据库的查询效率高
- 层次模型提供了良好的完整性支持
层次模型的缺点
- 现实世界中很多联系是非层次性的,层次模型不能自然地表示这类联系
- 对插入和删除操作的限制比较多,应用程序的编写比较复杂
- 查询子女结点必须通过双亲结点
- 层次命令趋于程序化
1.2.6 网状模型
- 网状模型的数据结构
满足下面两个条件的基本层次联系的集合为网状模型:
-
允许一个以上的结点无双亲
-
一个结点可以有多于一个的双亲
- 层次模型中子女结点与双亲结点的联系是唯一的,而在网状模型中这种联系可以不唯一
- 网状模型的数据操纵与完整性约束
网状数据库系统(如 DBTG)对数据操纵加了一些限制,提供了一定的完整性约束
-
支持记录码的概念,码即唯一标识记录的数据项的集合
-
保证一个联系中双亲记录与子女记录之间是一对多的联系
-
可以支持双亲记录和子女记录之间的某些约束条件
- 网状模型的优缺点
网状模型的优点
- 能够更为直接地描述现实世界
- 具有良好的性能,存取效率较高
网状模型的缺点
- 结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌握
- 网状数据库的数据定义语言、数据操纵语言比较复杂,要求用户掌握数据库结构和存取路径,不容易使用
- 记录之间的联系是通过存取路径实现的,用户必须了解系统结构的细节
1.2.7 关系模型
- 关系模型的数据结构
- 关系:一个关系对应通常说的一张表
- 元组:表中的一行即为一个元组
- 属性:表中的一列即为一个属性,给每一个属性起一个名称即属性名
- 码:也称码键。表中的某个属性组,它可以唯一确定一个元组
- 域:一组具有相同数据类型的值的集合。属性的取值范围来自某个域
- 分量:元组中的一个属性值
- 关系模式:对关系的描述,一般表示为:关系名(属性1,属性2,…,属性n)
关系模型要求关系必须是规范化的,即要求关系满足一定的规范条件
最基本的规范条件:关系的每一个分量必须是一个不可分的数据项, 不允许表中还有表
- 关系模型的数据操纵与完整性约束
- 关系模型的数据操纵:查询、插入、删除、更新
- 关系模型中的数据操作是集合操作,操作对象和操作结果都是关系
- 关系模型把存取路径向用户隐蔽起来,用户只要指出“干什么”或“找什么”,不必详细说明“怎么干”或“怎么找
关系的完整性约束条件:实体完整性、参照完整性、用户定义的完整性
- 关系模型的优缺点
关系模型具有以下优点:
- 关系模型与格式化模型不同,它是建立在严格的数学概念的基础上的
- 关系模型的概念单一,所以其数据结构简单、清晰,用户易懂易用
- 关系模型的存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作
缺点:由于存取路径对用户是隐蔽的,查询效率往往不如格式化数据模型
错题
- 在数据库中,导致数据不一致的根本原因:数据冗余
- 数据库系统支持的数据共享是指:多种语言、多个用户、多个应用相互覆盖地使用同一数据集合
- DD分布式数据库、DBA数据库管理员
- 数据冗余可能导致的问题:浪费存储空间以及修改麻烦、潜在的数据不一致性
1.3 数据库系统的结构
- 从数据库应用开发人员角度看,数据库系统通常采用三级模式结构,这是数据库系统内部的系统结构
- 从数据库最终用户角度看,数据库系统的结构分为单用户结构、主从式结构、分布式结构、客户-服务器、浏览器-应用服务器/数据库服务器多层结构等,这是数据库系统外部的体系结构
1.3.1 数据库系统模式的概念
- 在数据模型中有“型”(type)和“值”(value)的概念。型是指对某一类数据的结构和属性的说明,值是型的一个具体赋值
- 模式是数据库中全体数据的逻辑结构和特征的描述,他仅涉及型的描述,不涉及具体的值
- 模式是相对稳定的,而实例是相对变动的
1.3.2 数据库系统的三级模式映像
- 模式:也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图
- 外模式:也称子模式或用户模式,是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
- 内模式:也称存储模式,是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式
一个数据库仅有一个模式
一个数据库可以有多个外模式。同一外模式可以为某一用户的多个应用程序所使用,但一个应用程序仅能使用一个外模式
一个数据库仅有一个内模式
1.3.3 数据库系统的二级映像功能于数据独立性
数据库系统的三级模式是数据的三个抽象级别。数据库管理系统在这三级模式之间提供了两层映像:外模式/模式映像和模式/内模式映像
- 外模式 / 模式映像
- 模式描述的是数据的全局逻辑结构,外模式描述的是数据的局部逻辑结构。对应于同一个模式可以有任意多个外模式 。对于每一个外模式,数据库系统都有一个外模式/模式映象,它定义了外模式与模式之间的对应关系。这些映象定义通常包含在各自外模式的描述中
- 当模式改变时(如增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外模式/模式的映象作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
- 模式 / 内模式映像
- 数据库中只有一个模式,也只有一个内模式,所以数据库中模式/内模式映象是唯一的。它定义了数据全局逻辑结构与存储结构之间的对应关系。该映象定义通常包含在模式描述中
- 当数据库的存储结构改变时(如选用了另一种存储结构),由数据库管理员对模式/内模式映象作相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,简称数据的物理独立性
数据库模式即全局逻辑结构是数据库的中心与关键,它独立于数据库的其他层次。因此设计数据库模式结构时应首先确定数据库的逻辑模式
数据库的内模式依赖于它的全局逻辑结构,但独立于数据库的用户视图,即外模式,也独立于具体的存储设备。它是将全局逻辑结构中所定义的数据结构及其联系按照一定的物理存储策略进行组织,以达到较好的时间与空间效率
数据库的外模式面向具体的应用程序,它定义在逻辑模式之上,但独立于存储模式和存储设备。当应用需求发生较大变化,相应外模式不能满足其视图要求时,该外模式就得做相应改动,所以设计外模式时应充分考虑到应用的扩充性
数据与程序之间的独立性使得数据的定义和描述可以从应用程序中分离出去。由于数据的存取由数据库管理系统管理,从而简化了应用程序的编制,大大减少了应用程序的维护和修改
1.4 数据库系统的组成
- 硬件平台及数据库
要求:
- 要有足够大的内存,存放操作系统、数据库管理系统的核心模块、数据缓冲区和应用程序
- 有足够大的磁盘或磁盘阵列等设备存放数据库,有足够大的磁带(或光盘)作数据备份
- 要求系统有较高的通道能力,以提高数据传送率
- 软件
数据库系统的软件主要包括:
- 数据库管理系统
- 支持数据库管理系统运行的操作系统
- 具有与数据库接口的高级语言及其编译系统,便于开发应用程序
- 以数据库系统为核心的应用开发工具
- 为特定应用环境开发的数据库应用系统
- 人员
(1)数据库管理员: 全面负责管理和控制数据库系统
- 决定数据库的信息内容和结构
- 决定数据库的存储结构和存取策略
- 定义数据的安全性要求和完整性约束条件
- 监控数据库的使用和运行
- 数据库系统的改进和重组重构
(2)系统分析员:负责应用系统的需求分析和规范说明,要和用户及数据库管理员相结合,确定系统的硬件软件配置,并参与数据库系统的概要设计
(3)数据库设计人员:负责数据库中数据的确定和数据库各级模式的设计。数据库设计人员必须参加用户需求调查和系统分析,然后进行数据库设计
(4)应用程序员:负责设计和编写应用系统的程序模块,并进行调试和安装
(5)最终用户:通过应用系统的用户接口使用数据库
- 偶然用户
- 简单用户
- 复杂用户
2 关系数据库
2.1 关系数据结构及形式化定义
2.1.1 关系
-
单一的数据结构 - 关系
现实世界的实体以及实体间的各种联系均用关系表示 -
逻辑结构 - 二维表
从用户角度,关系模型中数据的逻辑结构是一张扁平的二维表 -
建立在集合代数的基础上
- 域
定义:域是一组具有相同数据类型的值的集合
- 笛卡尔积
一个域允许的不同取值个数称为这个域的基数
- 关系
- 候选码:关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码
- 主码:若一个关系有多个候选码,则选定其中一个为主码
- 主属性:候选码的诸属性称为主属性
- 非主属性:不包含在任何侯选码中的属性
- 全码:最极端的情况下,关系模式的所有属性是这个关系模式的候选码
关系可以有三种类型:基本关系(基本表或基表)、查询表和视图表
- 基本表:实际存在的表,是实际存储数据的逻辑表示
- 查询表:查询结果对应的表
- 视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
基本关系(基本表)的性质:
- 列是同质的,即每一列中的分量是同一类型的数据,来自同一个域
- 不同的列可出自同一个域,其中的每一列称为一个属性,不同的属性要给予不同的属性名
- 列的顺序无所谓,即列的次序可以任意交换
- 任意两个元组的候选码不能取相同的值
- 行的顺序无所谓,即行的次序可以任意交换
- 分量必须取原子值,即每一个分量都必须是不可分的数据项(最基本的一条)
2.1.2 关系模式
什么是关系模式
- 关系数据库中,关系模式是型,关系是值。关系模式是对关系的描述
- 关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映像关系。同时,关系模式应当刻画出完整性约束条件
定义关系模式
定义:关系的描述称为关系模式(relation schema),它可以形式化地表示为 R(U,D, DOM, F),其中R 为关系名, U为组成该关系的属性名集合,D 为 U 中属性所来自的域,DOM 为属性向域的映像集合, F为属性间数据的依赖关系集合
关系模式通常可以简记为 R(U)或 \(R(A_1,A_2,A_3....)\),其中R 为关系名,\(A_n\)为属性名。
关系模式与关系
- 关系是关系模式在某一时刻的状态或内容
- 关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因此关系操作在不断地更新着数据库中的数据
2.1.3 关系数据库
在一个给定的应用领域中,所有关系的集合构成一个关系数据库
- 关系数据库的型:关系数据库模式,是对关系数据库的描述
- 关系数据库的值:关系模式在某一时刻对应的关系的集合,通常称为关系数据库
2.1.4 关系模型的存储结构
关系数据库的物理组织
- 有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成
- 有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理
2.2 关系操作
2.2.1 基本关系的操作
- 查询操作:选择(select)、投影(project)、连接(join)、除(divide)、并(union)、差(except)、交(interaction)、笛卡尔积
- 数据更新:插入(insert)、删除(delete)、修改(update)
- 基本操作:选择、投影、并、差、笛卡尔积
关系操作的特点是集合操作方式,即操作的对象和结果都是集合。这种操作方式也称为一次一集合的方式
非关系数据模型的数据操作方式为一次一记录的方式
2.2.2 关系数据语言的分类
SQL(Structured Query Language)是集查询、数据定义语言、数据操纵语言和数据控制语言于一体的关系数据语言
2.3 关系的完整性
关系模型中有三类完整性约束:实体完整性(entity integrity)、参照完整性(referential integrity)和用户定义的完整性(user-defined integrity)
- 实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持
- 用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束
2.3.1 实体完整性
实体完整性规则
若属性A是基本关系R的主属性,则属性A不能取空值(null value)。空值就是“不知道”、“不存在”或“无意义”的值
说明:
- 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。例如学生关系对应于学生的集合
- 现实世界中的实体是可区分的,即它们具有某种唯一性标识。例如每个学生都是独立的个体,是不一样的
- 相应地,关系模型中以主码作为唯一性标识
- 主码中的属性即主属性不能取空值。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第 2 点相矛盾,因此这个规则称为实体完整性
2.3.2 参照完整性
定义:设 F 是基本关系 R 的一个或一组属性,但不是关系 R 的码,\(K_s\) 是基本关系 S 的主码。如果 F 与 \(K_s\) 相对应,则称 F 是 R 的外码(foreign key),R 基本关系 称为参照关系(referencing relation),基本关系 S 称为被参照关系(referenced relation)或目标关系(target relation)
- 关系 R 和 S 不一定是不同的关系
- 目标关系 S 的主码\(K_s\) 和参照关系 R 的外码 F 必须定义在同一个(或一组)域上
- 外码不一定要与相应的主码同名。在实际应用中为了便于识别,当外码与相应的主码属于不同关系时,往往给它们取相同的名字
参照完整性
若属性 (或属性组)F 是基本关系 R 的外码,它与基本关系 S 的主码 \(K_s\) 相对应(基本关系R 和S 不一定是不同的关系),则对于 R 中每个元组在 F 上的值必须为:
- 或者取空值(F 的每个属性值均为空值)
- 或者等于 S 中某个元组的主码值
2.3.3 用户定义完整性
用户定义的完整性
- 针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
- 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需由应用程序承担这一功能
2.4 关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询
关系代数的运算对象和运算结果都是关系
关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类
传统的集合运算将关系看成元组的集合,其运算是从关系的“水平”方向,即行的角度来进行;专门的关系运算不仅涉及行,而且涉及列
2.4.1 传统的集合运算
传统的集合运算是二目运算,包括并、差、交、笛卡尔积
-
并
-
差
-
交
-
笛卡尔积
2.4.2 专门的关系运算
专门的关系运算包括选择、投影、连接、除运算等
- 选择
- 投影
- 连接
等值连接:
自然连接:是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉
- 除运算
设关系 R 除以关系 S 的结果为关系 T ,则 T 包含所有在 R 但不在 S 中的属性及其值,且 T 的元组与 S 的元组的所有组合都在 R 中
- 除操作是同时从行和列角度进行运算
关系代数中,这些运算经有限次复合后形成的表达式称为关系代数表达式
错题
- 五种基本操作:并、差、笛卡尔积、选择、投影
- 四种组合操作:交、连接、自然连接、除
- 笛卡尔积是向关系的水平方向进行运算
- 等值连接与自然连接的区别和联系
- 自然连接一定是等值连接,但等值连接不一定是自然连接
- 等值连接要求相等的分量,不一定是公共属性;而自然连接要求相等的分量必须是公共属性
- 等值连接不把重复的属性除去;而自然连接要把重复的属性除去
-
3. 关系数据库标准语言SQL
3.1 SQL 概述
3.1.1 SQL的产生与发展
目前没有一个数据库系统能够支持SQL标准的所有概念和特性。许多软件厂商对SQL基本命令集还进行不同程度的扩充和修改,又可以支持标准以外的一些功能特性
3.1.2 SQL的特点
SQL集数据查询、数据操纵、数据定义、数据控制功能于一体
- 综合统一性
SQL 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言 (DCL)功能于一体。可以独立完成数据库生命周期中的全部活动:
- 定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库
- 对数据库中的数据进行查询和更新
- 数据库重构和维护
- 数据库安全性、完整性控制,以及事务控制
- 嵌入式 SQL 和动态 SQL 定义
用户在数据库系统投入运行后,还可根据需要随时地、逐步地修改模式, 并不影响数据库的运行
关系模型中实体和实体间的联系均用关系表示,这种数据结构的单一性带来了数据操作符的统一性,查找、插入、删除、更新等每一种操作都只需一种操作符
- 高度非过程化
非关系数据模型的数据操纵语言是“面向过程”的语言,用“过程化”语言完成某项请求必须指定存取路径
SQL 只要提出“做什么”,而无须指明“怎么做”,因此无须了解存取路径。存取路径的选择以及 SQL 的操作过程由系统自动完成
- 面向集合的操作方式
非关系数据模型采用面向记录的操作方式,操作对象是一条记录
SQL 采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合
- 以同一种语法结构提供多种使用方式
SQL 是独立的语言,能够独立地用于联机交互的使用方式
SQL 是嵌入式语言,能够嵌入到高级语言(例如 C,C++,Java)程序中,供程序员设计程序时使用
在两种不同的方式下, SQL 的语法结构基本上是一致的
- 语言简单,易学易用
SQL 完成核心功能只用了 9 个动词
- 数据查询: SELECT
- 数据定义:CREATE, DROP, ALTER
- 数据操纵:INSERT, UPDATE, DELETE
- 数据控制:GRANT, REVOKE
3.1.3 SQL的基本概念
支持 SQL 的关系数据库管理系统同样支持关系数据库三级模式结构,如下图所示。其中外模式包含若干视图(view)和部分基本表(base table),模式包括若干基本表,内模式包括若干存储文件(stored file)
- 基本表是本身独立存在的表,在关系数据库管理系统中一个关系就对应一个基本表。一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中
- 存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理结构对最终用户是隐蔽的
- 视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据。这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。视图在概念上与基本表等同,用户可以在视图上再定义视图
3.3 数据定义
SQL 的数据定义功能包括模式定义、表定义、视图和索引的定义
一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象
3.3.1 模式的定义与删除
1.定义模式
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
如果没有指定<模式名>,那么<模式名> 隐含为 <用户名>
在 CREATE SCHEMA 中可以接受 CREATE TABLE,CREATE VIEW 和 GRANT 子句,也就是说用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图,定义授权。即
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>];
2. 删除模式
DROP SCHEMA <模式名> <CASCADE|RESTRICT>;
其中 CASCADE 和 RESTRICT 两者必选其一
CASCADE(级联)
- 删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制)
- 如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行
- 仅当该模式中没有任何下属的对象时才能执行
3.3.2 基本表的定义、删除与修改
1. 定义基本表
CREATE TABLE <表名> (<列名> <数据类型> [<列级完整性约束条件>]
[,<列名> <数据类型> [<列级完整性约束条件>]]
...
[,<表级完整性约束条件>]);
如果完整性约束条件涉及该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级
2. 数据类型
-
SQL 中域的概念用数据类型来实现
-
定义表的各个属性时需要指明其数据类型及长度
-
一个属性选用哪种数据类型,需要考虑取值范围以及要做哪些运算
数据类型含义
3. 模式与表
每一个基本表都属于某一个模式,一个模式包含多个基本表。
定义基本表所属模式的三种方法:
- 在表名中明显地给出模式名
- 在创建模式语句中同时创建表
- 设置所属的模式,这样在创建表时表名中不必给出模式名
4. 修改基本表
ALTER TABLE <表名>
[ADD [COLUMN] <新列名><数据类型> [完整性约束]]
[ADD <表级完整性约束>]
[DROP [COLUMN] <列名> [CASCADE| RESTRICT]]
[DROP CONSTRAINT<完整性约束名>[RESTRICT | CASCADE]]
[ALTER COLUMN<列名><数据类型>];
5. 删除基本表
DROP TABLE <表名>[RESTRICT| CASCADE];
选择 RESTRICT:删除该表是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如 CHECK,FOREIGN KEY 等约束),不能有视图、触发器、存储过程或函数等。如果存在依赖该表的对象,则此表不能被删除
选择 CASCADE:删除该表没有限制条件。在删除基本表的同时,相关的依赖对象都将被一起删除
基本表一旦被删除,不仅表中的数据和此表的定义将被删除,而且此表上建立的索引、触发器等对象一般也都将被删除。有的关系数据库管理系统还会同时删除在此表上建立的视图
3.3.3 索引的建立与删除
- 建立索引的目的:加快查询速度
- 数据库索引的类型:顺序文件上的索引、B+树索引、散列(hash)索引、位图索引
- 索引需要占用一定的存储空间,当基本表更新时,索引要进行相应的维护,因此需要根据实际应用的需要有选择地创建索引
- 建立与删除索引由数据库管理员或表的属主(owner),即建立表的人,负责完成
- 关系数据库管理系统在执行查询时会自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引
- 索引是关系数据库管理系统的内部实现技术,属于内模式的范畴
1.建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]…);
- UNIQUE:此索引的每一个索引值只对应唯一的数据记录
- CLUSTER:表示要建立的索引是聚簇索引
- <次序>:指定索引值的排列次序,可选升序(ASC)或降序(DESC),默认值为 ASC
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
2. 修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
2. 删除索引
DROP INDEX <索引名>;
删除索引时,系统会从数据字典中删去有关该索引的描述
3.3.4 数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等
关系数据库管理系统在执行 SQL 的数据定义语句时,实际上就是在更新数据字典表中的相应信息
3.4 数据查询
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名>…]|(<SELECT 语句>) [AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
3.4.1 单表查询
单表查询是指仅涉及一个表的查询
1. 选择表中的若干列
(1) 查询指定列
(2) 查询全部列
SELECT * FROM Student;
(3) 查询经过计算的值
SELECT 子句的 <目标列表达式> 不仅可以是表中的属性列,也可以是表达式
<目标列表达式> 不仅可以是算术表达式,还可以是字符串常量、函数等
2. 选择表中的若干元组
(1)消除取值重复的行
DISTINCT
SELECT DISTINCT Sno
FROM Sc;
(2)查询满足条件的元组:WHERE 子句
- 查询条件: 谓词
- 比较:=,>,<,>=,<=,!=,<>,!>,!<,NOT+上述比较运算符
- 确定范围:BETWEEN AND,NOT BETWEEN AND
- 确定集合:IN,NOT IN
- 字符匹配:LIKE,NOT LIKE
- 空值:IS NULL,IS NOT NULL
- 多重条件(逻辑运算):AND,OR,NOT
字符匹配:
- % (百分号)代表任意长度(长度可以为0)的字符串。例如 a%b 表示以 a 开头,以 b 结尾的任意长度的字符串
- _(下划线)代表任意单个字符。例如 a_b 表示以 a 开头,以 b 结尾的长度为 3 的任意字符串
如果用户要查询的字符串本身就含有通配符 % 或 _,这时就要使用 ESCAPE '<换码字符>' 短语对通配符进行转义
SELECT Cno, Ccredit FROM Course WHERE Cname LIKE 'DB\_Design' ESCAPE '\';
3. ORDER BY 子句
ORDER BY 子句可以对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序
对于空值,排序时显示的次序由具体系统实现来决定
4. 聚集函数
- 统计元组个数:COUNT(*)
- 统计一列中值的个数:COUNT([DISTINCT|ALL] <列名>)
- 计算一列值的总和(此列必须为数值型):SUM([DISTINCT|ALL] <列名>)
- 计算一列值的平均值(此列必须为数值型):AVG([DISTINCT|ALL] <列名>)
- 求一列中的最大值和最小值:MAX([DISTINCT|ALL] <列名>), MIN([DISTINCT|ALL] <列名>)
注:
-
如果指定 DISTINCT 短语,则表示在计算时要取消指定列中的重复值。如果不指定 DISTINCT 短语或指定 ALL 短语(ALL 为默认值),则表示不取消重复值
-
当聚集函数遇到空值时,除 COUNT(*) 外,都跳过空值而只处理非空值
-
WHERE 子句中是不能用聚集函数作为条件表达式的。聚集函数只能用于 SELECT 子句和 GROUP BY 中的 HAVING 子句
5. GROUP BY 子句
GROUP BY 子句将查询结果按某一列或多列的值分组,值相等的为一组
- 将查询结果分组的目的: 细化聚集函数的作用对象
- 如果未对查询结果分组,聚集函数将作用于整个查询结果
- 查询结果分组后,聚集函数将分别作用于每个组,即每一组都有一个函数值
HAVING 短语与 WHERE 子句的区别:作用对象不同
- WHERE 子句作用于基本表或视图,从中选择满足条件的元组
- HAVING 短语作用于组,从中选择满足条件的组
3.4.2 连接查询
若一个查询同时涉及两个以上的表,称为连接查询
连接查询是关系数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件查询等
1. 等值与非等值连接查询
连接查询的 WHERE 子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
其中比较运算符主要有 =、>、<、>=、<=、!=(或<>)等。
连接谓词还可以使用下面形式:
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
- 当连接运算符为=时,称为等值连接。使用其他运算符称为非等值连接
- 连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但名字不必相同
- 嵌套循环连接算法
- 排序合并法:常用于=连接
- 索引连接
自然连接:若在等值连接中把目标列中重复的属性列去掉
2. 自身连接
一个表与其自己进行连接,称为表的自身连接
- 需要给表起别名以示区别
- 由于所有属性名都是同名属性,因此必须使用别名前缀
3. 外连接
外连接与普通连接的区别:
- 普通连接操作只输出满足连接条件的元组
- 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出:左外连接列出左边关系中所有的元组,右外连接列出右边关系中所有的元组
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
4. 多表连接
两个以上的表进行连接称为多表连接
关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接
3.4.3 嵌套查询
一个 SELECT-FROM-WHERE 语句称为一个查询块。将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为嵌套查询(nested query)。
SELECT Sname /*外层查询或父查询*/
FROM Student
WHERE Sno IN
(SELECT Sno /*内层查询或子查询*/
FROM SC WHERE Cno='2')
- SQL 语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询
- 子查询的 SELECT 语句不能使用 ORDER BY 子句,ORDER BY 子句只能对最终查询结果排序
- 嵌套查询使用户可以用多个简单查询构成复杂的查询,从而增强 SQL 的查询能力。以层层嵌套的方式来构造程序正是 SQL 中“结构化”的含义所在
不相关子查询:子查询的查询条件不依赖于父查询
- 由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件
相关子查询:子查询的查询条件依赖于父查询
- 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若 WHERE 子句返回值为真,则取此元组放入结果表;然后再取外层表的下一个元组;重复这一过程,直至外层表全部检查完为止
- 求解相关子查询不能像求解不相关子查询那样一次将子查询求解出来,然后求解父查询。内层查询由于与外层查询有关,因此必须反复求值
1. 带有 IN 谓词的子查询
在嵌套查询中,子查询的结果往往是一个集合,所以谓词 IN 是嵌套查询中最经常使用的谓词
- 有些嵌套查询可以用连接运算替代,有些是不能替代的
- 在实际应用中,能够用连接运算表达的查询尽可能采用连接运算
2. 带有比较运算符的子查询
当用户能确切知道内层查询返回的是单个值时,可用比较运算符 (>,<,=,>=,<=,!=或< >)
3. 带有 ANY(SOME)或 ALL 谓词的子查询
子查询结果中的某个值但返回多值时要用 ANY(有的系统用 SOME)或 ALL 谓词修饰符。使用 ANY 或 ALL 谓词时必须同时使用比较运算符
- $> $ANY:大于子查询结果中的某个值
- \(>ALL\):大于子查询结果中的所有值
- \(<ANY\):小于子查询结果中的某个值
- \(<ALL\):小于子查询结果中的所有值
- \(>=ANY\):大于等于子查询结果中的某个值
- \(>=ALL\):大于等于子查询结果中的所有值
- \(<=ANY\):小于等于子查询结果中的某个值
- \(<=ALL\):小于等于子查询结果中的所有值
- \(=ANY\):等于子查询结果中的某个值
- \(=ALL\):等于子查询结果中的所有值(通常没有实际意义)
- \(!=(或<>)\)ANY:不等于子查询结果中的某个值
- \(!=(或<>)\)ALL:不等于子查询结果中的任何一个值
4. 带有 EXISTS 谓词的子查询
EXISTS 代表存在量词 \(\exists\)
- 带有 EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”
- 可以利用 EXISTS 来判断 \(x \in S\) 、\(S \subseteq R\) 、S = R 、\(S \cap R\) 非空等是否成立
- 若内层查询结果非空,则外层的 WHERE 子句返回真值,否则返回假值
- 由 EXISTS 引出的子查询,其目标列表达式通常都用
*,因为带 EXISTS 的子查询只返回真值或假值,给出列名无实际意义
NOT EXISTS 谓词:若内层查询结果为空,则外层的 WHERE 子句返回真值,否则返回假值
不同形式查询间的替换
- 一些带 EXISTS 或 NOT EXISTS 谓词的子查询不能被其他形式的子查询等价替换
- 所有带 IN 谓词、比较运算符、ANY 和 ALL 谓词的子查询都能用带 EXISTS 谓词的子查询等价替换
3.4.4 集合查询
集合操作主要包括并操作 UNION、交操作 INTERSECT、差操作 EXCEPT
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同
- UNION:将多个查询结果合并起来时,系统自动去掉重复元组
- UNION ALL:将多个查询结果合并起来时,保留重复元组
查询选修了课程 1 或选修了课程 2 的学生
SELECT Sno FROM SC WHERE Cno='1'
UNION SELECT Sno FROM SC WHERE Cno='2';
3.4.5 基于派生表的查询
子查询不仅可以出现在 WHERE 子句中,还可以出现在 FROM 子句中, 这时子查询生成的临时派生表(derived table)成为主查询的查询对象
找出每个学生超过他自己选修课程平均成绩的课程号
SELECT Sno, Cno
FROM SC, (SELECT Sno, Avg(Grade)
FROM SC
GROUP BY Sno)
AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno=Avg_sc.avg_sno and SC.Grade>=Avg_sc.avg_grade;
如果子查询中没有聚集函数,派生表可以不指定属性列,子查询 SELECT 子句后面的列名为其默认属性
查询所有选修了1号课程的学生姓名,可以用如下查询完成
SELECT Sname
FROM Student, (SELECT Sno FROM SC WHERE Cno='1') AS SC1
WHERE Student.Sno=SC1.Sno;
通过 FROM 子句生成派生表时,AS 关键词可以省略,但必须为派生关系指定一个别名
3.4.6 SELECT 语句的一般格式
SELECT 语句的一般格式:
SELECT [ALL|DISTINCT]<目标列表达式> [别名] [,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名][,<表名或视图名> [别名]] …|(<SELECT语句>) [AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
1. 目标列表达式的可选格式
-
- <表名>.*
- COUNT( [DISTINCT|ALL] * )
- [<表名>.]<属性列名表达式> [,<表名>.]<属性列名表达式>]…
其中<属性列名表达式>可以是由属性列、作用于属性列的聚集函数和常量的任意算术运算(+,-,*,/)组成的运算公式
2. 聚集函数的一般格式
3. WHERE子句的条件表达式的可选格式
错题
- 非关系数据模型的数据操纵语言是面向过程的,而关系数据库的标准语言SQL是面向集合的
- SLECT语句中和HAVING子句同时使用的是GROUP BY子句
- SQL以同一种语法格式,提供自含式和自定义式两种使用方式
3.5 数据更新
数据更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据
3.5.1 插入数据
SQL 的数据插入语句 INSERT 通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组
- 插入元组
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >]…)]
VALUES (<常量1> [,<常量2>]… );
- 插入子查询结果
INSERT
INTO <表名>[(<属性列1> [,<属性列2>…])
子查询;
3.5.2 修改数据
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]…
[WHERE <条件>];
功能是修改指定表中满足 WHERE 子句条件的元组。其中 SET 子句给出 <表达式> 的值用于取代相应的属性列值。如果省略WHERE子句,表示要修改表中的所有元组
1. 修改某一个元组的值
将学生 201215121 的年龄改为 22 岁。
UPDATE Student SET Sage=22 WHERE Sno='201215121'
2. 修改多个元组的值
将所有学生的年龄增加 1 岁
UPDATE Student SET Sage=Sage+1;
3. 带子查询的修改语句
将计算机科学系全体学生的成绩置零
UPDATE Student SET Grage = 0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS');
3.5.3 删除数据
DELETE
FROM <条件>
[WHERE <条件>];
功能:从指定表中删除满足 WHERE 子句条件的所有元组
1.删除某一个元组的值
删除学号为 201215128 的学生记录
DELETE FROM Student WHERE Sno='201215128';
2.删除多个元组的值
删除所有的学生选课记录
DELETE FROM SC;
3.带子查询的删除语句
删除计算机科学系所有学生的选课记录
DELETE
FROM SC
WHERE Sno IN
(SELETE Sno
FROM Student
WHERE Sdept='CS');
对某个基本表中数据的增、删、改操作有可能会破坏参照完整性
3.6 空值的处理
空值就是“不知道”、“不存在”或“无意义”的值
SQL 语言中允许某些元组的某些属性在一定情况下取空值。一般有以下几种情况:
- 该属性应该有一个值,但目前不知道它的具体值。例如:某学生的年龄属性,因该学生没有填写年龄信息,不知道该学生的年龄,因此取空值
- 该属性不应该有值。例如,缺考学生的成绩为空,因为该学生没有参加考试
- 由于某种原因不便于填写。例如,一个人的电话号码不想让大家知道,则取空值
空值是一个很特殊的值,含有不确定性,对关系运算带来特殊的问题,需要做特殊的处理
1.空值的产生
2.空值的判断
判断一个属性的值是否为空值,用 IS NULL 或 IS NOT NULL 来表示。
3.空值的约束条件
属性定义(或者域定义)中
- 有 NOT NULL 约束条件的不能取空值
- 加了 UNIQUE 限制的属性不能取空值
- 码属性不能取空值
4. 空值的算术运算、比较运算和逻辑运算
- 空值与另一个值(包括另一个空值)的算术运算的结果为空值
- 空值与另一个值(包括另一个空值)的比较运算的结果为 UNKNOWN
- 有UNKNOWN 后,传统的逻辑运算中二值(TRUE,FALSE)逻辑就扩展成了三值逻辑
3.7 视图
- 视图是从一个或几个基本表(或视图)导出的表,是一个虚表
- 数据库中只存放视图的定义,不存放视图对应的数据,这些数据仍存放在原来的基本表中
- 一旦基本表中的数据发生变化,从视图中查询出的数据也随之改变
- 视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制
3.7.1 定义视图
1.建立视图
CREATE VIEW <视图名> [(<列名>[,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
- 子查询可以是任意的 SELECT 语句,是否可以含有 ORDER BY 子句和 DISTINCT 短语,则取决于具体系统的实现
- WITH CHECK OPTION 表示对视图进行 UPDATE、INSERT 和 DELETE 操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
- 组成视图的属性列名或者全部省略或者全部指定。如果省略了视图的各个属性列名,则隐含该视图由子查询中 SELECT 子句目标列中的诸字段组成
必须明确指定视图的所有列名:
- 某个目标列不是单纯的属性名,而是聚集函数或列表达式
- 多表连接时选出了几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更合适的名字
关系数据库管理系统执行 CREATE VIEW 语句时只是把视图的定义存入数据字典,并不执行其中的 SELECT 语句。只是在对视图查询时,才按视图的定义从基本表中将数据查出
若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图
视图可以建立在多个基本表上
视图可以建立在一个或多个已定义好的视图上,或建立在基本表与视图上
由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要设置一些派生属性列。这些派生属性在基本表中并不实际存在,所以也称为虚拟列。带虚拟列的视图也称为带表达式的视图
定义一个反映学生出生年份的视图
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2021-Sage
FROM Student;
可以用带有聚集函数和 GROUP BY 子句的查询来定义视图,这种视图称为分组视图
2. 删除视图
DROP VIEW <视图名> [CASCADE];
- 视图删除后视图的定义将从数据字典中删除
- 如果该视图上还导出了其他视图,使用 CASCADE 级联删除语句,把该视图和由它导出的所有视图一起删除
- 基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图的定义没有从字典中清除。删除这些视图定义需要显式地使用 DROP VIEW 语句
3.7.2 查询视图
关系数据库管理系统实现视图查询的方法:视图消解(view resolution)
首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询
例:在信息系学生的视图中找出年龄小于 20 岁的学生
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
视图消解转换后的查询语句为:
SELECT Sno,Sage
FROM Student
WHERE Sdept='IS' AND Sage<20;
目前多数关系数据库系统对行列子集视图的查询均能进行正确转换。但对非行列子集视图的查询就不一定能做转换了,因此这类查询应该直接对基本表进行
定义视图并查询视图与基于派生表的查询是有区别的:
- 视图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接引用该视图
- 派生表只是在语句执行时临时定义,语句执行后该定义即被删除
3.7.3 更新视图
更新视图是指通过视图来插入、删除和修改数据
- 由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新
- 像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作
- 为防止用户通过视图对数据进行增加、删除、修改时,有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上 WITH CHECK OPTION 子句
例:将信息系学生视图 IS_Student 中学号为“201215122”的学生姓名改为“刘辰”
UPDATE IS_Student
SET Sname='刘辰'
WHERE Sno='201215122';
转换后的更新语句为
UPDATE Student
SET Sname='刘辰'
WHERE Sno='201215122' AND Sdept='IS';
在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成对相应基本表的更新
一般地,行列子集视图是可更新的。目前,各个关系数据库管理系统一般都只允许对行列子集视图进行更新,而且各个系统对视图的更新还有更进一步的规定,这些规定也不尽相同
注:不可更新的视图与不允许更新的视图是两个不同的概念。前者指理论上已证明其是不可更新的视图。后者指实际系统中不支持其更新,但它本身有可能是可更新的视图
3.7.4 视图的作用
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护适当利用
- 视图可以更清晰地表达查询
4. 数据库的安全性
数据库的数据保护主要包括数据的安全性和完整性
4.1 数据库安全性概述
- 数据库安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏
- 系统安全保护措施是否有效是数据库系统主要的性能指标之一
4.1.1 数据库的不安全因素
- 非授权用户对数据库的恶意存取和破坏
- 数据库中重要或敏感的数据被泄露
- 安全环境的脆弱性
4.1.2 安全标准简介
1985 年美国国防部正式颁布《DoD可信计算机系统评估准则》(Trusted Computer System Evaluation Criteria,简称 TCSEC 或 DoD85)
不同国家建立在 TCSEC 概念上的评估准则:
- 欧洲的信息技术安全评估准则(ITSEC)
- 加拿大的可信计算机产品评估准则(CTCPEC)
- 美国的信息技术安全联邦标准(FC)
1993 年,CTCPEC、FC、TCSEC 和 ITSEC 联合行动,解决原标准中概念和技术上的差异,将各自独立的准则集合成一组单一的、能被广泛使用的 IT 安全准则,这一行动被称为通用准则(Common Criteria,CC)项目
1999 年 CC V2.1版被 ISO 采用为国际标准,2001 年 CC V2.1 版被我国采用为国家标准
目前 CC 已基本取代了 TCSEC,成为评估信息产品安全性的主要标准
1991年4月,美国国家计算机安全中心(National Computer Security Center,NCSC)颁布了《可信计算机系统评估准则关于可信数据库系统的解释》(TCSEC/Trusted Database Interpretation,TCSECTDI),将 TCSEC 扩展到数据库管理系统
TCSEC/TDI 中定义了数据库管理系统的设计与实现中需满足和用以进行安全性级别评估的标准,从 4 个方面来描述安全性级别划分的指标,即安全策略、责任、保证和文档
TCSES/TDI 将系统划分为 4 组(division)7 个等级,依次是 D、C(C1,C2)、B(B1,B2,B3)、A(A1),按系统可靠或可信程度逐渐增高
| 安全级别 | 定义 |
|---|---|
| A1 | 验证设计 |
| B3 | 安全域 |
| B2 | 结构化保护 |
| B1 | 标记安全保护 |
| C2 | 受控的存取保护 |
| C1 | 自主安全保护 |
| D | 最小保护 |
- D级:该级是最低级别。保留 D 级的目的是为了将一切不符合更高标准的系统均归于 D 组。如 DOS 就是操作系统中安全标准为 D 级的典型例子,在安全性方面几乎没有什么专门的机制来保障
- C1级:该级只提供了非常初级的自主安全保护,能够实现对用户和数据的分离,进行自主存取控制(DAC),保护或限制用户权限的传播。现有的商业系统往往稍作改进即可满足要求
- C2级:该级实际上是安全产品的最低档,提供受控的存取保护,即将 C1 级的 DAC 进一步细化,以个人身份注册负责,并实施审计和资源隔离。达到 C2 级的产品在其名称中往往不突出“安全”(security) 这一特色
- B1 级:标记安全保护。对系统的数据加以标记,并对标记的主体和客体实施强制存取控制(MAC) 以及审计等安全机制。B1 级别的产品被认为是真正意义上的安全产品,满足此级别的产品前一般多冠以“安全”(security)或“可信的”(trusted)字样,作为区别于普通产品的安全产品出售
- B2 级:结构化保护。建立形式化的安全策略模型,并对系统内的所有主体和客体实施 DAC 和 MAC
- B3 级:安全域。该级的 TCB (Trusted Computing Base)必须满足访问监控器的要求,审计跟踪能力更强,并提供系统恢复过程
- A1 级:验证设计,即提供 B3 级保护的同时给出系统的形式化设计说明和验证,以确信各安全保护真正实现
CC 是在上述各评估准则及具体实践的基础上通过相互总结和互补发展而来的。和早期的评估准则相比,CC 具有结构开放、表达方式通用等特点
CC 提出了目前国际上公认的表述信息技术安全性的结构,即把对信息产品的安全要求分为:
- 安全功能要求:用以规范产品和系统的安全行为
- 安全保证要求:解决如何正确有效地实施这些功能
安全功能要求和安全保证要求都以“类-子类-组件”的结构表述,组件是安全要求的最小构件块
CC 的文本由三部分组成,三个部分相互依存,缺一不可
- 简介和一般模型:介绍 CC 中的有关术语、基本概念和一般模型以及与评估有关的一些框架
- 安全功能要求:列出了一系列类、子类和组件
- 安全保证要求:列出了一系列保证类、子类和组件,根据系统对安全保证要求的支持情况提出了评估保证级(Evaluation Assurance Level,EAL),从 EAL1 至 EAL7 共分为七级,按保证程度逐渐增高
4.2 数据库安全性控制
非法使用数据库的情况
- 编写合法程序绕过数据库管理系统及其授权机制
- 直接或编写应用程序执行非授权操作
- 通过多次合法查询数据库从中推导出一些保密数据
在一般计算机系统中,安全措施是一级一级层层设置的
- 系统首先根据用户标识鉴定用户身份,合法用户才准许进入计算机系统
- 数据库管理系统还要进行存取控制,只允许用户执行合法操作
- 操作系统有自己的保护措施
- 数据可以以密码形式存储到数据库中
数据库安全保护的存取控制流程
- 首先,数据库管理系统对提出 SQL 访问请求的数据库用户进行身份鉴别,防止不可信用户使用系统
- 然后,在 SQL 处理层进行自主存取控制和强制存取控制,进一步还可以进行推理控制
- 为监控恶意访问,可根据具体安全需求配置审计规则,对用户访问行为和系统关键操作进行审计,对异常用户行为进行简单入侵检测
4.2.1 用户身份鉴别
用户身份鉴别是数据库管理系统提供的最外层安全保护措施
每个用户在系统中都有一个用户标识,每个用户标识由用户名(user name)和用户标识号(UID)组成,用户标识号在系统的整个生命周期内是唯一的
1. 静态口令鉴别
- 静态口令一般由用户自己设定,这些口令是静态不变的
- 数据库管理系统从口令的复杂度,口令的管理、存储及运输等多方面来保障口令的安全可靠
- 特点:简单,容易被攻击,安全性较低
2.动态口令鉴别
- 口令是动态变化的,每次鉴别时均需使用动态产生的新口令登录数据库管理系统,即采用一次一密的方法
- 常用方式:短信密码和动态令
- 特点:与静态口令鉴别相比,安全性相对高一些
3. 生物特征鉴别
- 通过生物特征进行认证的技术,生物特征是指生物体唯一具有的,可测量、识别和验证的稳定生物特征,如指纹、虹膜和掌纹等
- 特点:与传统的口令鉴别相比,安全性较高
4.智能卡鉴别
- 智能卡是一种不可复制的硬件,内置集成电路的芯片,具有硬件加密功能
- 智能卡由用户随身携带,登录数据库管理系统时用户将智能卡插入专用的读卡器进行身份验证
- 由于每次从智能卡中读取的数据是静态的,通过内存扫描或网络监听等技术还是可能截取到用户的身份验证信息,存在安全隐患。因此,实际应用中一般采用个人身份识别码(PIN)和智能卡相结合的方式
4.2.2 存取控制
存取控制机制主要包括定义用户权限和合法权限检查两部分。
(1)定义用户权限,并将用户权限登记到数据字典中
- 用户对某一数据对象的操作权力称为权限
- 数据库管理系统提供适当的语言来定义用户权限,这些定义经过编译后存储在数据字典中,被称做安全规则或授权规则
(2)合法权限检查
- 用户发出存取数据库操作请求,数据库管理系统查找数据字典,根据安全规则进行合法权限检查
权限定义和合法权检查机制一起组成了数据库管理系统的存取控制子系统
C2 级的数据库管理系统支持自主存取控制(Discretionary Access Control,简称 DAC),B1 级的数据库管理系统支持强制存取控制(Mandatory Access Control,简称 MAC)
自主存取控制(DAC)
- C2级:非常灵活
- 用户对不同的数据库对象有不同的存取权限
- 不同的用户对同一对象也有不同的权限
- 用户还可将其拥有的存取权限转授给其他用户
强制存取控制(MAC)
- B1级:相对比较严格
- 每一个数据库对象被标以一定的密级
- 每一个用户也被授予某一个级别的许可证
- 对于任意一个对象,只有具有合法许可证的用户才可以存取
4.2.3 自主存取控制方法
- 自主存取控制主要通过 SQL 的 GRANT 语句和 REVOKE 语句实现
- 用户权限由数据库对象和操作类型组成
- 定义用户的存取权限:就是定义用户可以在哪些数据库对象上进行哪些类型的操作
- 在数据库系统中,定义存取权限称为授权(authorization)
- 在非关系系统中,用户只能对数据进行操作,存取控制的数据库对象也仅限于数据本身
- 在关系数据库系统中,存取控制的对象不仅有数据本身(基本表中的数据、属性列上的数据),还有数据库模式(包括模式、基本表、视图和索引的创建等)
对列的 UPDATE 权限指对于表中存在的某一列的值可以进行修改。有了这个权限之后,在修改的过程中还要遵守表在创建时定义的主码及其他约束
列上的 INSERT 权限指用户可以插入一个元组。对于插入的元组,授权用户可以插入指定的值,其他列或者为空,或者为默认值。在给用户授予列 INSERT 权限时,一定要包含主码的 INSERT 权限,否则用户的插入动作会因为主码为空而被拒绝
4.2.4 授权:授予与收回
1.GRANT
GRANT <权限>[,<权限>]…
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
TO <用户>[,<用户>]…
[WITH GRANT OPTION];
- 语义:将对指定操作对象的指定操作权限授予指定的用户
- 发出 GRANT 语句的可以是数据库管理员、数据库对象创建者(即属主 owner)、已经拥有该权限的用户
- 按受权限的用户可以是一个或多个具体用户、PUBLIC(即全体用户)
- SQL 标准允许具有 WITH GRANT OPTION 的用户把相应权限或其子集传递授予其他用户,但不允许循环授权,即被授权者不能把权限再授回给授权者或其祖先
- 指定 WITH GRANT OPTION 子句:获得某种权限的用户可以把这种权限再授予其他的用户
- 没有指定 WITH GRANT OPTION 子句:获得某种权限的用户只能使用该权限,不能传播该权限
例1:把查询 Student 表权限授给用户 U1
GRANT SELECT ON TABLE Student TO U1;
例2:把对 Student 表和 Course 表的全部权限授予用户 U2 和 U3
GRANT ALL PRIVILIGES ON TABLE Student,Course TO U2,U3;
GRANT 语句
- 一次向一个用户授权
- 一次向多个用户授权
- 一次传播多个同类对象的权限
- 一次可以完成对基本表和属性列这些不同对象的授权
2.REVOKE
授予用户的权限可以由数据库管理员或其他授权者用 REVOKE 语句收回
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>[,<对象类型><对象名>]…
FROM <用户>[,<用户>]…[CASCADE|RESTRICT];
例1:把用户 U4 修改学生学号的权限收回
REVOKE UPDATE(Sno) ON TABLE Student FROM U4;
例2:把用户 U5 对 SC 表的 INSERT 权限收回
REVOKE INSERT ON TABLE SC FROM U5 CASCADE;
用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人。因此称这样的存取控制是自主存取控制
3. 创建数据库模式的权限
对创建数据库模式一类的数据库对象的授权由数据库管理员在创建用户时实现
创建用户语句格式:
CREATE USER <username> [WITH][DBA|RESOURCE|CONNECT];
说明:
- 只有系统的超级用户才有权创建一个新的数据库用户
- 新创建的数据库用户有三种权限:CONNECT、RESOURCE 和 DBA
- 如没有指定创建的新用户的权限,默认该用户拥有 CONNECT 权限。拥有 CONNECT 权限的用户不能创建新用户,不能创建模式,也不能创建基本表, 只能登录数据库
- 拥有 RESOURCE 权限的用户能创建基本表和视图,成为所创建对象的属主。但不能创建模式,不能创建新的用户
- 拥有 DBA 权限的用户是系统中的超级用户,可以创建新的用户、创建模式、创建基本表和视图等;DBA拥有对所有数据库对象的存取权限,还可以把这些权限授予一般用户
注:CREATE USER 语句不是 SQL 标准,因此不同的关系数据库管理系统的语法和内容相差甚远
4.2.5 数据库角色
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库可以简化授权的过程
1.数据库角色
CREATE ROLE <角色名>;
- 刚刚创建的角色是空的,没有任何内容
2.给角色授权
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…
- 数据库管理员和用户可以利用 GRANT 语句将权限授予某一个或几个角色
3.将一个角色授予其他的角色或用户
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION];
- 该语句把角色授予某用户,或授予另一个角色
- 授予者或者是角色的创建者,或拥有在这个角色上的ADMIN OPTION
- 如果指定了WITH ADMIN OPTION,则获得某种权限的角色或用户还可以把这种权限再授予其他角色
- 一个角色包含的权限包括直接授予这个角色的全部权限加上其他角色授予这个角色的全部权限
4.角色权限的收回
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…;
- 用户可以收回角色的权限,从而修改角色拥有的权限
- REVOKE 动作的执行者:角色的创建者、拥有在这个(些)角色上的 ADMIN OPTION
4.2.6 强制存取控制方法
自主存取控制(DAC)缺点:可能存在数据的“无意泄露”
- 原因:这种机制仅仅通过对数据的存取权限来进行安全控制, 而数据本身并无安全性标记
- 解决:对系统控制下的所有主客体实施强制存取控制策略
强制存取控制(MAC):系统为保证更高程度的安全性,按照 TDI/TCSEC 标准中安全策略的要求所采取的强制存取检查手段
- 用户不能直接感知或进行控制
- 适用于对数据有严格而固定密级分类的部门,如军事部门、政府部门
在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类
- 主体是系统中的活动实体,包括数据库管理系统所管理的实际用户和代表用户的各进程
- 客体是系统中的被动实体,受主体操纵,包括文件、基本表、索引、视图等
- 对于主体和客体,数据库管理系统为它们每个实例(值)指派一个敏感度标记(label)
敏感度标记被分成若干级别:
- 绝密(Top Secret,TS)、机密(Secret,S)、可信(Confidential,C)、公开(Public,P)
- 密级的次序:TS>=S>=C>=P
- 主体的敏感度标记称为许可证级别(clearance level)
- 客体的敏感度标记称为密级(classification level)
强制存取控制机制就是通过对比主体的敏感度标记和客体的敏感度标记,最终确定主体是否能够存取客体
强制存取控制规则:
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
(2)仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体
- 强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性
- 较高安全性级别提供的安全保护要包含较低级别的所有保护,因此在实现强制存取控制时要首先实现自主存取控制
- 自主存取控制与强制存取控制共同构成数据库管理系统的安全机制
系统首先进行自主存取控制检查,对通过自主存取控制检查的允许存取的数据库对象再由系统自动进行强制存取控制检查,只有通过强制存取控制检查的数据库对象方可存取
4.3 视图机制
可以为不同的用户定义不同的视图,把数据对象限制在一定的范围内。即通过视图机制把要保密的数据对无权存取这些数据的用户隐藏起来,从而自动对数据提供一定程度的安全保护
视图机制间接地实现支持存取谓词的用户权限定义
【例 4.14】建立计算机系学生的视图,把对该视图的 SELECT 权限授于王平,把该视图上的所有操作权限授于张明
/* 先建立计算机系学生的视图 CS_Student */
CREATE VIEW CS_Student AS SELECT * FROM Student WHERE Sdept='CS';
/* 在视图上进一步定义存取权限 */
GRANT SELECT ON CS_Student TO 王平;
GRANT ALL PRIVILIGES ON CS_Student TO 张明;
4 .4审计
审计功能把用户对数据库的所有操作自动记录下来放入审计日志(audit log)中
审计员可以利用审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等
C2 以上安全级别的数据库管理系统必须具有审计功能
- 审计通常是很费时间和空间的
- 数据库管理员可以根据具体应用对安全性的要求,灵活地打开或关闭审计功能
- 审计功能主要用于安全性要求较高的部门
- 可审计事件有服务器事件、系统权限、语句事件及模式对象事件,还包括用户鉴别、自主访问控制和强制访问控制事件
1.审计事件
- 服务器事件:审计数据库服务器发生的事件,包括数据库服务器的启动、停止、数据库服务器配置文件的重新加载
- 系统权限:对系统拥有的结构或模式对象进行操作的审计,要求该操作的权限是通过系统权限获得的
- 语句事件:对 SQL 语句,如 DDL、DML、DQL 及 DCL 语句的审计
- 模式对象事件:对特定模式对象上进行的 SELECT 或 DML 操作的审计。模式对象包括表、视图、存储过程、函数等,不包括依附于表的索引、约束、触发器、分区表等
2.审计功能
- 基本功能,提供多种审计查阅方式
- 提供多套审计规则:一般在初始化设定,以方便审计员管理
- 提供审计分析和报表功能
- 审计日志管理功能,包括为防止审计员误删审计记录,审计日志必须先转储后删除;对转储的审计记录文件提供完整性和保密性保护;只允许审计员查阅和转储审计记录,不允许任何用户新增和修改审计记录等
- 系统提供查询审计设置及审计记录信息的专门视图
3.AUDIT 语句和 NOAUDIT 语句
AUDIT 语句用来设置审计功能,NOAUDIT 语句取消审计功能
审计一般可以分为用户级审计和系统级审计
用户级审计
- 任何用户可设置的审计
- 主要是用户针对自己创建的数据库表和视图进行审计
系统级审计
- 只能由数据库管理员设置
- 监测成功或失败的登录要求、监测授权和收回操作以及其他数据库级权限下的操作
【例 4.15】对修改 SC 表结构或修改 SC 表数据的操作进行审计
AUDIT ALTER,UPDATE ON SC;
【例 4.16】取消对 SC 表的一切审计。
NOAUDIT ALTER,UPDATE ON SC;
数据库安全审计系统提供了一种事后检查的安全机制
4.5 数据加密
数据加密是防止数据库中数据在存储和传输中失密的有效手段
加密的基本思想是根据一定的算法将原始数据——明文(plain text)变换为不可直接识别的格式——密文(cipher text),从而使得不知道解密算法的人无法获知数据的内容
数据加密主要包括存储加密和传输加密
1. 存储加密
透明存储加密:内核级加密保护方式,对用户完全透明
- 透明存储加密是数据在写到磁盘时对数据进行加密,授权用户读取数据时再对其进行解密
- 由于数据加密对用户透明,数据库的应用程序不需要做任何修改,只需在创建表语句中说明需加密的字段即可
- 基于数据库内核的数据存储加密、解密方法性能较好,安全完备性较高
非透明存储加密:通过多个加密函数实现
2.传输加密
链路加密
- 在链路层进行加密
- 传输信息由报头(路由选择信息)和报文(传送的数据信息)两部分组成
- 对报文和报头均加密
端到端加密
- 在发送端加密,接收端解密
- 只加密报文,不加密报头
- 只在发送端和接收端需要密码设备,而中间节点不需要密码设备,因此它所需密码设备数量相对较少
- 不加密报头,从而容易被非法监听者发现并从中获取敏感信息
基于安全套接层协议(Security Socket Layer,SSL)传输方案的实现思路:
(1)确认通信双方端点的可靠性
- 数据库管理系统采用基于数字证书的服务器和客户端认证方式,实现通信双方的可靠性确认
- 用户和服务器各自持有由知名数字证书认证中心或企业内建 CA 颁发的数字证书,双方在进行通信时,均首先向对方提供己方证书,然后使用本地的 CA 信任列表和证书撤销列表对接收到的对方证书进行验证
(2)协商加密算法和密钥
- 确认双方端点的可靠性后,通信双方协商本次会话的加密算法与密钥
- 通信双方利用公钥基础设施方式保证了服务器和客户端的协商过程通信的安全可靠
可信数据传输
- 业务数据在被发送之前将被用某一组特定的密钥进行加密和消息摘要计算,以密文形式在网络上传输
- 当业务数据被接收的时候,需用相同一组特定的密钥进行解密和摘要计算
- 数据库加密使用已有的密码技术和算法对数据库中存储的数据和传输的数据进行保护。加密后数据的安全性能够进一步提高
- 数据库加密增加了查询处理的复杂性,查询效率会受到影响
- 加密数据的密钥的管理和数据加密对应用程序的影响也是数据加密过程中需要考虑的问题
4.6 其他安全性保护
推理控制(inference control)
- 处理强制存取控制未解决的问题
- 避免用户利用其能够访问的数据推知更高密级的数据
- 常用方法:基于函数依赖的推理控制、基于敏感关联的推理控制
隐蔽信道(covert channel)
- 处理强制存取控制未解决的问题
数据隐私(data privacy)
- 数据隐私是控制不愿被他人知道或他人不便知道的个人数据的能力
- 数据隐私范围很广,涉及数据管理中的数据收集、数据存储、数据处理和数据发布等各个阶段

浙公网安备 33010602011771号