数据库系统第二章 关系数据库
第二章 关系数据库
关系数据库简介
- 1970年IBM公司的E.F.Codd提出关系数据模型
- 1972年提出了关系的第一、第二、第三范式
- 1974年提出了关系的BC范式
- 80年代后,关系数据库系统成为最重要、最流行的数据库系统
- 典型实验系统:System R、University INGRES
- 典型商用系统:ORACLE、DB2、SYBASE、INGRES、INFORMIX(一) 关系数据结构及形式化定义
(一) 关系数据结构及形式化定义
1. 关系
(1) 定义
之后每当谈到关系就表示那个二维表
单一的数据结构–关系
- 现实世界的实体以及实体间的各种联系均用关系来表示
逻辑结构–二维表
- 从用户角度,关系模型中数据的逻辑结构是一张二维表
关系模型是建立在集合代数的基础上。
(2) 相关概念
域
域
是一组具有相同数据类型的值的集合
。例:
- 整数
- 实数
- 介于某个取值范围的整数
- 长度指定长度的字符串集合
域和分量的概念是不一样的;域是一个取值范围,分量表示一个项
笛卡尔集
笛卡尔集是域的乘积,是有实际值的集合;而不是分量的组合,不是一个结构;也不是属性的组合
给定一组域D1,D2,…,Dn,这些域中可以有相同的。
D1,D2,…,Dn的笛卡尔积
为:
所有域的所有取值的一个组合
;
笛卡尔集的有些数据是没有意义的,比如有一位老师教一门课,一位学生选一门课的要求,那么上面例子就有很多不合要求
a. 元组(Tuple)
笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组(Tuple);
(张清玫,计算机专业,李勇)、(张清玫,计算机专业,刘晨)等都是元组 ;
b. 分量(Component)
笛卡尔积元素(d1,d2,…,dn)中的每一个值di叫作一个分量;
张清玫、计算机专业、李勇、刘晨等都是分量 ;
c. 基数(Cardinal number)
可以把基数看做笛卡尔积元素的个数,及元组的个数;
若Di(i=1,2,…,n)为有限集,其基数为mi(i=1,2,…,n),则D1×D2×…×Dn的基数M为:
d. 笛卡尔积的表示方法
笛卡尔积可表示为一个二维表,表中的每行对应一个元组,表中的每列对应一个域。
笛卡尔积的子集不是都有实际含义,只有某个子集才有实际含义。
关系
笛卡尔积·
D1×D2×…×Dn的子集
叫作在域
D1,D2,…,Dn上的关系
,表示为:
n表示关系的目或度。就是关机里面有结构分类
笛卡尔积所有的子集都可以叫做关系,但是哪个关系有用是看需求的
a. 元组
关系中的每个元素是关系中的元组,通常用t表示。
b. 单元关系与二元关系
当n=1时,称该关系为单元关系或一元关系。
当n=2时,称 该关系为二元关系。
这就和离散数学的二元关系对勾了
c. 关系的表示
关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域,一个属性。
d. 属性
关系中不同列可以对应相同的域,为了加以区分,必须对每列起一个名字,称为属性。
n目关系必有n个属性。
在表中,一行叫做一个元组,一列叫做一个属性,分量是实例中的一个项,比如学生(张三,18)中“张三”,“18”就是两个分量,两个属性是名字和年龄
e. 码
码是有特殊性质的属性,给定码可以唯一确定一行
码的类型 | 说明 | 补充 | 举例 |
---|---|---|---|
候选码 | 若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码。 简单的情况:候选码只包含一个属性,但是也可以有多个属性标识一个记录 |
多个候选码不一定就是说这多个属性要一起标识一个记录,比如学号和身份证号都可以唯一表示一个学生,不需要组合 以谁作为码看数据库的设计 |
选课(学号,课程号,成绩)关系中,学号和课程号都不是候选码,但是(学号,课程号)这一个组合是候选码 |
全码 | 最极端的情况:关系模式的所有属性组是这个关系模式的候选码,称为全码。 | ||
主码 | 若一个关系有多个候选码,则选定其中一个为主码。 | ||
主属性 | 候选码的诸属性称为主属性。 | (学号,课程号)这个组合是主属性 | |
非主属性 | 不包含在任何候选码中的属性或非码属性。 |
D1,D2,…,Dn的笛卡尔积的某个子集才有实际含义
·例: 表2.1 的笛卡尔积没有实际意义
取出有实际意义的元组来构造关系
关系:SAP(SUPERVISOR,SPECIALITY,POSTGRADUATE)
假设:导师与专业:1:1, 导师与研究生:1:n
主码:POSTGRADUATE(假设研究生不会重名)
SAP关系可以包含三个元组:{ (张清玫,计算机专业,李勇), (张清玫,计算机专业,刘晨),(刘逸,信息专业,王敏) }
f. 基表、查询表、视图表
表的类型 | 说明 |
---|---|
基本关系(基本表或基表) | 实际存在的表,是实际存储数据的逻辑表示 |
查询表 | 查询结果对应的表 |
视图表 | 由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据 |
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
g. 基本关系的性质
-
列是同质的。
-
不同的列可出自同一个域(不同的列可以属于相同的取值范围),其中的每一列称为一个属性,不同的属性要给予不同的属性名(这是为了区分来自同一个域的不同属性)。
-
列的顺序无所谓,列的次序可以任意交换。
-
任意两个元组的候选码不能相同。
-
行的顺序无所谓,行的次序可以任意交换。
-
分量必须取原子值,这是规范条件中最基本的一条。
关系数据库第一个条件就是不允许出现小表
2. 关系模式
(1) 什么是关系模式
关系模式是对关系的描述。关系模式是型,关系是值。
比如一个表有哪些列,列的属性是什么,这是关系模式。一个表有500条元组这是一个关系,有1000条元组也是一个关系
-
元组集合的结构
属性构成、属性来自的域、属性与域之间的映像关系。 -
一个关系通常由赋予它的元组语义确定。
元组的数据有什么,才能知道这个关系表示什么内容
-
现实的世界中还存在着完整性约束。
意思是数据不能想填什么就填什么,得有现实世界的意义
(2) 关系模式的定义
关系模式可以形式化地表示为:R(U,D,DOM,F)
- R:关系名
- U:组成该关系的属性名集合
- D:属性组U中属性所来自的域
- DOM:属性向域的映像集合
- F:属性间的数据依赖关系集合
关系和关系模式的表示方式可不一样,学生(张三,14,185)这些由有具体的分量是关系的表示
【例】导师和研究生出自同一个域—人,因此取不同的属性名,并在模式中定义属性向域的映象,即说明它们分别出自哪个域:
DOM (SUPERV ISOR—PERSON)=DOM (POSTGRADUATE—PERSON) = PERSON
这个一般不怎么用
(3) 关系 & 关系模式
- 关系模式是静态的、稳定的。
- 关系是动态的、随时间不断变化的。
- 关系是关系模式在某一时刻的状态或内容,在实际工作中关系模式和关系往往统称为关系,需要通过上下文加以区别。
(4) 关系模型的存储结构
- 有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成。
- 有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间组织表、索引表等存储结构,并进行存储管理。
这个对于用户是透明的,不需要管
(二) 关系数据结构
1. 基本关系操作
- 常用的关系操作
- 查询:选择、投影、连接、除、并、交、差等,其中:选择、投影、并、差、笛卡尔积是5种基本操作。
- 数据更新:插入、删除、修改。
查询的表达能力是其中最主要的部分。
- 关系操作的特点
集合操作方式:操作的对象和结果都是集合,一次一集合的方式。
2. 关系数据库语言的分类
-
关系代数语言
用对关系的运算来表达查询要求。代表:ISBL -
关系演算语言
用谓词来表达查询要求。- 元组关系演算语言:谓词变元的基本对象是元组变量。代表:APLHA,QUEL
- 域关系演算语言:谓词变元的基本对象是域变量。代表:QBE
关系验算分两种对象的
-
具有关系代数和关系演算双重特点的语言
代表:SQL
3. 关系的完整性
关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义完整性。
总之谈到关系的完整性就是指这三个
其中实体完整性、参照完整性是关系模型必须满足的完整性约束条件,成为关系的两个不变性,应该由关系系统自动支持。
用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
(1) 实体完整性
实体完整性规则是指若属性A是基本关系R的主属性,则属性A不能取空值。
空值就是“不知道”或“不存在”或“无意义”的值。
实体完整性就是要说明这个实体是唯一的
实体完整性规则的说明:
- 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。
- 现实世界中的实体是可区分的,即它们具有某种唯一性标识。
- 关系模型中以主码作为唯一性标识。
- 主码中的属性即主属性不能取空值。
主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第2)点相矛盾,因此这个规则称为实体完整性。
实体完整性规则规定基本关系的所有主属性都不能取空值。
在表中,要求主码不为空,不同元组的主码不能相同即可
(2) 参照完整性
关系间的引用
- 在关系模型中实体及实体间的联系都是用关系来描述的,存在着关系与关系间的引用。
外码
- 定义:设F是基本关系R的一个或一组属性,但不是关系R的码(码就是主码)。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码。
- 基本关系R称为参照关系
- 基本关系S称为被参照关系
说明:
- 关系R和S不一定是不同的关系。
- 目标关系S的主码Ks和参照关系的外码F必须定义在同一个(或一组)域上。
- 外码并不一定要与相应的主码同名(可以一个叫工号,另一个加学工号),当外码与相应的主码属于不同关系时,往往取相同的名字,以便于识别。
参照完整性规则
- 参照完整性规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
- 或者取空值(F的每个属性值均为空值);
- 或者等于S中某个元组的主码值。
主码不能为空的
可以看到,即使是控制也是有意义的
(3) 用户定义的完整性
针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求。
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能。
就是说属性具有用户规定的现实意义
4. 关系代数(操作)
- 关系代数是一种抽象的查询语言,是对关系的运算来表达查询。
- 关系代数的运算对象是关系,运算结果也是关系。
- 关系代数按运算符的不同可分为传统的集合运算和专门的关系运算两类。
- 集合运算是从关系的水平方向进行的角度进行。
- 专门的关系运算不仅涉及行而且涉及列。
(1) 传统的集合运算
并
- 关系R和S具有相同的目n(即两个关系都有n个属性),相应的属性取自同一个域。
- R与S的并运算表示为R∪S:R∪S={t|t∈RVt∈S}。
- 运算结果为:n目关系,由属于R或属于S的元组组成。
差
- 关系R和S具有相同的目n(即两个关系都有n个属性),相应的属性取自同一个域。
- R与S的差运算表示为R-S:R-S={t|t∈R∧t∉S}。
- 运算的结果为:n目关系,由属于R而不属于S的所有元组组成。
交
- 关系R和S具有相同的目n(即两个关系都有n个属性),相应的属性取自同一个域。
- R与S的交运算表示为R∩S:R∩S={t|t∈R∧t∈S},R∩S=R-(R-S)。
- 运算结果为:n目关系,由既属于R又属于S的元组组成。
笛卡尔积
严格地讲应该是广义的笛卡尔积。
- R:n目关系,k1个元组
- S:m目关系,k2个元组
R与S的笛卡尔积运算表示为
运算结果为:行:k1×k2个元组,列:(n+m)列元组的集合,其中元组的前n列是关系R的一个元组,后m列是关系S的一个元组。
(2) 专门的关系运算
相关记号说明
-
关系模式为R(A1, A2, ..., An),它的一个关系为R,t∈R表示t是R的一个元组。t[Ai]则表示元组t中相应于属性Ai的一个分量。
注意关系和关系模式的区别
-
若A={Ai1,Ai2,...,Aik},其中Ai1,,Ai2,...,Aik是A1,A2,...,An中的一部分,则A称为属性列或属性组。t[A]=(t[Ai1],t[Ai2],...,t[Aik])表示元组t在属性列A上诸分量的集合。
¬A则表示在{A1, A2, ..., An}中去掉{Ai1,Ai2,...,Aik}后剩余的属性组
-
R为n目关系,S为m目关系,Tr∈R,Ts∈S,
称为元组的连接,
是一个n+m列的元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组。
-
给定一个关系R(X,Z),X和Z为属性组。当t[X]=x时,x在R中的象集 Zx = {t[Z]|t∈R,t[X]=x},它表示R中属性组X上值为x的诸元组在Z上分量的集合。
第四个就是说注意象集是什么意思
使用到的表
![]() |
![]() |
![]() |
---|
① 选择
选择又称为限制。在关系R中选择满足给定条件的诸元组,记作:
其中:F为选择条件,基本形式为:
其中 θ表示比较运算符,它可以是>,≥,<,≤, =或<>。X1,Y1等是属性名,或为常量,或为简单函数;属性名也可以用它的序号来代替。
条件表达式中的运算符如下表:
举例
查询信息系(IS系)全体学生σSdept='ls' (Student)或σ5=ls(Student)
投影
从R中选择出若干属性列组成新的关系。
其中:A:R中的属性列。
-
投影操作主要是从列的角度进行运算
-
投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)。
投影是会去掉重复行的,比如对性别列进行投影,最终只会出现两行 男 和 女
连接
又称为θ连接,表示从两个关系的笛卡尔积中选取属性间满足一定条件的元组。
- A和B:分别为R和S上度数相等且可比的属性组。
- θ:比较运算符。
- 运算结果:从R和S的广义笛卡尔积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上满足比较关系θ的元组。
连接是从广义笛卡尔集中进行选择的,可以认为是一种选择,是在笛卡尔集上的选择
a. 等值连接
-
θ为“=”的连接运算称为等值连接。
-
等值连接的含义:从关系R与S的广义笛卡尔积中选取A、B属性值相等的那些元组。
b. 自然连接
- 自然连接是一种特殊的等值连接,两个关系中进行比较的分量必须是相同属性组,在结果中把重复的属性列去掉。
- 自然连接的含义:R和S具有相同的属性组B。
自然连接会筛选列名相同的属性相等的元组,并且最终只显示一个列
注意: 自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。
举例
R和S如下所示
R | S |
---|---|
![]() |
![]() |
一般连接 | 等值连接 | 自然连接 |
---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
自然连接会去掉重复列
c. 外连接
注意以下几个概念
- 悬浮元组:两个关系R和S在自然连接时,关系R和S中被舍弃的元组称为悬浮元组。
- 外连接:如果把悬浮元组舍弃的元组也保存在结果关系中,而在其他属性上填空值(Null),这种连接就叫做外连接。
- 左外连接:如果只保留左边关系R中的悬浮元组叫做左外连接。
- 右外连接:如果只保留右边关系S中的悬浮元组叫做右外连接。
R | S |
---|---|
![]() |
![]() |
自然连接 | 外连接 | 左外连接 | 右外连接 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
外连接的作用:有的时候我们希望没有对应关系的元组也能显示出来,比如说学生表 和 学生选课表 的连接中,有的学生还没有选课,不能直接漏掉没有选课的学生
除
-
给定关系R(X,Y)和S(Y,Z),其中X,Y,Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。
-
R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:
-
元组在X上分量值x的象集Yx包含S在Y上投影的集合,记作:
Yx:x在R中的象集,x=tr[X]
注意:除操作是同时从行和列角度进行计算。
在R(X,Y) ÷ S(Y,Z)的过程中,只需要看S中与R中相同的属性组,也就是说,在R中有Y属性组,只需要看S中的Y属性组,不需要看Z属性组
最终的结果只有R中的X属性组
举例:
设关系R、S分别为下图的(a)和(b),R÷S的结果为图(c)
注意,求解过程中,全程与D无关,BC是共有的属性,A 是结果
-
S在(B,C)上的投影为 {(b1,c2),(b2,c1),(b2,c3)}(先要找到这个投影)
-
在关系R中,A可以取四个值{a1,a2,a3,a4}
其象集分别为
属性 象集 a1 (b1, c2),(b2,c3),(b2,c1)} a2 a3 a4 -
只有a1的象集包含了S在(B,C)属性组上的投影
-
所以 R÷S ={a1}
综合例题
使用到的表
Student | Course | SC |
---|---|---|
![]() |
![]() |
![]() |
例一:查询至少选修1号课程和3号课程的学生号码
首先建立一个临时关系K={1,3}
然后求
- 投影Sno是因为最终要得到的是Sno
- 投影Cno是因为Cno是要用来除的
- K中只有Cno,因此结果只有Sno
200215121象集{1,2,3}200215122象集{2,3}
K={1,3} 于是:
例二:查询选修了2号课程的学生的学学号
先在SC表中找到选秀了2课程的,然后投影Sno
例三:查询至少选修了一门其直接先行课为5号课程的的学生姓名
或
或
例四:查询选修了全部课程的学生号码和姓名。
- 左边的除法是先找到学生号,这个表中只需要学生号即可
- 然后又要姓名,与Student进行自然连接即可
可以看到,上面的使用到的都是自然连接
5. 关系验算
(1) 元组关系验算ALPHA
- 为了讨论方便,先允许关系(的基数)是无限的。然后再对这种情况下定义的演算作适当的修改,保证关系演算中的每一个公式表示的是有限关系。
- 在元组关系演算系统中,称{t|Φ(t)}为元组演算表达式。其中t是元组变量,Φ(t)为元组关系演算公式简称公式。它由原子公式和运算符组成。
原子公式
- R(t)
R是关系名,t是元组变量。R(t)表示t是R中的元组。于是,关系R可表示为 - t[i]Θu[j]
t和u是元组变量,Θ是算术比较运算符。t[i]Θu[j]表示断言“元组t的第i个分量与元组u的第j个分量满足比较关系Θ”。 - t[i]Θc或cΘu[i]
这里c是常量,该公式表示“t的第i个分量与常量c满足比较关系Θ”。
【例】:t[2]<u[3],表示元组t的第2个分量小于元组u的第三个分类
在关系演算中定义了“自由元组变量”和“约束元组变量”的概念。这些概念和谓词演算中的概念完全一样。若公式中的一个元组变量前有“全称量词”或“存在量词”,则称该变量为约束元组变量,否则称自由元组变量。
公式的递归定义
- 如果原子公式是公式。
- 如果Φ1,和Φ2是公式,则Φ1∧Φ2,Φ1∨Φ2,┐Φ1也是公式。分别表示为:
如果Φ1和Φ2同时为真,则Φ1∧Φ2才为真,否则为假;
如果Φ1和Φ2中一个或同时为真,则Φ1∨Φ2为真,仅当Φ1和Φ2同时为假时,Φ1∨Φ2才为假;
若Φ1为真,则┐Φ1为假。 - 若Φ是公式,则∃t(Φ)也是公式。其中符号∃是存在量词符号,∃t(Φ)表示:若有一个t使Φ为真,则∃t(Φ)为真,否则∃t(Φ)为假。
- 若Φ是公式,则∀t(Φ)也是公式。其中符号∀是全称量词符号,∀t(Φ)表示:如果对所有t,都使Φ为真,则∀t(Φ)为真,否则∀t(Φ)为假。
运算符的优先次序
- 算术比较运算符最高;
- 量词次之,且∃的优先级高于∀的优先级;
- 逻辑运算符最低,且┐的优先级高于∧的优先级,∧的优先级高于∨的优先级;
- 加括号时,括号中运算符优先,同一括号内的运算符之优先级遵循①,②,③各项。
有限次地使用上述五条规则得到的公式是元组关系演算公式,其他公式不是元组关系演算公式。
一个元组演算表达式{t|Φ(t)}表示了使Φ(t)为真的元组集合。
关系验算表示关系代数
关系代数的运算均可以用关系演算表达式来表示(反之亦然)。
下面用关系演算表达式来表示五种基本运算:
-
并,R∪S=
-
差,R-S=
-
笛卡尔积:R×S={t(n+m)∣(∃u(n))(∃v(m))(R(u)∧S(v)∧t[1]=u[1]∧...∧t[n]=u[n]∧t[n+1]=v[1]∧...∧t[n+m]=v[m])}
-
投影
-
选择
F′是公式F用t[i]代替运算对象i得到的等价公式。
- t(k)表示t中有k个分量
- ∃u(n) 这里是引入了u这个元组
【例】查询信息系(IS)系全体学生。
- SIS=
【例】查询年龄小于20岁的学生。
- S20=
【例】查询学生的姓名和所在系。
- S={t(2)|(∃u) (Student (u)∧t[1]=u[1] ∧ t[2]=u[5];
安全限制
- 上面定义的关系演算允许出现无限关系(有无限个属性的关系)。例如,{t|┐R(t)}表示所有不属于R的元组(元组的目数等于R的目数)。(不属于R的元组可能有无数个)
- 求出这些可能的元组是做不到的,所以必须排除这类无意义的表达式。把防止产生无限关系的表达式称为安全表达式,所采取的措施称为安全限制
安全限制通常是定义一个有限的符号集dom(Φ),dom(Φ)一定包括出现在Φ以及中间结果和最后结果的关系中的所有符号(实际上是各列中值的汇集),dom(Φ)不必是最小集。
当满足下列条件时,元组演算表达式{t|Φ(t)}是安全的:
- 如果t使Φ(t)为真,则t的每个分量是dom(Φ)中的元素。
- 对于Φ中的每一个形如(∃u)(W(u))的子表达式,若u使W(u)为真,则u的每个分量是dom(Φ)中的元素。
- 对于Φ中的每一个形如(∀u)(W(u))的子表达式,若u使W(u)为假,则u的每个分量必属于dom(Φ)。换言之,若u某一分量不属于dom(Φ),则W(u)为真。
【例】设有关系R如下图,S={tl┐R(t)},若不进行安全限制,则可能是一个无限关系。
有无限种组合不属于关系R
定义dom (Φ) = πA(R)VπB (R)VπC(R)={{a1,a2},{b1,b2},{c1,c2}}
则s是dom (Φ)中各域值中元素的笛卡尔积与R的差集。如下图:
(2) 域关系演算QBE
这是早期计算机实现了使用的语言
-
关系演算的另一种形式是域关系演算。域关系演算以元组变量的分量即域变量作为谓词变元的基本对象。
-
QBE是Query By Example(即通过例子进行查询)的简称,它是基于屏幕表格的查询语言,用户通过终端屏幕编辑程序以填写表格的方式构造查询要求,而查询结果也是以表格形式显示。QBE中用示例元素来表示查询结果可能的情况,示例元素实质上就是域变量。
-
QBE操作框架
检索操作
a. 简单查询
【例】求信息系全体学生的姓名
- 用户提出要求;
- 屏幕显示空白表格;
- 用户在最左边一栏输入关系名Student
Student | ||||
---|---|---|---|---|
- 系统显示该关系的属性名
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
- 用户在上面构造查询要求。
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
P.T | IS |
T是示例元素即域变量。QBE要求示例元素下面一定要加下划线,S是查询条件,不用加下划线。P.是操作符,表示打印,实际上是显示。
说明:
- 查询条件中可以使用比较运算符≥,≥,≤,=和≠,其中=可以省略。
- 示例元素是这个域中可能的一个值,它不必是查询结果中的元素。比如要求信息系的学生,只要给出任意的一个学生名即可,而不必真是信息系的某个学生名。
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
P.李勇 | IS |
【例】查询全体学生的全部数据
Student Sno Sname Ssex Sage Sdept P.20121502 P.李勇 P.男 P.20 P.SC 显示全部数据也可以简单地把P.操作符作用在关系名上。
Student Sno Sname Ssex Sage Sdept P
b. 条件查询
【例】求年龄大于19岁的学生的学号。
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
P.20121502 | >19 |
【例】求计算机科学系年龄大于19岁的学生的学号
查询条件是Sdept=‘CS’和Sage>19两个条件的“与”。
在QBE中,表示两个条件的“与”有两种方法:
- 把两个条件写在同一行上;
Student Sno Sname Ssex Sage Sdept P.20121502 >19 CS
- 把两个条件写在不同行上,用相同的示例元素值表示与
Student Sno Sname Ssex Sage Sdept P.201215121 >19 P.201215121 CS 两个示例都是121
【例】查询计算机科学系或者年龄大于19岁的学生的学号
本查询的条件是Sdept='CS'和Sage>19两个条件的“或”。
在QBE中把两个条件写在不同行上,并且使用不同的示例
表示条件的“或”。
Student Sno Sname Ssex Sage Sdept P.201215121 >19 P.201215122 CS 一个是121,一个是122
<【例】查询既选了1号课程又选了2号课程的学生学号
查询条件是在一个属性中的“与”关系.它只能用“与”条件的第(2)种方法表示,即写两行,示例元素相同。
SC | Sno | Cno | Grade |
---|---|---|---|
P.201215121 | 1 | ||
P.201215122 | 2 |
【例】查询选修1号课程的学生姓名。
本查询涉及两个关系:SC和Student。
在QBE中实现这种查询的方法是通过相同的连接属性值把多个关系连接起来。
Student Sno Sname Ssex Sage Sdept 201215121 P.李勇
SC Sno Cno Grade 201215122 1 这里的Sno也是查询出来的结果,只是不进行输出罢了,作为连接属性,其值在两个表中要相同
【例】查询未选修1号课程的学生姓名
这里的查询条件中用到逻辑非。
在QBE中表示逻辑非的方法是将逻辑非写在关系名下面。
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
201215121 | P.李勇 | ||||
201215122 | P.王勇 |
SC | Sno | Cno | Grade |
---|---|---|---|
┐ | 201215121 | 1 | |
┐ | 201215122 |
这里没有选修1号课程有两种,一种是没选课,一种是选了课但是没选1号课程的
将两种都选出来,然后取非
注意P示例中两个是有区别的
【例】查询有两个人以上选修的课程号。
本查询是在一个表内连接。这个查询就是要显示这样的课程1它不仅被201215121选修,而且也被另一个学生(一201215121)
【例】查询有两个人以上选修的课程号。
本查询是在一个表内连接。这个查询就是要显示这样的课程1,它不仅被201215121选修,而且也被另一个学生(201215121)修了。
SC | Sno | Cno | Grade |
---|---|---|---|
201215121 | P.1 | ||
┐201215122 | 1 |
但是只输出一个Cno即可
c. 聚集函数
为了方便用户,QBE提供了一些聚集函数,主要包括CNT,SUM,AVG,MAX,MIN等,其含义如下。
函数名 | 功能 |
---|---|
CNT | 对元组计数 |
SUM | 求总和 |
AVG | 求平均值 |
MAX | 求最大值 |
MIN | 求最小值 |
d. 查询结果进行排序
对查询结果按某个属性值的升序排序,只需在相应列中填入“AO.”,按降序排序则均“DO.”。如果按多列排序,用“AO(i).”或“DO(i).”表示,其中i为排序的优先级,i值越小,优先级越高。
【例】查全体男生的姓名,要求查询结果按所在系升序排序对相同系的学生按年龄降序排序
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
P.李勇 | 男 | DO(2). | AO(1). |
更新操作
a. 修改操作
修改操作符为“U.”。
在QBE中,关系的主码不允许修改,如果需要修改缪戈元组的主码,只能先删除该元组,然后再插入新的主码的元组。
【例】把201215121学生的年龄改为18岁)
这是修改操作不包含算术表达式,可以有两种表示方法
- 将操作符“U.”放在值上;
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
201215121 | U.18 |
- 将操作符“U.”放在关系上。
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
U | 201215121 | 18 |
主码Sno的201215121表明要修改的元素,Sage表示新值,主码是不能修改的,因此第二种方式不混混淆
【例】把201215121学生的年龄增加1岁
这个修改操作涉及表达式,所以只能将操作符“U.”放在关系
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
201215121 | 17 | ||||
U | 201215121 | 17 + 1 |
第一行的17表示查询结果,第二行表示+1
【例】将计算机科学系所有学生的年龄都增加1岁。
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
201215128 | 17 | SC | |||
U | 201215128 | 17 + 1 |
第一行查到计算机系的所有学生,只查Sage和Sno,第二行进行修改,将查到的学号的学生的年龄+1,由于学号不会修改,因此Sno不会变
b. 插入操作
插入操作符为“I.:。新插入的元组必须具有码值,其他属性值可以为空。
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
U | 201215124 | 张三 | 女 | 18 |
删除操作
删除操作符为“D.”。
【例】删除学生201215189。
Student | Sno | Sname | Ssex | Sage | Sdept |
---|---|---|---|---|---|
D | 201215189 |
删除学生还应该删除SC表中的学生选修
SC | Sno | Cno | Grade |
---|---|---|---|
D | 202115189 |