关系代数
关系代数
本文并非原创,而是自己整理老师课件所得。
概述
关系代数是关系数据库的数学基础,在关系数据库中的查询常常通过关系的运算来表示。因此关系代数就是一种抽象的查询语言。
对于关系代数,运算的三要素是:
-
运算对象:关系
-
运算符:
-
集合运算符
交、并、差、广义笛卡尔积
-
专门的关系运算符
选择、投影、连接、除
-
算术比较符
大于、小于、等于
-
逻辑运算符
与、或、非
分为基本运算和导出运算
-
-
运算结果:关系
记号
设关系模式为
若
给定一个关系
表示
比如关系为(性别,这个班同学的名字),那么“女”在[班上所有名字]中的象集为班上所有女生的名字。
运算符
先看基本运算。
选择
格式:
选择关系
选择条件:分为三类
记A、B是属性组,op是算术运算符,v是常数。
- A op v:比如age < 20
- A op B:比如birthplace=residence
- 前两种情况用and/or/not混合起来
投影
格式:
返回所有元组中,列出的属性组中的值(选择列)。
投影会自动去除重复的元组。
同时使用选择和投影即可从表中选择行列。
笛卡尔积
格式:
返回
如果
满足交换律,
并
格式:
选择要么属于
即,它们必须有相同数量的属性,对应的属性要有同样的域和名字。
并也会自动去除重复的元组。
差
格式:
返回所有属于
再看导出运算,会注明是如何由基本运算导出的。
交
格式:
返回同时属于
连接
格式:
返回
等值连接:当且仅当连接条件中使用等号。
自然连接:直接用
- 两个关系中所有同名属性都用等式条件
- 所有同名属性最后只留一个
很像把两张纸粘起来,相同的那一列就是用来粘贴的边缘,粘完之后边缘重叠(只留一列)。
外连接:
在自然连接中,两个关系中没有被选的(同名属性的值不相等的)元组叫做dangling tuples。
外连接保留了这些元组,并且用NULL填充空值。
左/右外连接分别为
除
格式:
需要满足所有在
考虑
令
这个除会返回
上式也就是从
另一种定义
-
(也就是前面的 ) -
对
中的每一个元组 ,在 中都有元组 同时满足以下两式: (总有 中的元组,在 属性的那部分上,和 的元组是一样的值) (且,不在 属性的那部分,是一个符合上一点定义的 )
例题
找出修过的课包含“学号123456的学生修过的所有课”的所有名字和GPA。
-
找到学号123456的学生修过的所有课
先在Takes中选择学号为123456对应的行,再选Course列,得到一个单元格。
-
找到所有上过SELECTED COURSE的学生学号
从Takes中选择Course=SELECTED_COURSE的行,保留除Course以外的列,此处即Sno。
-
得到对应这些Sno的名字和GPA
这里的连接其实相当于选择Students的行,这些行和SNOs中Sno一样,然后再选择列,Name和GPA。
找出参与了每一个项目的员工的名字。
-
从Projects中找到Proj列,这就是所有项目
-
从Participation中找到对应Proj取值的行,再取不要Proj列的列,即Sno列
-
从Employees中找到对应Sno取值的行,再取Name列
碎碎念
前面都没什么难的,主要是连接和除有些麻烦,但是理解了会发现并不难!还有例题里面需要用到他们的大混合。
写完这篇好像用了三个半小时,天啊……是我理解得太慢了还是编辑这些东西本身就会费时间一点,不过无所谓了!
在此委婉地表达一下我对我正在上的数据库这门课讲授方式的不适,不太现代化,又喜欢突然讲道理上价值,我基本不太愿意听下去。以此作为自学的出口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)