数据库系统概念 | 第六章:形式化关系查询语言 | 含带答案习题

news2024/11/27 14:51:51

文章目录

  • 📚关系代数
    • 🐇基本运算
      • 🥕选择运算
      • 🥕投影运算
      • 🥕关系运算的组合
      • 🥕集合并运算
      • 🥕集合差运算
      • 🥕集合交运算
      • 🥕笛卡尔积运算
      • 🥕更名运算
      • 🥕一道综合例题
    • 🐇附加运算
      • 🥕自然连接运算
      • 🥕赋值运算
      • 🥕外连接运算
    • 🐇扩展运算
      • 🥕广义投影
      • 🥕聚集运算
      • 🥕除运算
  • 📚元组关系演算
    • 🐇概述
    • 🐇元组关系演算查询示例
    • 🐇形式化定义
    • 🐇表达式的安全性
    • 🐇运算符的优先次序
    • 🐇等价性
      • 🥕元组关系演算中的等价性
      • 🥕元组关系演算与关系代数的等价性
  • 📚域关系演算
    • 🐇形式化定义
    • 🐇查询事例
    • 🐇表达式的安全性
  • 📚习题练习

📚关系代数

🐇基本运算

🥕选择运算

  • 选择运算选出满足给定谓词的元组。
  • 我们用小写希腊字母sigma(σ)来表示选择,而将谓词写作sigma的下标参数关系在sigma后的括号中。
  • 通常,我们允许在选择谓词中进行比较,使用的是=等。另外,我们可以用连词将多个谓词合并成一个较大的谓词
  • 示例:
    在这里插入图片描述

🥕投影运算

  • 投影运算是一元运算,它返回作为参数的关系,但把某些属性排除在外。由于关系是一个集合,所以所有重复行均被去除。
  • 投影用大写希腊字母pi表示,列举所以我们希望在结果中出现的属性作为pi的下标作为参数的关系在跟随pi后的括号中
  • 示例:
    在这里插入图片描述

🥕关系运算的组合

  • 关系运算的结果自身也是一个关系。一般来说,由于关系代数运算的结果同其输入的类型一样,所以我们可以把多个关系代数运算组合成为一个关系代数表达式
  • 示例:
    在这里插入图片描述

🥕集合并运算

  • 要使运算r∪s有意义,我们要求以下两个条件同时成立
    • 关系rs必须是同元的,即它们的属性数目必须相同
    • 对所有的ir的第i个属性的域必须和s的第i个属性的域相同

    域:属性的取值范围;r和s可以是数据库关系或者作为关系代数表达式结果的临时关系

  • 和集合论中的“并”运算一样用∪表示。由于关系是集合,所以重复值只留下了单个元组
  • 示例:
    在这里插入图片描述

🥕集合差运算

  • 要使运算r - s有意义,我们同样要求以下两个条件同时成立
    • 关系rs必须是同元的,即它们的属性数目必须相同
    • 对所有的ir的第i个属性的域必须和s的第i个属性的域相同
  • 集合差运算使得我们可以找出在一个关系中而不在另一个关系中的那些元组。表达式r - s的结果即一个包含所有在r中而不在s中的元组的关系
  • 示例:
    在这里插入图片描述

🥕集合交运算

  • 要使运算r n s有意义,我们同样要求以下两个条件同时成立
    • 关系rs必须是同元的,即它们的属性数目必须相同
    • 对所有的ir的第i个属性的域必须和s的第i个属性的域相同
  • r n s=r - (r-s)

🥕笛卡尔积运算

  • ×表示的笛卡尔积运算使得我们可以将任意两个关系的信息组合在一起。

关系定义为一组域上的笛卡尔积的子集。

  • 命名规则
    • 规则①
      • 由于相同的属性名可能同时出现在r1和r2中,所以采用的方法为找到属性所来自的关系,把关系名称附加到该属性上。
      • 对那些只在两个关系模式之一中出现的属性,我们通常省略其关系名前缀,这样的简化不会用任何歧义。
      • 这个命名规则规定作为笛卡尔积运算参数的关系名字必须不同。但这一规定存在问题,以下两个情况都将使用更名运算(具体见下一个胡萝卜)来避免这些问题:
        • 🔑当某个关系需要与自身做笛卡尔积时;
        • 🔑在笛卡尔积中使用关系代数表达式的结果时;
      • 示例:
        在这里插入图片描述
    • 规则②
      • 一般来说,如果有关系r1(R1)和r2(R2),则关系r1×r2的模式是R1和R2串接而成的。关系R中包含所有满足以下条件的元组t:r1中存在元组t1且r2中存在元组t2,使得t[R1]=t1[R1]且t[R2]=t2[R2]
  • 示例
    • 假设我们希望找出物理系的所有教师,及其所教授的所有课程。为了实现这一要求,我们同时需要关系instructor和关系teaches中的信息。或许我们可以直接写成下面的表达式:
      在这里插入图片描述
    • 但是显然这样会造成一个结果,那就是最后所得的关系中包含物理系的教师,但course.id却可能包含除物理老师以外的老师教授的课程(因为笛卡尔积中保留了所有可能由一个来自instructor的元组和一个来自teaches的元组构成的元组对),如下表所示:
      在这里插入图片描述
  • 显然表中只有teaches.id=22222的课程才是Einstein物理老师教授的课程,剩下的课程是因为teaches关系串接而出现的,并不符合连接后对表的需求(instructor.id和teaches.id没有一一对应),因此我们用下面的表达式来纠正这个instructor.id和teaches.id不对应的问题
    在这里插入图片描述

🥕更名运算

  • 通过小写希腊字母ρ表示更名运算。对于给定关系代数表达式E,表达式 ρ x ( E ) ρ_x(E) ρx(E) 返回表达式E的结果,并把名字x赋给了它
    • 允许我们命名或重新指定关系代数表达式的属性
    • 允许我们给一个关系指定新的名字
  • 单元表达式
    在这里插入图片描述
  • n元表达式
    • 假设关系代数表达式E是n元的,则以下表达式返回表达式E的结果,并赋予它名字x,同时将各属性更名为A1,A2,…,An
      在这里插入图片描述

🥕一道综合例题

查询“找出大学里的最高工资”

思路:最高工资 = 所有工资 - 除最高工资以外的工资

  • 步骤一:计算笛卡尔积instructor×instructor,区别好两个关系中的salary属性用于比较(为了无歧义的引用两次该属性,对第二个instructor关系使用更名运算,将其更名为关系d),然后比较这个笛卡尔积中两组salary属性值,选出除最高工资以外的工资(其原理是只要关系d中有salary比instructor大即可,是一个存在的全称量词——即存在salary属于d,大于salary属于instructor即可
    在这里插入图片描述
  • 步骤二:所有工资减去除最高工资以外的工资即为最高工资,并进行投影运算
    在这里插入图片描述

🐇附加运算

🥕自然连接运算

  • 二元运算自然连接使得我们可以将某些选择和笛卡尔积运算合并为一个运算。我们用连接(join)符号来表示
  • 自然连接运算首先形成它的两个参数的笛卡尔积,然后基于两个关系模式中都出现的属性上的相等性进行选择,最后还要去除重复性
  • 它的便利性体现于自然连接运算只考虑在属性上值相同的元组对
  • 自然连接的形式化定义在这里插入图片描述
  • 自然连接是可结合的

示例:找出计算机系的所有老师,以及他们教授的所有课程的名称在这里插入图片描述

  • 自然连接和笛卡尔积的联系在这里插入图片描述

自然连接自动连接所有同名列,但如果两个关系没有同名列,就进行笛卡尔运算

  • 自然连接扩展——theta连接,它使得我们可以把一个选择运算和一个笛卡尔积运算合并为单独的一个运算在这里插入图片描述

🥕赋值运算

  • 有时通过给临时关系变量赋值的方法来写关系代数表达式会很方便(可以理解为一种临时命名从而简化的操作)
  • 赋值运算用表示,与程序语言中的赋值类似。使用赋值运算,我们可以把查询表达为一个顺序程序。
  • 对关系代数查询而言,赋值必须是赋给一个临时关系变量。对永久关系的赋值形成了对数据库的修改。
  • 例如:对自然连接从赋值运算的角度定义在这里插入图片描述

🥕外连接运算

扩展笔记——第四章:中级SQL,指路外连接,外连接的具体功能规则即sql规则,外连接运算可以用基本关系代数运算表示

  • 外连接运算是连接运算的拓展,可以处理缺失的信息。一般地,参加连接的一个或两个关系中的某些元组可能因存在空值而“丢失”。外连接运算与自然连接运算相似,不同之处在于它在结果中创建带空值的元组,以此来保留在连接中丢失的那些元组

  • 左外连接
    在这里插入图片描述

  • 右外连接
    在这里插入图片描述

  • 全外连接
    在这里插入图片描述

🐇扩展运算

🥕广义投影

  • 广义投影允许在投影列表中使用算术运算和字符串函数等来对投影进行扩展在这里插入图片描述
  • 通常来说,在表达式中可以使用对数值属性或者产生数值结果的表达式的+、-、*、/等代数运算。广义投影还允许其他数据类型上的运算,比如对字符串的拼接。在这里插入图片描述

🥕聚集运算

可以用来对值的集合使用聚集函数。sum:求和&avg求平均&count计数&min/max求最小值最大值

  • 聚集运算的通常形式
    在这里插入图片描述

使用聚集函数对其进行操作的汇集中,一个值可以出现多次,值出现的顺序是无关紧要的,这样的汇集是多重集。集合是多重集的特例。

  • 属性名更名用as子句
    在这里插入图片描述
  • 去重:用连字符将“distinct”附加在函数名后(如count-distinct在这里插入图片描述
  • 分组聚集
    在这里插入图片描述
    • 示例一
      在这里插入图片描述
    • 示例二
      在这里插入图片描述

🥕除运算

除运算讲解补充优质博客

  • 象集的定义
    在这里插入图片描述
    • 定义理解:R的属性任意分成两组A,B,任给值a, r中A部分等于a的行,在B上的投影形成一个象集。每个具体的a,都有一个象集,可能是空。
      在这里插入图片描述
  • 除运算定义
    在这里插入图片描述
    • 注意事项
      (1)除运算是包含判断
      (2)对语义“全部”、“所有”的处理
      (3)除运算要凑准格式

    • 示例
      在这里插入图片描述
      在这里插入图片描述

📚元组关系演算

🐇概述

  • 元组关系演算是非过程化的查询语言。它只描述所需信息,而不给出获得该信息的具体过程。元组关系演算中的查询表达式为{t|P(t)}

    它是所有使谓词P为真的元组t的集合

    • 和前面的记法一样,我们用 t[A]表示元组t在属性A上的值,并用t∈r表示元组t在关系r中

    • ∃ t∈r(Q(t)) 表示关系r中存在元组t使谓词Q(t)为真。

      常用于“假设我们只需要ID属性,而不是关系instructor的所有属性”这类要求

    • ∀ t∈r(Q(t))表示对关系r中的所有元组t,Q均为真

🐇元组关系演算查询示例

  • 查询找出工资大于80000美元的所有教师的ID
    在这里插入图片描述

    表达式解读

    • 它是所有满足如下条件的元组t的集合:在关系instructor中存在元组s使t和s在属性ID上值相等,且s在属性salary上的值大于80000美元。
    • 元组t只定义在ID属性上(相当于投影)
  • 查询找出位置在Waston楼的系中的所有教师姓名
    在这里插入图片描述

  • 查询找出在2009年秋季学期或者2010年春季学期或者这两个学期都开设的所有课程的集合(集合并
    在这里插入图片描述

  • 查询找出2009年秋季学期开设而2010年春季学期不开的所有课程
    在这里插入图片描述

  • 查询找出所有那些选了生物系全部课程的学生
    在这里插入图片描述

    表达式解读

    • 全称量词在这里表示,对关系course_id中所有的元组u,如果u在dept_name属性上的值是Biology,那么关系takes中一定存在一个包含该学生ID以及课程course_id的元组
    • 特别注意在这里插入图片描述

🐇形式化定义

  • 已知元组关系演算表达式为 {t | P(t) }, P是一个公式,公式中可以出现多个元组变量,如果元组变量不被∃或∀修饰,则称为自由变量
    在这里插入图片描述
  • 元组关系演算的公式由原子构成
    • 原子的形式
      在这里插入图片描述
      在这里插入图片描述

🐇表达式的安全性

  • 为了对元组关系演算进行限制,引入元组关系公式P的域(用dom§表示)这一概念。(它是P所引用的所有值的集合)
  • 它们既包括P自身用到的值,又包括P中涉及的关系的元组中出现的所有值。因此,P的域是P中显式出现的值及名称出现在P中的那些关系的所有值的集合,公式的域,是值的集合,它不强调值“同类型”
    在这里插入图片描述

🐇运算符的优先次序

在这里插入图片描述

🐇等价性

🥕元组关系演算中的等价性

在这里插入图片描述

🥕元组关系演算与关系代数的等价性

在这里插入图片描述

  • 选择运算不用量词
  • 投影运算用存在量词,属性名对应t,元组值对应存在量词后的字母
  • 并、差、选择不用量词,投影、笛卡尔积用量词表示
  • 量词是扫描一遍的意义,量词变量如同指针,依次定位在表中的各个元组上

📚域关系演算

🐇形式化定义

和元组关系演算同理

在这里插入图片描述

🐇查询事例

  • 找出工资在80000美元以上的教师的ID、name、dept_name和salary
    在这里插入图片描述
  • 找出工资大于80000美元的所有教师的姓名
    在这里插入图片描述
  • 找出在物理系的所有教师姓名,以及他们教授的所有课程的course_id
    在这里插入图片描述
  • 找出在2009年秋季学期或者2010年春季学期或者这两个学期都开设的所有课程的集合
    在这里插入图片描述
  • 找出选了生物系开设的全部课程的所有学生
    在这里插入图片描述

🐇表达式的安全性

在这里插入图片描述


📚习题练习

在这里插入图片描述
习题链接(含答案)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量子力学奇妙之旅-微扰论和变分法

专栏目录: 高质量文章导航 一.基本概念 前置: 厄密算符和简并: 两大重要结论: 厄米算符的本征值一定是实数 厄米算符不同本征值的本征态一定正交 证明: 我们 λ<

Day02函数和条件表达

0. 格式化字符串 格式 化字符串 print(1) print(1,2,3,4)a 1 b 2.1123 c hello s a %d b %f c %s % (a,b,c)s -- worldprint(s)s fa {a} b {b} c {c} print(s)s a {0:5d} b {1:.2f} c {0}.format(a,b,c) print(s)1. 函数概述 print() input() type() int…

C++菱形继承以及解决方法--虚继承 虚基表

目录菱形继承形成原因出现二义性变量的内存布局应对方案虚继承 vitrual解决二义性变量内存布局--虚基表感悟关于代码复用等的另一种关系-组合菱形继承形成原因 多继承&#xff0c;呈菱形状 菱形继承代码: class A { public:A() {}int _a ; }; class B :public A { public…

NAT技术原理、使用场景

随着Internet的发展和网络应用的增多&#xff0c;有限的IPv4公有地址已经成为制约网络发展的瓶颈。为解决这个问题&#xff0c;NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术应需而生。 NAT技术主要用于实现内部网络的主机访问外部网络…

JDK8 新特性之新增的Optional类

目录 一&#xff1a;以前对null的处理方式 二&#xff1a;Optional类介绍 三&#xff1a;Optional的基本使用 Optional的高级使用 小结 一&#xff1a;以前对null的处理方式 Test public void test01() { String userName "凤姐"; // String userName null; …

十八、Gtk4-Stateful action

有些动作action有状态。状态的典型值是布尔值或字符串。但是&#xff0c;如果你愿意&#xff0c;也可以使用其他类型的状态。 具有状态的动作称为有状态的。 Stateful action without a paramete 有些菜单被称为切换菜单。例如&#xff0c;全屏菜单有一个状态&#xff0c;它…

在甲骨文云容器实例(Container Instances)上部署edge

甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。 今天我们尝试一下通过容器实例部署edge。 Step1. 创建容器实例 在甲骨文容器实例页面&#xff0c;单击"创建容器实例"&#xff0c; …

审批工作流—ccflow

审批工作流—ccflow目录概述需求&#xff1a;设计思路实现思路分析1.java 代码分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challen…

LeetCode[547]省份数量

难度&#xff1a;中等题目&#xff1a;有 n个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a与城市 b直接相连&#xff0c;且城市 b与城市 c直接相连&#xff0c;那么城市 a与城市 c间接相连。省份 是一组直接或间接相连的城市&#xff0c;组内不含其…

Leetcode:93. 复原 IP 地址(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。…

leetcode刷题记录总结-2.链表

文章目录一、重排列表[1. 奇偶链表](https://leetcode.cn/problems/odd-even-linked-list/solutions/)题解二、链表的增、删、改、查[203. 移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/)题解不简洁代码简洁代码707.设计链表题解不简洁代码优化后的…

mysql主从复制配置(windows和linux操作都有)

我是目录主从复制是什么&#xff1f;操作实践验证主从设置主从复制是什么&#xff1f; mysql主从复制是一个异步的复制过程&#xff0c;底层是基于mysql数据库自带的二进制日志功能。就是一台或多台mysal数据库&#xff08;slave&#xff0c;即从库&#xff09;从另一台mysql数…

macOS Big Sur 11.7.3 (20G1116) 正式版 ISO、PKG、DMG、IPSW 下载

本站提供的 macOS Big Sur 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Big-Sur/&#xff0…

【Python百日进阶-Web开发-Linux】Day236 - Win11安装Windows Subsystem for Android(WSA)

文章目录一、Win11运行安卓app前提条件二、Win11运行安卓app支持以下新特性三、Win11运行安卓app操作步骤3.1 修改定位3.2 开启VT虚拟化3.3 开启电脑的Hyper-V和虚拟机平台四、WSA下载4.1 百度网盘下载4.2 store.rg-adguard.net下载五、WSA安装&#xff08;没有成功&#xff0c…

C++初阶--继承

目录 继承的概念 继承定义 继承基类成员访问方式 基类和派生类对象的赋值转换 继承中的作用域 派生类的默认成员函数 友元关系不能继承 基类static成员 菱形继承与菱形虚拟继承 虚拟继承解决数据冗余和二义性的原理 继承和组合 继承的概念 继承是类层次的复用。 继…

Golang 泛型学习

Golang 泛型 今天来学习下Golang中泛型的基础知识。使用泛型&#xff0c;开发者可以声明一个函数来适应不同类型的参数&#xff0c;避免由于参数类型不一致而声明多个处理逻辑类似的函数。在本教程中&#xff0c;将声明两个简单的非泛型函数&#xff0c;然后在单个泛型函数中实…

这些实体店直播必备技巧,新手直接套用就能火!

随着直播的受众越来越广、门槛越来越低&#xff0c;入局服装直播的实体店越来越多。对于服装厂商来说&#xff0c;服装产业链越靠下游毛利率越高&#xff0c;品牌商和销售商利润远高于加工生产商&#xff0c;约在40-50%&#xff0c;而服装制造商的毛利率仅在15%左右。而对于本土…

JDK8 新特性之收集Stream流中的结果

目录 一&#xff1a;Stream流中的结果到集合中 二&#xff1a;Stream流中的结果到数组中 三&#xff1a;对流中数据进行聚合计算 四&#xff1a;对流中数据进行分组 五&#xff1a;对流中数据进行多级分组 六&#xff1a;对流中数据进行分区 七&#xff1a;对流中数据进行拼接…

8.Java循环高级综合练习-无限循环和跳转控制语句,逢七过,平方根,判断是否为质数,猜数字小游戏

文章目录前言一、无限循环1.这三种循环中哪一种无限循环是最常用的呢?2.注意事项:二、跳转控制语句三、逢七过四、平方根五、判断该整数是否为一个质数六、猜数字小游戏保底机制总结前言 一、无限循环 1.这三种循环中哪一种无限循环是最常用的呢? 当然是右上角的while循环啦…

【若依】若依字典管理页面中列表按钮功能的实现

0. 功能实现描述 1. 代码实现 ScStfController.java /*** 查询员工证书* param stfId* param modelMap* return*/ RequiresPermissions("sc:stf:cert") GetMapping("/cert/{stfId}") public String detail(PathVariable("stfId") Long stfId, …