关系数据模型

知识回顾

数据模型的三大要素

  1. 数据结构(静态):对现实世界实体间的联系进行抽象:包括层次模型,网状模型,关系模型,面向对象模型
  2. 数据操作(动态):增加,删除,查找,修改
  3. 数据约束:本文设计的完成性约束就在数据约束的范围内

关系数据模型是由E.F.codd提出的

关系模型的数据结构

概念

关系:关系常常被称为二维表,用于描述数据本身,数据之间联系,俗称”表”

:也称字段,属性,在二维表中,每一列都代表一个属性

:域就是指列的取值范围,便于后面的参与约束中的域约束

关系模式:关系模式就是由关系名、各个列构成。表示为:

R(A1, A2, …, An),R为关系名, Ai 为关系R的属性。

联想ER图,关系模式就是1.实体(属性1,属性2,属性3)或者是2.联系(属性1,属性2,属性3)

:有时也称“元组”(Tuple)通常情况下称为:“记录”(Record)。表示为:t=<a1, a2, …, an>,其中ai为对应属性Ai的值。

这个就是指一个具体的实体的具体属性的值的一个记录,例如对于学生这个实体来说,对于具体的一个学生,他的记录为

(Peter,2021114062,计算机01班)

关系实例:记录集或元组集,常简称关系;(记录集就是记录的集合),就是所有具体实体的具体属性的集合

关系实例的表示:{<a1, a2, …, an>,<b1,b2,…,bn>}

例如,假设一个学生表就两名学生,那关系实例为:

{(Peter,2021114062,计算机02班),(Marry,2021114059,计算机01班)}

候选键:候选键就是唯一识别关系实例元组的最小字段集。和ER图中的候选键一个意思

主键:一个唯一识别关系实例的最小字段集合。一个关系最多有一个主键。和ER图一样,就是从候选键中选一个当主键

关系模式:关系的描述,包括关系名,属性名,属性向域的映像,属性间的依赖。其中关系名和属性名属于关系的型,属性像域的映像就是属性的类型、长度

关系模式的特性

  1. 关系是一个集合。集合的元素是元组,每个元组的属性数目应该是相同的

  2. 关系是一种规范化的二维表格,不是一般的二维表格。他的性质如下

1.关系中每一个属性值都是不可分解的;

2.关系中不允许出现重复元组;

3.关系是元组的集合,因此无行序;

4.关系的列是有序的。

关系模型的完整性约束

完整性约束包括三大类

  1. 实体完整性
    1. 主键限制
    2. 唯一限制
  2. 参照完整性
    1. 外键限制
  3. 用户定义完整性
    1. 域约束

实体完整性

概念 :指关系数据库中所有的表哦都有主键,并且不允许存在无主键值或者主键值相同的记录

主键限制

​ 1.概念:针对主键而言,保证了主键的完整性

​ 2.要求:主键必须唯一,且不能为空值

唯一限制

​ 1.概念:针对候选键而言,保证候选键的完整性

​ 2.要求:值为1,允许有一个且仅有一个空值

参考完整性

概念:称引用完整性。在关系模型中,实体与实体之间的联系是用关系表示的,这样就自然存在着关系与关系间的引用

外键:一张表的某个属性(字段)是另一张表的候选键/主键,含有外键的表称为从表,外键在主表做主键

image-20230331195245744

表间数据完整性应该从两个方向来完成

  1. 主表—->从表
  2. 从表—->主表

主表—->从表

对主表的主键进行操作:只列出会影响到从表的操作,剩余操作不会影响

1.修改:可能会影响与该主键相关的从表的外键值。当相应的外键值存在时,有两个策略可用:

  1. 改变对应从表的所有外键值,使之与主键一致
  2. 不允许修改主表中的主键值

2.删除:可能会影响与该主键相关的从表的外键值,若相应的外键存在时,有两个策略可用

  1. 不允许删除主表的主键值
  2. 级联删除从表中相应外键值所在的行

从表—->主表

1.插入:要求插入的外键值应该参照主表中的主键值

2.修改:要求修改的外键值参照主表中主键值

表间数据完整性的维护:

  1. 外键约束
  2. 触发器
  3. 断言

用户定义的完整性

任何RDBMS都应该支持实体的完整性和参照的完整性,除此之外的其他数据库管理系统需要的特殊约束条件来满足用户定义的完整性

在用户定义完整性中最常见的是限定属性的取值范围,即对值域的约束

SQL语言

不同的数据库管理商使用不同的SQL语言,本课程学习的是T-SQL语言

T-SQL语言由SQL语句函数存储过程三部分组成

下面来讲一下SQL语言中最基本的语法

其实,在SQL语言管理软件(SSMS)中,对与数据库和数据表的建立都可以采用GUI交互的形式来建立,但是我们为了对SQL语言更加的了解,以及使用的一般性,仍采用代码的形式来建立

前言

需要注意的是

  • 在SQL语言中没有大小写的区分,对于关键字,既可以大写,也可以小写
  • SQL语言的定义中,对于数据库,二维表,以及属性的定义都可以采用中文,但是SQL语言中的关键字必须采用英文
  • SQL语言中每段话的末尾可以加分号,也可以不加分号

创建数据库

如果我想创建一个homework的数据库,那么应该

1
CREATE database homework

然后在左栏刷新以后

1

就可以看大这个数据库被建立完成

选中数据库

在ssms中,我们需要在刚刚创建的数据库中建立二维表,所以我们在这里选中我们刚刚建立的数据库

image-20230416162753399

建立二维表

我们想在这个数据库中建立一个moviecompany的二维表,应当采用CREATE TABLE的方式

1
2
3
4
5
CREATE TABLE moviecompany
(
SName char(10) PRIMARY KEY,--公司名称
Scountry char (10) NOT NULL--所在国家
)

在这个语句中有几点需要注意的地方

  • moviecompany 代表的就是数据库的名字

  • SName 代表二维表的字段,也就是他的属性,这里可以采用中文

  • PEIMARY KEY代表的是当前的属性是主键

  • NOT NULL 代表的是该属性在插入的时候不能是空值

  • char 代表的就是该属性保存在二维表中的类型 其中的(10)代表最大的长度,如果输入的值小于10,SQL会在后面补空格,但是如果输入的字符大于10,多于10的部分会被截断,可能导致数据的丢失

关键字总结

  • primary key:主键 如果是联合主键的形式就是: PRIMARY KEY (CID,SID)

  • Unique :候选键

  • NOT NULL :不能为空值

  • AS 导出属性:

  • Foreign key references 外键

    • 举例:
    1
    2
    3
    SAge as datepart(yyyy,GetDate())-  
    datepart(yyyy,convert(DateTime,substring(SIDC,7,8))) )

数据类型总结

  • 整数数据类型:BIGINT ,INT,SMALLINT,TINYINT 所能表示的最大值依次减小

  • 浮点数类型: decimal,float,real 所能最大代表的精度依次为:38,15,7

  • 字符数据类型: varchar,char,TXT

其中varchar 和 char 的区别是:

varchar是可变长度的字符串,不足时不会补空格,超过时会自动截断,长度0-255;

  • 日期和时间数据类型
  • Datetime: 用于存储日期和时间的结合体。格式:YYYY-MM-DD hh:mm:ss[.nnn]
  • smalldatetime:格式:YYYY-MM-DD hh:mm:ss
  • date:格式YYYY-MM-DD 精度到天
  • time:格式:hh:mm:ss[.nnnnnnn] 表示一天内的时间

补充常用的日期处理函数

image-20230416164803912

举个例子:

GetDate()返回当前的日期,精确到毫秒

image-20230416164926321

其中最常用的就是DatePart在求年龄的时候使用:

具体使用如下:

1
Age  as  Datepart(yyyy,GetDate())- Datepart(yyyy,BirthDate))

其中BirthDate的变量类型为Datetime

查询二维表

查询使用的是select语句,也十分简单

1
select * from moviecompany

解析: *代表的是moviecompany中的所有元素,当我们查询部分元素使,这个地方要改变,这个我们之后再讲。

​ from 代表的就是从那个二维表中查询,后面接着二维表的名字

image-20230416165736753

查询结果以这样一个二维表的形式展开

实体模型向关系模型的转换

实体模型向关系模型的转换,实际上就是将ER图转换成带有约束的表的集合

每一个实体要转换,联系也要转换成二维表

image-20230416172154212

实体的转换规则

1.复合属性:就是把符合属性的每一条都转换成一种属性放在二维表中

image-20230416172412989

2.多值属性:把多值属性作为外键

image-20230416172458017

联系的转换规则

  1. 关系的属性:与该联系相连的各实体的标识符以及联系本身的属性

  2. 关系的主键:各实体标识符的组合

1:1

1:1 联系可以转化为一个独立的关系模式,也可以与任意一端的关系模式合并

  1. 转换为一个独立的关系模式

关系的属性:与该联系相连的各实体的标识符以及联系本身的属性

关系的候选键:每个实体的标识符均是该关系的候选键

  1. 与某一端对应的关系模式合并

合并后关系的属性:加入对应关系的主键和联系本身的属性

合并后关系的主键:不变

1:n

一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并

第一种:转换为独立的关系模式 特点:联系有属性的时候

  1. 关系的属性:与联系相关的两端实体的标识符号和联系本身的属性

  2. 关系的主键:n端实体的主键

    image-20230416174513249

    第二种:与n端的关系模式合并 特点:联系没有属性的时候

    1. 关系的属性:在n端关系中加入1端关系的主键和联系本身的属性(其实大部分情况下计入1端的主键即可)
    2. 关系的主键:不发生改变

m:n的联系

m:n的就是要把联系单独转换成一个独立的关系模式

举个例子:

image-20230416173117923

在联系转化成关系模型的时候应当为

image-20230416173435538

但是有的时候联系的属性s也是主键,有的时候就不是,这里只能具体情况具体分析了。

m:n:k多元联系的转换方法

见图片

image-20230416192756966

一元联系 – 自联系的转换方法

​ 自联系可以和二元联系一样,分情况讨论,如果是m:n的自联系,那么联系要转换成一个关系模式,如果是1:n或者1:1可以不用转换

下面举一个例子

image-20230416194133242

可以看出,在这个ER图种,学生是1:n的自联系,联系属性为管理,而先导是m:n的自联系,联系的属性为:先导

在进行关系转换的时候

学生可以为:学生(学号,姓名,性别,监管学号,专业编码)监管学号,专业编码为外键。此时管理不单独设置关系,而是以一个不同的属性名字来区分:即监管学号和专业编号

而课程和先导课程是m:n的属性,所以可以采用一个表:先导(课程编码,先导课程编码)课程编码,先导课程编码为外键

给出对应的SQL创建语句

1
2
3
4
5
6
7
8
CREATE  TABLE 学生
( SNo Char(10) primary key,
SName varchar(20) NOT NULL,
SGender char(2) check(SGender in('男','女')),
JSNo char(10) foreign key references 学生(SNo), -- 这一句是监管学号的外键,可以看出联系
SMajor char(8) foreign key references 专业(MNo)
)

1
2
3
4
5
6
CREATE  TABLE  先导
( CNo char(8) foreign key references 课程(CNo),
PCNo char(8) foreign key references 课程(CNo),
Primary key(CNo,PCNo) -- 课程编码和先导课程编码联合做主键
)

关系代数

关系代数和关系运算是数据库理论的基础之一,书中称他们为查询语言

关系代数

基本的运算符:

  1. SELECTION (选择)
  2. PROJECTION (投影)
  3. UNION (并)
  4. INTERSECTION (交)
  5. DIFFERENCE (差)
  6. CROSS-PRODUCT (笛卡尔积)

选择

从关系实例中选出满足条件的行,对关系做横向的剪切

image-20230419101748994

image-20230419102056586

举个例子:

image-20230419102134325

给出SQL代码

1
2
Select * from S where grade>=3
Select* from S where age<20

需要注意的是:* 代表的是所有元素,从所有元素中找出grade>=3的元素,关键字 where

投影

选择是对行进行剪切,投影是对列进行剪切

image-20230419102705903

举个例子
image-20230419102729226

对应的SQL代码为:

1
Select sname,grade from S 

其中的sname和grade都是属性

如果在一个属性中有重复的元组,可以通过如下代码去掉重复的元组

1
Select distinct grade from S

image-20230419103639429

重复的3已经被去掉了

选择与投影结合

其实选择与投影结合可以理解为在数据库上先对行进行切割,再对列进行切割

一定是选择在内部,投影在外部

image-20230419205814403

集合操作

先给出两张表

image-20230419210036021

image-20230419210025881

image-20230419210126658

image-20230419210324538

笛卡尔积

image-20230419210614730

笛卡尔积比较好理解,需要注意的是

  1. 如R中有M个属性p个元组,S中N个属性q个元组,则R×S的结果关系有M+N个属性(列),p × q个元组
  2. 如果有相同的列名,则在结果字段中不命名,只用位置表示

举个例子:

image-20230419210827169

扩展操作符

改名

image-20230503111948741

举个例子 ,在这个表格中有两个sid,所以我们可以通过改名来区分

(sid) sname age grade (sid) cid score
8 何大明 19 2 8 101 91
8 何大明 19 2 6 103 80
11 李峰 20 3 8 101 91
11 李峰 20 3 6 103 80
35 陈胜 21 4 8 101 91
35 陈胜 21 4 6 103 80
6 张大卫 18 1 8 101 91
6 张大卫 18 1 6 103 80

ρ(D(1→sid,5→sid2),S1×E) ,其中1,5是位置信息,也就是sid的列的顺序

改名后的表格为:

sid sname age grade sid2 cid score
8 何大明 19 2 8 101 91
8 何大明 19 2 6 103 80
11 李峰 20 3 8 101 91
11 李峰 20 3 6 103 80
35 陈胜 21 4 8 101 91
35 陈胜 21 4 6 103 80
6 张大卫 18 1 8 101 91
6 张大卫 18 1 6 103 80

除法

对于除法,可以参照下图

image-20230503112458832

需要注意的是,S只是R中黄色区域的一部分吗,R/S得到的是黄色区域部分对应的黑色区域

例如:除(Division)R/S,R÷S

如存在R(x,y)和S(y)两个关系,即R有两个属性x和y,S有一个与R中相同的属性y,则R/S为

结果关系中每一个元组u与S中的每一个元组v组成的新元组(u,v)一定在关系R中。

举个具体的例子,现在有两个表格如下

image-20230503112740405

我们此时想要查询 教师表中 大学名称为TU Darm 的教师的信息 可以直接写为 J/U,得到如下的信息

教师证号 姓名 性别 工作起始日期
20001234 B.Bach 2000.9.1
20040201 A.Schwack 2004.3.22

但是需要注意的是 除法只是一种拓展的关系代数式才可以使用的操作符,在sql语言中没有特定的运算符

1
select 教师证号  , 姓名 ,  性别   ,工作起始日期 from J,U where J.大学名称=U.大学名称

上面的大学表只有一个元素,如果有多个元素,做除法的时候应该如下
image-20230503113953329

联接

联结是本章非常重要的一个内容,所以专门拿一个专题来记录

联结和笛卡尔积的作用相似,哪为什么还要引入笛卡尔积呢?因为:关系的笛卡尔积占用很大的空间,效率不高。为了提高效率,减少空间成本和查询开销,引入了联结

联结相当于image-20230503212443671,但是联结的使用更加的广泛

联结的种类有:1. 条件联结 2. 等联结 3. 自然联结 4. 外联结

条件联接

image-20230503212829502

组合条件式C:<条件1>AND<条件2>AND<条件3>AND…

例子:

image-20230503213129075

需要注意的是

条件联结对于两个表格中相同名字的属性并不会只保留一个,而是全部保留下来。对于有相同名字的属性做联结的时候,应该在属性的前面标志所在的表。例如S1.sid 和 E.sid

SQL语言描述

1
2
3
4
SELECT  S1.sid, sname, age, grade,
E.sid, cid, score
FROM S1 CROSS JOIN E
WHERE S1.sid > E.sid

或者

1
2
3
4
SELECT  S1.sid, sname, age, grade,
E.sid, cid, score
FROM S1,E
WHERE S1.sid > E.sid

可以看出条件联结的SQL关键字可以与笛卡尔积一样,都是,

等连接

等连接是条件联结的特例,当条件联结的条件是=的时候使用等连接。使用等连接的两个表对应的属性可以名字不同,但是属性的数据类型必须相同

举个例子

image-20230503214257891

1
2
3
SELECT  S1.sid, sname, age, grade,   cid, score  
FROM S1 ,E -- S1 与E的笛卡尔积,也可以使用联接
WHERE S1.sid = E.sNo

自然连接

自然连接是等连接的特例,当等式中涉及的字段名字也相同的时候可以省略联结条件

image-20230503215017130

当上个图片中的sNO也是Sid的时候,就可以直接使用自然连接

关键字为NATURAL JOIN

1
2
SELECT  S1.sid, sname, age, grade,cid, score  
FROM S1 NATURAL JOIN E

自然连接会自动去掉重复的字段值

很可惜的是,在MySQL和Oracle 可以直接使用

1
SELECT FROM  S1 NATURAL JOIN  E

这种形式来支持自然连接,但是在SQL Server不支持这个关键字,所以我们只能把需要得到的属性列出来,就像这样 SELECT S1.sid, sname, age, grade,cid, score

自然联接的例题

image-20230503220441421

对应的SQL代码为

1
2
3
4
5
6
SELECT DISTINCT S.Sid, S.Sname
FROM S, C, T, SC
WHERE S.Sid = SC.Sid
AND C.Cid = SC.Cid
AND T.Tid = C.Tid
AND T.Tname = 'Liu'

通过代码我们可以理解为什么上面的关系代数式要求使用自然连接了。以学生为例子,要查找一个学生,要根据S.sid=SC.Sid才能唯一确定一个学生,S.sid!=SC.Sid 说明不是一个自然连接

外连接

image-20230503221523548

左外连接

image-20230503220844310

左外联结的实际结果以操作符左边的关系为准,即左边关系中被选择的行均应出现在结果中,如果在右边关系中没有对应的行,则在结果中以NULL表示

关键字:NATURAL LEFT OUTERJOIN

1
2
SELECT  S1.sid, sname, cid, score  
FROM S1 NATURAL LEFT OUTERJOIN E

右外连接

与左外连接类似

右外联结的实际结果以操作符右边的关系为准。

image-20230503221051984

SQL关键字:NATURAL RIGHT OUTER JOIN

1
2
SELECT  E.sid,cid, sname FROM
S1 NATURAL RIGHT OUTER JOIN E

全外连接

在全外连接中所有没有匹配上的行都以NULL的形式出现在结果中

课后习题

image-20230419213242544