当前位置: 首页 > news >正文

一篇吃透数据库关系代数,附经典查询案例

一、前言

关系代数是关系数据库的数学基础,是实现数据库查询、数据操作的核心理论,其运算对象和运算结果均为关系(二维表),主要分为传统的集合运算专门的关系运算两大类,本文将详细梳理两类运算的核心规则、公式及应用示例,助力快速掌握关系代数基础。

二、传统的集合运算

传统集合运算以集合论为基础,要求参与运算的两个关系R 和 S 满足相容性:即 R 和 S 均为 n 目关系(有 n 个属性),且相应属性取自同一个域(属性值的取值范围相同)。设元组变量为 t,t∈R 表示 t 是 R 的一个元组,核心运算包含以下四类:

1. 并(union)

  • 公式:R∪S={t∣t∈R∨t∈S}
  • 结果特征:仍为 n 目关系,由属于 R 或属于 S 的所有元组组成,运算后会自动去除重复元组。
  • 核心逻辑:取两个关系的 “并集”,属性列保持不变,仅对元组做合并去重处理。

2. 差(except)

  • 公式:R−S={t∣t∈R∧t∈/S}
  • 结果特征:仍为 n 目关系,仅保留属于 R 但不属于 S 的所有元组。
  • 核心逻辑:仅筛选 R 中独有的元组,运算顺序不可交换,即R−S<>S−R。(<>为不等于号)

3. 交(intersection)

  • 公式:R∩S={t∣t∈R∧t∈S},也可通过差运算推导:R∩S=R−(R−S)
  • 结果特征:仍为 n 目关系,仅保留既属于 R 又属于 S 的所有元组。
  • 核心逻辑:取两个关系的 “交集”,仅保留二者的共同元组。

4. 笛卡尔积(Cartesian Product)

  • 公式:R×S={tr​ts​∣tr​∈R∧ts​∈S}
  • 结果特征:运算结果为 m+n 目关系(若 R 为 m 目、S 为 n 目),元组个数等于 R 的元组数乘以 S 的元组数;本质是将 R 的每个元组与 S 的每个元组逐一拼接组合。
  • 核心特点:笛卡尔积会产生大量冗余元组,实际使用中通常需配合选择运算筛选有效数据,也是连接运算的底层基础。
  • 示例参考:若 R 有 2 个元组、3 个属性,S 有 3 个元组、2 个属性,那么R×S会生成 6 个元组、5 个属性。

三、专门的关系运算

专门的关系运算是为数据库场景定制的运算,突破了传统集合运算的相容性限制,能实现更灵活的数据库查询需求,核心包含选择、投影、连接、除运算四类,其中选择和投影为一元运算(仅需一个运算对象),连接和除运算为二元运算(需两个运算对象)。

1. 选择(selection)| 又称限制

选择运算是从行的角度对关系进行筛选,仅保留满足指定逻辑条件的元组,属性列数量和内容保持不变。

  • 关键说明:σ为选择运算符,F为选择条件(逻辑表达式),结果为 “真” 或 “假”;F的基本形式为XθY,其中θ为比较运算符()X、Y 可以是属性名、常量或简单函数。
  • 应用示例
  • 1.查询信息系(IS 系)全体学生:σsdept="IS"​(Student)
  • 2.查询年龄小于 20 岁的学生:σsage<20​(Student)

2. 投影(projection)

投影运算是从列的角度对关系进行筛选,仅选取指定的属性列组成新的关系,运算后会自动去除重复的元组。

  • 关键说明:π为投影运算符,A为 R 中的属性列集合(可单个或多个属性,多个属性用逗号分隔),t[A]表示取元组 t 中属性 A 对应的分量。
  • 应用示例
    1. 查询学生的姓名和所在系(基于 Student 关系):πsname,sdept​(Student)
    2. 查询学生关系中所有的院系(自动去重):πsdept​(Student)

3. 连接(join)| θ 连接

连接运算以笛卡尔积为基础,从两个关系的广义笛卡尔积中选取属性间满足一定条件的元组,核心逻辑是 “先拼接,后筛选”,是数据库中最常用的运算之一。设 A 为 R 的属性组,B 为 S 的属性组,A 和 B 列数相等且可比(属性值同域),θ为比较运算符,核心分为以下三类:

(1)普通 θ 连接

  • 核心逻辑:仅保留 A、B 属性值相等的元组,结果中会同时保留 A 和 B 两组重复的属性列。
(3)自然连接(Natural Join)
  • 定义:特殊的等值连接,无需手动指定连接条件,会自动匹配两个关系中名称和域均相同的属性组(公共属性)进行等值连接。
  • 关键说明:B 为 R 和 S 的公共属性组,U 为 R 和 S 的全体属性集合;运算结果中会去掉重复的公共属性列,仅保留一份。
  • 核心特点:同时涉及行和列的运算,先按公共属性等值连接,再对重复的公共列去重。

4. 除运算(division)

除运算是关系代数中最复杂的运算,从行和列的双重角度筛选数据,专门用于实现 “查询满足所有条件的记录” 类需求(如 “选修全部课程的学生”),要求参与运算的两个关系 R 和 S 满足:S 的属性集是 R 属性集的子集。

(1)核心定义

关系 R 除以关系 S 的结果为关系 T,T 需满足两个条件:

  1. T 包含所有在 R 中但不在 S 中的属性及其对应值;
  2. T 中的每个元组与 S 的所有元组组合后,结果均能在 R 中找到。
(2)公式与关键概念

  • 关键概念:象集 X—— 设 R 的属性分为 X(R 独有的属性)和 Y(R 与 S 的公共属性),对于 R 中某一 X 的取值x,其象集 X 为 R 中所有满足tr​[X]=x的元组的 Y 属性值的集合。
  • 核心逻辑:筛选出 R 中象集包含 S 的 Y 属性投影集的 X 取值。
(3)应用示例

已知 R (A,B,C)、S (B,C),仅当 R 中某一 A 值的象集(B,C)包含πB,C​(S)时,该 A 值才会出现在R÷S的结果中,最终R÷S={a1​}(仅保留 R 独有的 A 属性)。

四、关系代数经典查询示例

基于 Student(学生表,含 sno 学号、sname 姓名、sdept 院系、sage 年龄)、SC(选课表,含 sno 学号、cno 课程号、grade 成绩)、Course(课程表,含 cno 课程号、cname 课程名、cpno 先行课号)三张表,结合上述运算实现经典查询:

示例 1:查询选修 2 号课程的学生的学号

运算逻辑:先通过选择运算筛选出 SC 表中 cno 为 2 的元组,再通过投影运算仅保留学号列,最终表达式为:πsno​(σcno=′2′​(SC))。

示例 2:查询至少选修 1 号课程和 3 号课程的学号

运算逻辑:先筛选出课程号为 1 或 3 的课程投影集 K,再通过除运算筛选出选修了这些课程的学号,步骤如下:

示例 3:查询至少选修了一门其直接先行课为 5 号课程的学生姓名

运算逻辑:先筛选出先行课为 5 的课程,再依次与 SC 表、学生姓名投影表做自然连接,最后投影出姓名列,表达式为:

示例 4:查询选修了全部课程的学生号和姓名

运算逻辑:先通过除运算筛选出选修全部课程的学号,再与学生姓名投影表做自然连接,表达式为:

五、关键注意事项

  1. 集合运算的相容性:并、差、交运算要求 R 和 S 为同目关系且属性同域,而笛卡尔积、连接、除运算无此限制;
  2. 去重规则:投影、自然连接、除运算会自动去除重复元组,使用时需注意数据的唯一性;
  3. 运算顺序优化:复杂查询中优先执行选择或投影运算,再执行连接或除运算,可减少笛卡尔积产生的数据量,提升运算效率;
  4. 除运算的场景:除运算是实现 “全部”“所有” 类查询的唯一方式,是关系代数中解决这类需求的核心运算。

总结

  1. 关系代数分为传统集合运算(并、差、交、笛卡尔积)和专门关系运算(选择、投影、连接、除运算),前者依赖集合相容性,后者适配数据库灵活查询场景;
  2. 选择运算聚焦 “行筛选”、投影运算聚焦 “列筛选”,连接运算基于笛卡尔积做条件筛选,除运算专用于实现 “满足所有条件” 的查询;
  3. 复杂查询需合理规划运算顺序,优先执行选择 / 投影可减少数据量,提升运算效率。
http://www.jsqmd.com/news/467324/

相关文章:

  • 避坑指南:QT中QByteArray进制转换时容易踩的3个内存陷阱(带调试技巧)
  • 洛谷刷题必备:5种排序算法实战解析(附竞赛真题代码)
  • Docker容器化部署爬虫项目全流程
  • Isograph Reliability Workbench 14实战:从零构建故障树分析模型
  • SpringBoot与Druid连接池:精准配置PGSQL超时参数避免查询中断
  • vxe-table可编辑行实战:如何避免点击其他行时自动保存当前编辑数据
  • SQL注入实战:堆叠注入的攻防博弈
  • STM32F4 DSP浮点运算实战:从库配置到FFT频谱分析
  • uniapp开发踩坑记:Host version与binary version不匹配的终极解决方案(附详细步骤)
  • RVC功能全体验:语音转换、翻唱制作、实时变声,一个工具全搞定
  • PCIe DMA链表模式实战:如何用LL元素优化数据传输(附PCS-CCS同步避坑指南)
  • 手把手教学:用vllm部署通义千问1.8B-Chat,并用chainlit打造可视化界面
  • ESP32 BLE蓝牙透传实战:从AT指令到数据传输
  • 华为昇腾Atlas 300I Pro推理卡(3010)从零部署:CANN环境配置与ResNet50应用验证
  • 避坑指南:SpringBoot集成DeepSeek API时常见的5个配置错误及解决方法
  • AI辅助开发:让快马AI帮你写出更聪明的Instagram下载工具代码
  • 手把手教你禁用TLS 1.1:Nginx/Apache/Tomcat全平台配置指南(附检测工具)
  • [技术解析] GATv2:从静态到动态,揭秘图注意力网络的真实“注意力”
  • 用OSG+GLSL330实现动态天气效果:从乌云密布到晴空万里的着色器改造指南
  • 绿联NAS+Docker:构建PaddleOCR私有化文档处理流水线
  • Cesium模型单体化避坑指南:从ArcGIS数据准备到分类瓦片生成
  • 超越F1分数:深入解析加权F度量(Fβ)及其在模型评估中的灵活应用
  • Ambari集群部署实战:从零搭建Hadoop管理平台【手把手教程】
  • 网安实战:从Ping命令到RCE漏洞的攻防演练
  • 若依框架-功能探秘_零代码表单构建
  • HR 系统选型避坑:从需求到落地的完整决策框架
  • 单细胞RNA速率分析避坑指南:为什么你的velocyto结果总崩溃?
  • 【技术拆解】从协议到实践:手把手构建你的第一个MCP Server
  • 图解PyG消息传递机制:从GCNConv源码看MessagePassing的5个核心方法
  • Windows环境下用uiautomation实现微信消息自动监控与回复