数据库杂谈(三)——关系代数

2023-10-30

3 形式化关系查询语言

摘要:关系代数是一种抽象的查询语言,用对关系的运算来表达查询,作为研究关系数据语言的数学工具。在本文中,我们不仅谈论关系代数的知识点,而且还配备了对应的练习题。

3.1 关系代数

3.1.1 概述

说明:关系代数语言是一种过程化查询语言,它包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。

关系代数一般包含五个基本操作,如果一个系统或者数据库产品包含这五个基本操作,那我们认为这个系统的功能是完备的

任何的操作都可以通过这五个操作来组合完成,如下所示:

操作名 英文 符号
选择操作 select operation σ σ σ
投影操作 project operation π
笛卡尔乘积 Cross product ×
集合差操作 Set - diffrent
集合并操作 union

选择投影和更名为一元运算,因为它们只对一个关系进行操作;而另外三个对两个关系进行运算,故为二元运算。

事实上,目前流行的关系数据库中,除了满足关系完备性以外,还增加了不少关系代数所不支持的操作,如排序分组聚集函数,甚至是传递闭包的计算。

提示:需要注意的是,在一些书上关系代数也叫做关系代数操作,简称关系操作。在《数据库原书(第6版)》中,出现了更名这一基本操作,但是在大多数的考试中,基本操作还是以上表为准。

在学习的过程中,对于考试我们不仅需要掌握关系代数符号,还需要掌握会写关系代数表达式。


3.1.2 选择操作

说明:选择操作就是加限制条件选元组,作用相当于SQL中的where子句。

image-20221018165658250

提示:需要注意的是,基本操作都是支持多种运算的组合的,比如选择和投影和连接和集合运算一起使用,这都是可以的,但是要注意先后顺序,这在后面我们会给出演示。


3.1.3 投影操作

说明:投影就是选取关系中的某些列,即选取某些属性,作用相当于SQL中的select子句。

image-20221018165915022

提示

  • 投影后的表由于有可能不包含候选键,这就会导致有些元组可能是重复的,这时候系统会自动消除重复元组,所得关系(表)的元组数小于原关系的元组数。如果投影后的表包含候选键,那么元组数和投影前一样。
  • 在实际的数据库产品中,数据库投影后他是不会自动去重的,因为数据库他不能保证用户对重复的数据是否有应用价值,所以,除非你要求,不然他不会自动去重。

3.1.4 集合操作

3.1.4.1 笛卡尔乘积

说明:集合操作指的是笛卡尔乘积

在表的连接查询方面有一种现象被称为:笛卡尔积现象(笛卡尔乘积现象),也就是说,你可以理解为两张表做笛卡尔乘积,等于两张表中所有元组两两匹配的所有结果,如图所示:

image-20221018165900709

关系一有6条元组,关系二也是6条,那么做笛卡尔乘积,所得的关系就是36条元组。

当然,我们说的连接,实际上就是加了条件的笛卡尔乘积。


3.1.4.2 并交差操作

说明:这个概念和我们数学中集合的概念是一样的,但是对于数据库来说,它会出现一些问题。

image-20221018165849657

如果是以上的两张表做并操作,那么这是完全没有办法的,老师表中的属性和学生表的属性完全不一样,你总不能直接把数据贴上去吧?对此,我们引入了并兼容这个概念。

并兼容要求参与并交差的两个关系的元组必须限制为同类型,也就是相同目,对应的属性的域也需相同。


3.1.5 连接操作

说明:连接其实和笛卡尔乘积很像,连接实际上就是一个加了条件的笛卡尔乘积,他只找出那些满足条件的元组。其符号为 ⋈ \bowtie

一般来说,我们的连接符号代表的都是自然连接,即笛卡尔乘积加上默认条件外键相等。下面举个例子:

image-20221018165528609

如果是对这两张表做连接,其结果实际上为:

Sno Cno Grade Sno Sname Ssex
S01 C01 92 S01 王二
S02 C02 90 S02 张三
S02 C03 82 S02 张三
S03 C01 80 S03 李四

其默认Sno为外键,通过外键进行连接了。


3.1.6 更名操作

说明:如果你在一条关系代数表达式中引用了两张同样的表,例如学生表连接学生表,为了没有歧义,你可以使用更名,更名用希腊字母rho( ρ \rho ρ)来表示,对于你指定的关系代数表示式E,表示式 ρ x ( E ) \rho_x(E) ρx(E)返回表示式E的结果,并把名字x赋给了它。

实际上,还可以把更名的表示式写出 ρ ( A 1 , A 2 . . . , A n ) ( E ) \rho_{(A_1,A_2...,A_n)}(E) ρ(A1,A2...,An)(E),其中 A n A_n An表示E得出来的结果对表中各属性进行重命名。

比如 ρ 学生表 1 ( 学生表 ) \rho_{学生表1}(学生表) ρ学生表1(学生表)就是一个更名。

提示:在考试中根本不需要更名操作,因为考试出的题很少出现歧义问题。


3.1.7 除操作

说明:除法操作不好用定义来解释,如图所示:在<a1,b1>里和<a2,b2>里,明显对应的R.3和R.4都包含了S表,所以{<a1,b1>,<a2,b2>}就是除法的结果。其他不含S表的<a3,b3>可以看做结果的余数。

image-20221018165428057

提示:除法操作并不是基本操作,这就说明其可以由基本操作来表示。这在考试中如果故意刁难是会涉及到的。


3.1.8 外连接

引入:想要知道什么是外连接,就要知道什么是内连接。

  • 内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,就是内连接,AB两张表没有主副之分,两张表是平等的。
  • 外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

外连接分类

  • 左外连接(左连接):表示左边的这张表是主表。

  • 右外连接(右连接):表示右边的这张表是主表。

提示:左连接有右连接的写法,右连接也会有对应的左连接的写法。为什么这么说,当你左连接想写成右连接的时候,你把表对调一下就可以了。

说明:连接的本质是加上了条件的笛卡尔积,也就是说表1和表2做连接,那么是表1的元组去匹配满足条件的表2的元组,不满足条件则不录入结果表;但是对于左外连接,表1的所有元组都会在结果表中,即使它没有匹配到符合条件的表2元组,它也会存在,且匹配不了的表2元组在结果表位置用NULL填充。


3.1.9 外并操作

说明:我们前面说过,两个表若不满足并兼容是不可以进行集合并交差操作的,但是可以进行外并操作,即强行整合两表,结果的属性是两表属性的总和,如果其他表没有另外一个表的属性,那么那一列会被填上NULL。


3.1.10 赋值操作

说明:我们如果不想写出一条关系代数表达式来表示某个结果,而想拆分成两个步骤,那么我们可以使用赋值操作,其符号为 ← ← 。例如:

temp1 = R×S

temp2 ← σ s n o = S 01 ( S ) σ_{sno = S01}(S) σsno=S01(S)

result ← temp1×temp2

提示:实际上,这个更名操作在考试中根本用不到,因为你通常都是通过嵌套的方式一口气写完一整条的关系代数表达式,而不会写出来两条。


3.1.11 练习

题目描述:设有一个零件供应关系数据库,它包括S、P、J、SPJ四个关系,请按要求写出关系代数表达式。

image-20221018165409444

image-20221018165359408

image-20221018165346818

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库杂谈(三)——关系代数 的相关文章

  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 如何使用 django ORM 在外键字段上连接两个表?

    假设我有以下模型 class Position models Model name models CharField class PositionStats models Model position models ForeignKey P
  • rake db:migrate db:reset 和 db:schema:load 之间的区别

    和 之间的不同rake db migrate and rake db reset我很清楚 我不明白的是如何rake db schema load与前两者不同 只是为了确保我在同一页面上 rake db migrate 运行尚未运行的迁移 r
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • 如何处理数据库中的巨大结果集

    我正在设计一个多层数据库驱动的 Web 应用程序 SQL 关系数据库 用于中间服务层的 Java 用于 UI 的 Web 语言其实并不重要 中间服务层执行数据库的实际查询 用户界面只是要求某些数据 并不知道它是由数据库支持的 问题是如何处理
  • 在 C# 中读取/写入大型 XML 文件

    我正在开发一个带有 XML 数据库的应用程序 我有很大的 XML 文件 我必须在其中读取和写入数据 问题是我不想将整个 XML 文件加载到内存中 也不想因为性能问题而循环遍历整个文件 因为如果我将整个文件加载到内存中 这将影响应用程序性能
  • Oracle 中仅在一列上不同

    我想在下表中使用不同的值 但仅在 PlayerID 列上使用 这就是我现在所拥有的 MATCHID PLAYERID TEAMID MATCHDATE STARTDATE 20 5 2 14 JAN 12 01 JUN 11 20 5 4
  • 如何更新表以添加主键并使用递增的 ID 更新所有现有行?

    我导入了一个包含 20 000 行数据的表 但我忘记在其上放置主键 以便每一行都有一个唯一的键 我希望第一行从 ID 1 开始 一直递增到最后一行 最后在 ID 20000 处结束 如何使用单个查询更新所有行 我正在使用MySQL 已尝试使
  • 哪个数据库对复制的支持最好

    我对 MySQL 复制的功能有相当好的感觉 我想知道还有哪些其他数据库支持复制 以及它们与 MySQL 和其他数据库相比如何 我的一些问题是 复制是内置的还是附加组件 插件 复制是如何工作的 高级 MySQL 提供基于语句的复制 5 1 中
  • 将字典中的值插入到 sqlite 数据库中

    我无法理解它 我想将字典的值插入到 sqlite 数据库中 url https api flickr com services rest method flickr photos search api key 5f 1b per page
  • 如何将 pyodbc 连接到 Access (.mdb) 数据库文件

    这是我尝试过的 通过搜索找到Vista的ODBC数据源管理器 添加新的文件数据源 选择 Microsoft Access 驱动程序 mdb 然后选择我感兴趣的 mdb 文件 从 python shell 导入 pyodbc 并尝试 pyod
  • 在 SQL 数据库中存储自定义字段的首选方式是什么?

    我的朋友正在开发一款供不同独立医疗单位使用的产品 该数据库存储了在不同时间进行的大量测量数据 例如体温 血压等 让我们假设它们保存在一个名为的表中exams有柱子temperature pressure等 以及id patient id a
  • 在哪里可以找到 neo4j 快速教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Laravel 插入三向数据透视表

    Summary 我正在构建音乐发现服务 我的问题是 如何将数据插入三向数据透视表 标签 跟踪 用户 Schema 我看到了这个架构在 LaravelSD http www laravelsd com share WNmzz8 它由六个主表
  • 按钮 Onclick 调用 Javascript,后者调用 PHP 文件,该文件添加到 Mysql 数据库

    我需要添加到数据库的帮助 我想从按钮单击方法调用 javascript scrt Javascript 脚本 我想调用一个 php 文件 其中包含一些添加到 MySQL 数据库的代码 我确实尝试了 20 多个网站 但没有任何帮助 如果 AJ
  • 不同的数据库使用不同的名称引用吗?

    例如 mysql引用表名使用 SELECT FROM table name 注意 其他数据库是否使用不同的字符来引用其表名 这种引号的使用称为分隔标识符 它是 SQL 的重要组成部分 因为否则您将无法使用以下标识符 例如表名和列名 包含空格
  • 有效存储和查询 GPS 坐标

    我想创建一个大型 GPS 坐标数据库 可以通过 返回 此坐标 n 米范围内的所有坐标 来查询该数据库 我需要它尽可能高效 因此循环遍历数据库中的所有坐标并计算坐标是否在 n 米内并不是理想的解决方案 有更简单的解决方案吗 Thanks 我通
  • 浏览器关闭后从数据库中删除

    我正在开发一个电子商务应用程序 但问题是 当用户将产品添加到购物车并在订购前关闭浏览器时 购物车会带走所有产品 所有购物车项目都保存在表中 如果用户关闭浏览器而不订购 我只想刷新购物车 您可以使用 Javascript 事件捕获浏览器关闭并
  • 保存用户的身高和体重

    我应该如何将用户的身高和体重存储在MySQL数据库中 以便我可以使用这些信息来查找特定身高或体重内的用户 另外 我需要能够以英制或公制显示此信息 我的想法是存储以厘米为单位的身高和以公斤为单位的体重信息 我更喜欢公制而不是英制 我什至可以让
  • 数据库约束与应用程序级验证[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在研究这个主题时 我发现了这篇文章 您是否应该在数据库级别和应用程序级别强制实施约束 https stackoverflow com quest

随机推荐

  • 基于卷积神经网络的高光谱分类 CNN+高光谱+印度松数据集

    基于卷积神经网络的高光谱分类 一 研究现状 只考虑到高光谱图像的光谱特征 即 1 提取特征 小波变换 Gabor纹理分析 形态学剖面 2 利用分类方法分类 支持向量机 决策树 随机森林 神经网络 缺点 这些特征提取方法需要依据先验知识手动设
  • 【YOLOv5 数据集划分】训练和验证、训练验证和测试(train、val)(train、val、test)

    YOLOv5 数据集划分 训练和验证 训练验证和测试 train val train val test 在已有测试集的情况下划分训练集和验证集 将图片和标注数据按比例切分为 训练集和测试集 import shutil import rand
  • ORACLE 根据分组排序产生序列号

    对应的语法是这样的 select row number over partition by col1 order by col2 seq 具体的场景如下 如果一张表中保存了整个年级的各个班级每个同学的语文成绩 create table Sc
  • Linux系统常用命令

    操作系统 作用 是管理好硬件设备 并为用户和应用程序提供一个简单的接口 以便于使用 作为中间人 连接硬件和软件 linux 安全 稳定 免费 占有率高 嵌入式操作系统 linux发展历程 unix gt minix gt linux 发行版
  • 自定义oh-my-zsh主题风格,代码和语法的解释

    自定义oh my zsh主题风格 代码和语法的解释 摘要 简要介绍 zsh theme的代码 不涉及函数 关键词 ohmyzsh zsh theme语法 https github com ohmyzsh ohmyzsh wiki Theme
  • ubuntu20.04为AppImage创建快捷启动器

    前言 作为一名java开发者 平时用得到的一些开源的或者实用的开发工具 他们有的都是打包为AppImage格式 这种格式的优越性在于它是临时挂载在我们的文件系统上以便运行 使用这种方法 开发人员可以将他们的应用程序打包到一个 AppImag
  • Kotlin和Android:一种语言背后的JetBrains和Google

    Google I O 2017 宣布了几项重要公告 但对我而言 最有趣的一个是Android上的 对Kotlin的一流支持 关于此公告的Kotlin博客文章讨论了这给Kotlin用户带来的好处 如果您担心Kotlin支持的其他平台 服务器和
  • React-Native开发中常用的第三方控件持续更新

    十一假期已经过去了 今天正式开工了 这里的文章我会持续进行更新 希望为开发的小伙伴们提供点帮助 如果能帮到你们 我就心满意足了 十一假期学习撸了一个小程序 欢迎各位朋友进行关注 代码已经在gitHub上开源 清风天气 清风天气 2018 1
  • python三种基本数据类型_python基础数据类型

    python常用的数据类型包括整型 int 字符串 str 布尔值 bool 列表 list 元组 tuple 字典 dict 集合 set 整型 int int操作方法 bit length 就是查看十进制数转换成二进制在内存中占用了多少
  • 第三届阿里云磐久智维算法大赛——GRU BaseLine

    赛题 比赛链接 第三届阿里云磐久智维算法大赛 天池大赛 阿里云天池 aliyun com 大赛概况 庸医只知头痛医头脚痛医脚 凡良医者 必会抽丝剥茧 察其根本 方得药到病除 第一届和第二届磐久智维算法大赛 我们针对异常预测开展了积极的探索和
  • QGIS3.10编译指南

    下载所需要软件 安装VS2015以及版本5以上的QT 根据我的电脑环境 我使用vs2015 x64 和 QT5 10 1版本 并将QT配置到VS上 安装CMake 有需要的再额外安装Python37 安装doxyden 除VS默认加入环境路
  • web服务器压力测试工具---ab

    文章目录 写在前面 1 吞吐率 Requests per second 2 并发连接数 The number of concurrent connections 3 并发用户数 The number of concurrent users
  • C++之虚函数

    都说面向对象的三大特性是封装 继承 多态 C 作为一门面向对象编程语言 肯定也是具备了面向对象的三大特性 那么在C 中是如何实现多态的呢 在C 中是通过虚函数动态绑定的方式实现多态的 虚函数与纯虚函数 首先我们来回顾一下虚函数 在C 中是使
  • Vue3 defineProp传参以及defineEmits事件传递详细解释

    defineProp父子组件传参 vue3中引用另一个组件非常简单 不再需要设置各个组件的name 直接import导入即可 下方代码 父组件为PropSuper vue 子组件为PropBase vue
  • [关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

    本文主要讲解Gephi绘制作者间的关系图谱 该软件可以广泛应用于社交网络 知识图谱分析 推荐读者使用 这是非常基础的一篇文章 重点讲解Gephi使用方法 希望对大家有所帮助 推荐前文 python数据挖掘课程 十七 社交网络Networkx
  • 算法知识点

    维生素C吃多了会上火 个人CSDN博文目录 2022蓝桥杯 目录 语法 基础算法 提升算法 语法 指针 标准输入输出 队列 结构体 c STL 基础算法 排序算法 树 二叉树 提升算法
  • Ping工具ICMP报文学习

    首先 这里有一个很好的博客 入口 先说个结论 Ping是通过IP ICMP协议发出去的 这跟我们传统UDP和TCP不一样 其通过创建套接字直接从IP层接受数据 具体可以参照上述文档 为什么ICMP的ping和tracert不经过tcp或ud
  • 面向对象编程的三大特性

    面向对象编程主要体现为三个特性 1 封装性 面向对象编程的核心思想之一就是将数据和对数据的操作封装在一起 通过抽象 即从 具体的实例中抽取出共同的性质形成一般的概念 例如类的概念 Java 中属性的封装 无特殊情况都是用的 private
  • InputAction的使用

    感觉Unity中InputAction的使用 步步都是坑 需求点介绍 当用户长按0 5s 键盘X或者VR left controller primaryButton 即X键 时 显示下一个图片 步骤总览 创建InputAction资产 将该
  • 数据库杂谈(三)——关系代数

    3 形式化关系查询语言 摘要 关系代数是一种抽象的查询语言 用对关系的运算来表达查询 作为研究关系数据语言的数学工具 在本文中 我们不仅谈论关系代数的知识点 而且还配备了对应的练习题 文章目录 3 形式化关系查询语言 3 1 关系代数 3