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

三、关系数据库

三、关系数据库

主要内容

  • 关系模型的基本概念
  • 关系代数
  • 关系演算
    • 元组关系演算
    • 域关系演算
  • 关系数据语言
  • 关系运算的安全性
  • 关系运算的等价性
  • 小结

1.关系模型的基本概念

  • 关系模型的数据结构
    • 关系
    • 现实世界的实体以及实体间的各种联系均用关系来表示
  • 关系模型的逻辑结构
    • 二维表
    • 从用户角度,关系模型中数据的逻辑结构是一张二维表
  • 关系模型的数学基础
    • 集合代数

关系的定义

  • 笛卡尔积(Cartesian Product)

    给定一组集合D1,D2,……,Dn(可以有相同的),其笛卡尔积定义为: D 1 × D 2 × … … × D n = { ( d 1 , d 2 , … … , d n ) ∣ d i ∈ D i , i = 1 , 2 , … … , n } D_1 \times D_2 \times …… \times D_n = \{(d_1,d_2,……,d_n)|d_i \in D_i,i = 1,2,……,n\} D1×D2×……×Dn={(d1,d2,……,dn)diDi,i=1,2,……,n}

    例如:

    D 1 = 1 , 2 , 3 , D 2 = a , b , D 1 × D 2 = { ( 1 , a ) , ( 1. b ) , ( 2 , a ) , ( 2 , b ) , ( 3 , a ) , ( 3 , b ) } . D_1 = {1,2,3},D_2 = {a,b},\\ \quad D_1 \times D_2 = \{ (1,a),(1.b),\\ \quad\quad\quad\quad\quad(2,a),(2,b),\\ \quad\quad\quad\quad\quad(3,a),(3,b) \}. D1=1,2,3,D2=a,b,D1×D2={(1,a),(1.b),(2,a),(2,b),(3,a),(3,b)}.

  • 元组(Tuple)

    • 笛卡尔积中每一个元素(d1,d2,……,dn)叫作一个n元组(n-tuple)或简称元组
  • 分量(Component)

    • 笛卡尔积中的元素(d1,d2,……,dn)中的第di值叫作第i个分量
  • 域(Domain)

    • 第i个分量di的取值范围Di,称这个分量的**(值)域**。
    • 是一组具有相同数据类型的值的集合。
    • 整数,实数,介于某个取值范围的整数。
  • 基数(Cardinal number)

    • D i ( i = 1 , 2 , … … , n ) D_i(i=1,2,……,n) Di(i=1,2,……,n)为有限集,其基数为 m i ( i = 1 , 2 , … … , n ) m_i(i=1,2,……,n) mi(i=1,2,……,n),则 D 1 × D 2 × … … × D n D_1 \times D_2 \times …… \times D_n D1×D2×……×Dn的基数M为: M = ∏ i = 1 n m i M=\prod_{i=1}^n m_i M=i=1nmi
  • 笛卡尔积的表示方法

    • 笛卡尔积可表示为一个二维表;表中的每行对应一个元组,表中的每列对应一个域
  • 笛卡尔积示例

    • D 1 = 导师集合 S U P E R V I S O R = { 张清玫,刘逸 } D1 = 导师集合SUPERVISOR = \{张清玫,刘逸\} D1=导师集合SUPERVISOR={张清玫,刘逸}
    • D 2 = 专业集合 S P E C I A L I T Y = { 计算机专业,信息专业 } D2 = 专业集合SPECIALITY = \{ 计算机专业,信息专业\} D2=专业集合SPECIALITY={计算机专业,信息专业}
    • D 3 = 研究生集合 P O S T G R A D U A T E = { 李勇,刘晨,王敏 } D3 = 研究生集合POSTGRADUATE = \{李勇,刘晨,王敏\} D3=研究生集合POSTGRADUATE={李勇,刘晨,王敏}

    image-20250517125503483

    说明:

    1. 元组(Tuple)

      每一行都是一个3元组,例如: (张清政,计算机专业,李勇) (张清政,计算机专业,李勇) (张清政,计算机专业,李勇)

      这个元组是从:

      • SUPERVISOR 中取“张清政”
      • SPECIALITY 中取“计算机专业”
      • POSTGRADUATE 中取“李勇”
    2. 分量(Component)

      在这个元组:

      • “张清政”是第1个分量(来自 D 1 D_1 D1
      • "计算机专业"是第2个分量(来自 D 2 D_2 D2
      • “李勇”是第3个分量(来自 D 2 D_2 D2
    3. 域(Domain)

      每一列(SUPERVISOR,SPECIALITY,POSTGRADUATE)表示一个域(Domain),即值的取值范围:

      • 第1列:SUPERVISOR 域:{张清政,刘逸}
      • 第2列:SPECIALITY 域:{计算机专业,信息专业}
      • 第3列:POSTGRADUATE 域:{李勇,刘晨,王敏}
    4. 基数(Cardinal Number)

      每个集合的元素个数是:

      • ∣ D 1 ∣ = 2 |D_1| = 2 D1=2
      • ∣ D 2 ∣ = 2 |D_2| = 2 D2=2
      • ∣ D 3 ∣ = 3 |D_3| = 3 D3=3

      因此笛卡尔积的基数(总元组数)为:

      M = ∣ D 1 ∣ × ∣ D 2 ∣ × ∣ D 3 ∣ = 2 × 2 × 3 = 12 M = |D_1| \times |D_2| \times |D_3| = 2 \times 2 \times 3 = 12 M=D1×D2×D3=2×2×3=12

      我们可以数一下表格,共有12行元组,正好验证了这个计算。

    5. 笛卡尔积表示法

      笛卡尔积可以用一个表格来表示

      • 每一行是一个元组
      • 每一列对应一个域(属性)
      • 表格的行数等于笛卡尔积的基数(即所有组合情况)
  • 关系(Relation)

    • D 1 × D 2 × … … × D n D_1 \times D_2 \times …… \times D_n D1×D2×……×Dn的子集成为 D 1 , D 2 , … … , D n D_1,D_2,……,D_n D1,D2,……,Dn上的关系,表示为:

      R ( D 1 , D 2 , … … , D n ) R : 关系名 n : 关系的 目或度 ( D e g e r e e ) 集合 D 1 , D 2 , … … , D n 称为关系的域 R(D_1,D_2,……,D_n)\\R:关系名 \quad \quad\quad\quad\quad \\ \quad \quad n:关系的\textcolor{red}{目或度(Degeree)} \\ \quad \quad \quad \quad \quad \quad集合D_1,D_2,……,D_n称为关系的域 R(D1,D2,……,Dn)R:关系名n:关系的目或度(Degeree)集合D1,D2,……,Dn称为关系的域

    • 一元关系: n = 1 n = 1 n=1

    • 二元关系: n = 2 n = 2 n=2

    • n n n元关系

  • 关系的表示

    • 关系也是一个二维表;
  • 关系的元组和属性

    • 关系中的每一行对应一个元组,通常用 t t t表示;
    • 关系中的每一列对应一个
    • 关系中的列称为属性,每一列用属性名表示;
    • t [ A i ] t[A_i] t[Ai]表示元组 t t t在属性 A i A_i Ai上的值;
    • 用符号 d o m ( A i ) dom(A_i) dom(Ai)表示属性 A i A_i Ai的域。
  • 关系的特殊性

    • 并非任何笛卡尔积的子集都有现实意义;

    • 关系元组的各个分量的次序是无关紧要的;

      (为关系的每个列附加一个属性名以取消其有序性

    • 数学上的关系可以无限,但关系数据库中无限关系是无意义的,关系必须是有限元组的集合;

    • 关系是简单的二维表,每一列都是不可分的;

    • 严格的说,关系是一种规范化了的二维表行的集合

    • 示例:

      ( d 1 , … … , d i , d j , … … , d n ) = ( d 1 , … … , d j , d i , … … , d n ) , ( i , j − 1 , 2 , … … , n ) (d_1,……,d_i,d_j,……,d_n) = (d_1,……,d_j,d_i,……,d_n),(i,j - 1,2,……,n) (d1,……,di,dj,……,dn)=(d1,……,dj,di,……,dn),(i,j1,2,……,n)

      这表明次序是无意义的

      姓名 = { 张三,李四 } ,性别 = { 男,女 } ; 姓名 × 性别 = { ( 张三,男 ) , ( 张三,女 ) , ( 李四,男 ) , ( 李四,女 ) } 姓名=\{张三,李四\},性别=\{男,女\};\\姓名 \times 性别 = \{ (张三,男),(张三,女),(李四,男),(李四,女)\} 姓名={张三,李四},性别={男,女};姓名×性别={(张三,男),(张三,女),(李四,男),(李四,女)}

规范化的关系

满足以下性质的关系,称为规范化的关系

  1. 列是同质的
    • 每一列中的值是同一类型的数据,来自同一个域。
  2. 不同的列可出自同一个域
    • 每一列称为一个属性,不同的属性要给与不同的属性名。
  3. 列的次序是无关紧要的
    • 列的次序可以任意交换
  4. 元组的每个分量都是原子的
    • 每一个分量都必须是不可分的数据项。
  5. 元组的次序是无关紧要的
    • 行的顺序无所谓,即行的次序可以任意交换
  6. 各个元组都是不同的
    • 关系中不允许出现重复元组

实际的商品化的数据库管理系统不一定都满足这些规范化要求

  • 有的允许重复元组;
  • 有的区分元组的顺序和属性的次序;

关系与关系模式

  • 关系的称为关系模式(Relation Schema)

    • 是对关系的描述,该描述包括关系名、属性名、属性的类型和长度,以及属性间固有的数据关联关系

    • 关系模式一般简记为关系名和属性名的集合

      R ( A 1 , A 2 , … … , A n ) R(A_1,A_2,……,A_n) R(A1,A2,……,An),或仅用关系名 R R R表示。

    • 例如:图书关系模式: 图书 ( 书号,书名,作者,单价,出版社 ) 图书(书号,书名,作者,单价,出版社) 图书(书号,书名,作者,单价,出版社)或简写为 图书关系 图书关系 图书关系

  • 关系的是元组的集合,称为关系

    • 关系是对现实世界中事物在某一时刻状态的反映,关系的值是随时间在不断变化的。
    • 关系模式 R R R上的一个关系通常写为 r ( R ) r(R) r(R)
  • 关系模式的形式化表示

    R ( U , D , D O M , F ) R(U,D,DOM,F) R(U,D,DOM,F)

    R R R 关系名

    U U U 组成该关系的属性名集合

    D D D 属性组 U U U中属性所来自的域

    D O M DOM DOM 属性向域的映射集合

    F F F 属性间的数据依赖关系集合

    例子:

    S T U D E N T ( U , D , D O M , F ) U { s n o , n a m e , a g e } D { c h a r , I n t } D O M { d o m ( s n o ) = d o m ( n a m e ) = c h a r , d o m ( a g e ) = I n t } F { s n o − > n a m e , a n o − > a g e } STUDENT(U,D,DOM,F)\\U\{sno,name,age \} \quad \quad \quad \quad\\D\{ char,Int\}\quad \quad \quad \quad \quad \quad \quad\\DOM\{dom(sno) = dom(name) = char,dom(age) = Int\}\\F\{sno->name,ano->age\} STUDENT(U,D,DOM,F)U{sno,name,age}D{char,Int}DOM{dom(sno)=dom(name)=char,dom(age)=Int}F{sno>name,ano>age}

关系数据库与关系数据库模式

  • 关系模式的集合称为关系数据库模式

    • 是对数据库中所有数据逻辑结构的描述(关系数据库的型

    • 表示为

      R = { R 1 , R 2 , … … , R p } \quad \quad \quad R = \{R_1,R_2,……,R_p\} R={R1,R2,……,Rp}

  • 关系数据库

    • 关系数据库模式中每个关系模式上的关系的集合称为关系数据库。(关系数据库的值

    • 表示为

      d = { r 1 , r 2 , … … , r p } \quad \quad \quad d = \{r_1,r_2,……,r_p\} d={r1,r2,……,rp}

关系模式和关系往往统称为关系,通过上文加以区别

键(Key)

  • 键(Key,码)

  • 关系数据库的重要概念

  • 关系是元组的集合,为了区分不同元组,用其中一个或多个属性值来标识元组;能够唯一标识元组的属性或属性组称为关系的键

  • 属性集 K K K关系模式 R R R 的键,对 r ( R ) r(R) r(R)中任意二个不同的元组 t 1 , t 2 t_1,t_2 t1,t2应满足 t 1 [ K ] ≠ t 2 [ K ] t_1[K] \ne t_2[K] t1[K]=t2[K],即任意二个不同的元组其 K K K的值是不同的。

  • 键的形式化定义

    设关系模式 R ( U ) , K ⊆ U R(U),K \subseteq U R(U),KU r r r R R R上的任一关系,若对 r r r中的任意二个不同的元组满足:

    1. t 1 [ K ] ≠ t 2 [ K ] t_1[K] \ne t_2[K] t1[K]=t2[K]
    2. 不存在$K’\subset K 而使得 而使得 而使得t_1[K’] \ne t_2[K’]$成立;

    则称 K K K R R R

    若仅条件1成立,则称 K K K R R R超键(Super Key)

    • 键除了能表示元组外,还应具有最小属性数。
    • 超键不要求具有最有属性数。
    • 超键包括了键。
  • 候选键(Candidate Key)

    • 关系中能起到标识作用的键(可能有多个
  • 主键(Primary Key与候补键(Candidate Key)

    • 若一个关系有多个候选键,则选定其中一个作为主键;其余的键称为候补键。
  • 联合键(Concatenated Key)

    • 由关系的多个属性组成的键
  • 全键(All Key)

    • 由关系的所有属性组成的键
  • 候选键的属性称为主属性(Prime attribute),不包含在任何候选键中的属性称为非主属性非键属性(Non-key attribute)

  • 外键(Foreign Key)

    • 当前关系的某个属性是另外一个关系,则称这个属性为当前关系的外键
    • 给出了在不同关系间建立联系的一种方法;
    • 外键并不一定要与相应的主键同名
    • 当外键与相应的主键属于不同关系时,往往取相同的名字,以便于识别。
  • 示例:关系的键

    下划线的是主键候选键全键联合键

    学生关系 S ( 学号 ‾ ,学生姓名,年龄,性别,班号 ) 学生关系S(\underline{学号},学生姓名,年龄,性别,班号) 学生关系S(学号,学生姓名,年龄,性别,班号)

    班级关系 C ( 班号 ‾ ,班长,学生人数,专业 ) 班级关系C(\underline{班号},班长,学生人数,专业) 班级关系C(班号,班长,学生人数,专业)

    学生选课关系 S C ( 学号,课程号 ‾ ,成绩 ) 学生选课关系SC(\underline{学号,课程号},成绩) 学生选课关系SC(学号,课程号,成绩)

    用户关系 U ( 身份证 ‾ ,姓名,性别,年龄 ) 用户关系U(\underline{身份证},姓名,性别,年龄) 用户关系U(身份证,姓名,性别,年龄)

    供应关系 S u p p l ( 供应商,商品,商场 ‾ ) 供应关系Suppl(\underline{供应商,商品,商场}) 供应关系Suppl(供应商,商品,商场)

关系的完整性约束

  • 为了维护数据库中的数据与现实世界的一致性,关系模式上的所有关系必须满足一定的完整性约束条件。

    • 属性取值的约束
    • 属性间值的约束
    • 不同关系中属性值的约束
    • …………
  • 完整性约束语义上的概念,是**现实世界对数据的限定**。

    • 实体完整性约束
    • 参照完整性约束
    • 其他约束(用户定义的完整性约束)
  • 实体完整性和参照完整性

    • 关系模型必须满足的完整性约束条件,称为关系的两个不变性
    • 由关系系统自动支持;
  • 用户定义的完整性

    • 应用领域需要遵循的约束条件;
    • 体现了具体领域中的语义约束。
  • 实体完整性约束(Entity Integrity Constraint)

    • 对关系中主键取值的约束
    • 作为键的各个属性的值不能为空
    • 主键的值不能为空火或部分为空,否则不能表示任何实体,因而无意义。
    • 空值:”不知道“,”不存在“或”无意义“的值。
  • 参照完整性约束(Reference Integrity Constraint)

    • 对关系中外键取值的约束
    • 若关系 R 1 R_1 R1 中的属性 A A A 是另一个关系 R 2 R_2 R2 中主键的主键
      R 1 R_1 R1 中任意一个元组在属性 A A A 上的值
      • 要么是空值(NULL)——允许没有对应值的情况(如果允许空)
      • 要么必须是 R 2 R_2 R2中某个元组主键属性的值(即存在于 R 2 R_2 R2的主键集合中)
  • 参照完整性约束

    • 给出了关系间建立联系的约束规则:参照

    • 参照:某个关系与另一个关系通过定义在同一个域上的属性而建立的联系。

    • 参照关系

      例: R 1 R_1 R1,包含外键

    • 被参照关系

      例: R 2 R_2 R2,主键

    • 规定了外键的取值:

      1. 空值;
      2. 被参照关系中某个元素的主键的值。
  • 参照完整性示例

    示例1

    image-20250517155451951

    image-20250517155515634

    示例2:学生实体及其内部的领导联系(一对多)

    学生 ( 学号 ‾ ,姓名,性别,专业好,年龄, 班长 ) 学生(\underline{学号},姓名,性别,专业好,年龄,\textcolor{red}{班长}) 学生(学号,姓名,性别,专业好,年龄,班长)

    ”班长“属性值可以取空值或非空值

  • 其他约束(用户定义的完整性约束)

    • 是用户根据实际应用定义的完整性约束
    • 与具体的数据库应用系统有关
    • 这种约束时应用语义层面的需求,用来保证数据在业务逻辑上是合理的。比如:”病人的年龄不能超过150岁“
    • DBMS应提供定义和检查机制,不应由应用程序承担

    示例:

    课程 ( 课程号 ‾ ,课程名,学分 ) 课程(\underline{课程号},课程名,学分) 课程(课程号,课程名,学分)

    用户定义的完整性约束如下:

    1. ”课程名“属性必须取唯一值;
    2. 非主属性”课程名“也不能取空值;
    3. ”学分“属性只能取值 { 1 , 2 , 3 , 4 } \{1,2,3,4\} {1,2,3,4}
  • 完整性约束的实施

    • 关系系统自动支持:实体完整性,参照完整性
    • 用户定义后由系统支持:用户定义的完整性

关系与关系模式(小结)

  • 关系模式是

    举例: S t u d e n t ( S n o , S n a m e , A g e ) Student(Sno,Sname,Age) Student(Sno,Sname,Age)就是一个关系模式,说明这个表有3个属性,分为对应不同的数据类型。

  • 关系是,是关系模式的具体示例,就像int是类型,3是值

    举例: S t u d e n t Student Student表中所有学生的真实数据(每一行一个学生)组成了关系

  • 关系模式是对关系的描述

    • 元组集合的结构

      • 属性的构成:有哪些属性,例如 S n o , S n a m e , A g e Sno,Sname,Age Sno,Sname,Age
      • 属性来自的域:例如 S n o Sno Sno来自”学号字符串“域, A g e Age Age来自”整数域“。
      • 属性与域之间的映射关系:每个属性必须严格从它所属的域中取值。
    • 元组语义以及完整性约束条件

    • 属性间的数据依赖关系 集合

      例如: 若 A → B ,则 A 的值能唯一决定 B 的值 若A \rightarrow B,则A的值能唯一决定B的值 AB,则A的值能唯一决定B的值

  • 关系模式

    • 对关系的描述
    • 静态的、稳定的
  • 关系

    • 关系模式在某一时刻的状态或内容
    • 动态的、随时间不断变化的
  • 关系模式和关系往往统称为关系

    通过上下文加以区别

2. 关系代数

主要内容

  • 关系运算概述
  • 关系代数概述
  • 传统的集合运算
  • 专门的关系运算
  • 扩充的关系运算
  • 举例
  • ISBL语言

关系运算概述

  • 关系模型对数据的各种操作都可以归结为对关系的运算;给出运算表达式就可得到所需要的结果。

  • 关系运算的分类

image-20250518161857943

关系代数概述

  • 关系代数
    • 以集合代数为基础发展起来的,以关系运算对象的一组运算集合;
    • 一种抽象的查询语言,用对关系的运算来表达查询;
    • 运算对象和运算结果都是关系;
  • 关系代数运算的分类:
    • 传统的集合运算
      • 并、差、交、广义笛卡尔积
      • 把关系看成元素的的集合,以元组作为集合中元素来进行运算
    • 专门的关系运算
      • 选择、投影、连接、除
    • 扩充的关系运算(为数据库的应用而引进的特殊运算)

传统的集合运算——并

  • R R R S S S

    • 具有相同的目 n n n(即两个关系都有 n n n个属性)
    • 相应的属性取自同一个域
  • R ∪ S R \cup S RS

    • 仍未 n n n目关系,由属于 R R R或属于 S S S的元组组成

      $R \cup S={t|t \in R \land t \in S} $

      image-20250517200704399

传统的集合运算——差

  • R R R S S S

    • 具有相同的目 n n n
    • 相同的属性取自同一个域
  • R − S R - S RS

    • 仍为 n n n目关系,由属于 R R R而不属于 S S S的所有元组组成

      Q = R − S = { t ∣ t ∈ R ∧ t ∉ S } Q = R - S = \{t|t \in R \land t\notin S \} Q=RS={ttRt/S}

      image-20250517201124047

传统的集合运算——交

  • R R R S S S

    • 具有相同的目 n n n
    • 相应的属性取自同一个域
  • R ∩ S R \cap S RS

    • 仍为 n n n目关系,由既属于 R R R又属于 S S S的元组组成

      R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R ∩ S = R − ( R − s ) R \cap S = \{t|t \in R \land t \in S\}\\R \cap S = R - (R - s) \quad \quad RS={ttRtS}RS=R(Rs)

      image-20250517201650303

传统的集合运算——笛卡尔积

  • 关系 R R R S S S的笛卡尔积为 R R R中所有元组和 S S S中所有元组的拼接

  • R R R n n n目关系, k 1 k_1 k1个元组

  • R × S R \times S R×S

    • R × S = { t r t s ∣ t r ∈ R ∧ t s ∈ S } R \times S = \{t_rt_s |t_r \in R \land t_s \in S\} R×S={trtstrRtsS}

    • 元组的前 n n n列是关系 R R R的一个元组,后 m m m列是关系 S S S的一个元组

    • k 1 × k 2 k_1 \times k_2 k1×k2 ( n + m ) (n+m) (n+m)列的元组的集合

      image-20250517202257833

专门的关系运算——选择(Selection)

  • 选择运算是关系上的一元运算,是从关系中选择满足一定条件的元组子集

    σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) } \sigma_F(R) = \{t|t \in R \land F(t)\} σF(R)={ttRF(t)}

    • F F F是限定条件的布尔表达式,由逻辑算符 ( ∧ 、 ∨ 、 ¬ ) (\wedge、\vee、\lnot ) (¬)连接比较表达式组成

    • 上式表示在关系 R R R中选择使 F ( t ) F(t) F(t)为真的所有元组

    • 选择运算是从**行的角度**进行的运算

      image-20250517203421444

  • 选择操作示例

    假设由如下表

    学生关系 ( S t u d e n t ) (Student) (Student)

    学号Sno姓名Sname性别Ssex年龄Sage所在系Sdept
    95001李勇20CS
    95002刘晨19IS
    95003王敏18MA
    95004张力19IS

    进行如下操作

    image-20250517203753281

专门的关系运算——投影(Projection)

  • 在模式 R R R上的投影运算表示为

    Π X ( R ) = { t [ X ] ∣ t ∈ R } \Pi_X(R) = \{t[X] \quad |t \in R \} ΠX(R)={t[X]tR}

    • Π \Pi Π是投影算符, X X X是模式 R R R属性的子集, t [ X ] t[X] t[X]表示 R R R中元组在属性集 X X X上的值,或为元组 t t t X X X上的投影

    • 结果:从 R R R中选择出若干属性列组成新的关系

    • 投影操作主要是从**列的角度**进行运算

      image-20250517204729979

  • 投影操作示例

    假设有学生关系

    学号Sno姓名Sname性别Ssex年龄Sage所在系Sdept
    95001李勇20CS
    95002刘晨19IS
    95003王敏18MA
    95004张力19IS

    查询学生的姓名和所在系,即求 S t u d e n t Student Student关系上学生姓名和所在系两个属性上的投影:

    1. Π S n a m e , S d e p t ( S t u d e n t ) \Pi_{Sname,Sdept}(Student) ΠSname,Sdept(Student)的结果为
image-20250518161640987
  1. Π S d e p t ( S t u d e n t ) \Pi_{Sdept}(Student) ΠSdept(Student)的结果为

    image-20250517205117295

专门的关系运算——连接(Join)

  • 连接运算是把二个关系中的元组按条件连接起来,形成一个新关系

    • 条件连接
    • 自然连接
  • 条件连接也称 θ \theta θ连接,是将二个关系中满足 θ \theta θ条件元组拼接起来形成新元组的集合。

    • 设属性 A A A B B B分别是 R R R S S S的连接记为:

      R ⋈ A θ B S = { t ∣ = t r t s , t r ∈ R ∧ t s ∈ S ∧ t r [ A ] θ t s [ B ] } R \bowtie_{A \, \theta \, B}S = \left\{\, t \mid = t_r \, t_s, \; t_r \in R \land t_s \in S \land t_r[A] \; \theta \; t_s[B] \right\} RAθBS={t∣=trts,trRtsStr[A]θts[B]}

      ⋈ \bowtie 是连接符, A θ B A\, \theta \, B AθB为连接条件, θ \theta θ是比较符。

  • 条件连接示例

    假设有接下来的 R R R关系和 S S S关系

    image-20250517210958443

    然后进行 R ⋈ C < E S R\, \bowtie_{C<E}S RC<ES ,那么结果为

    image-20250517211213660

  • 条件连接的转换

    • R R R S S S的笛卡尔积 R × S R\times S R×S中选取 R R R关系在 A A A属性组上的值与 S S S关系在 B B B属性组上的值满足比较条件的元组

      R ⋈ A θ B S = σ A θ B ( R × S ) R \bowtie_{A\, \theta \, B}S= \sigma_{A \, \theta \, B}(R \times S) RAθBS=σAθB(R×S)

  • 等值连接,最常用的连接

    • 连接条件是二个属性值的相等比较;
    • θ \theta θ为”=“的连接运算称为等值连接
  • 等值连接示例

    假设有接下来的 R R R关系和 S S S关系

image-20250518161517468

然后进行 R ⋈ R . B = S . B S R \bowtie_{R.B = S.B}S RR.B=S.BS,那么结果为

image-20250517212016430

  • 自然连接(Natural join)

    • 自然连接是一种特殊的等值连接;它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉

      比如: 自然连接 R ⋈ S 自然连接\;R \bowtie S 自然连接RS

      image-20250517212554774

  • 一般的连接操作是从行的角度进行运算。

    image-20250517212747200

  • 自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。

专门的关系运算——除法(Division)

  • 象集

    给定一个关系 R ( X , Z ) R(X,Z) R(X,Z) X X X Z Z Z为属性组。当 t [ X ] = x t[X] = x t[X]=x时, x x x R R R中的象集(Image Set)为:

    Z x = { t [ Z ] ∣ t ∈ R , t [ X ] = x } \qquad \qquad Z_x = \{t[Z] \mid t \in R , t[X] = x \} Zx={t[Z]tR,t[X]=x}

    它表示 R R R中属性组 X X X上值为 x x x的诸元组在 Z Z Z分量上的取值的集合。

  • 象集示例

    image-20250518094837845

    • x 1 x_1 x1 R R R中的象集

      Z x 1 = { Z 1 , Z 2 , Z 3 } Z_{x1} = \{Z_1,Z_2,Z_3\} Zx1={Z1,Z2,Z3}

    • x 2 x_2 x2 R R R中的象集

      Z x 2 = { Z 2 , Z 3 } Z_{x2} = \{Z_2,Z_3 \} Zx2={Z2,Z3}

    • x 3 x_3 x3 R R R中的象集

      Z x 3 = { Z 1 , Z 3 } Z_{x3} = \{Z_1,Z_3 \} Zx3={Z1,Z3}

  • 除法

    给定关系 R ( X , Y ) R(\textcolor{red}X,\textcolor{cornflowerblue}Y) R(X,Y) S ( Y , Z ) S(\textcolor{cornflowerblue}Y,Z) S(Y,Z),其中 X , Y , Z X,Y,Z X,Y,Z为属性组, R R R中的 Y Y Y S S S中的 Y Y Y可以有不同的属性名,但必须出自相同的域集。 R R R S S S的除运算得到一个新的关系 P ( X ) \textcolor{red}{P(X)} P(X) P P P R \textcolor{red}R R中满足下列条件的元组 X X X属性列上的投影:

    元组在 X X X分量上的值 x x x的象集 Y x Y_x Yx包含 S S S Y Y Y上投影的集合。

    即: R ÷ S = { t r [ X ] ∣ t r ∈ R ∧ Π Y ( S ) ∈ Y X } R \div S = \left \{ t_r[X] \mid t_r \in R \land \Pi_Y(S) \in Y_X \right \} R÷S={tr[X]trRΠY(S)YX}

  • 除法示例

    image-20250518100423484

    在关系 R R R中, A A A可以取四个值 { a 1 , a 2 , a 3 , a 4 } \{a_1,a_2,a_3,a_4 \} {a1,a2,a3,a4}

    a 1 的象集为 { ( b 1 , c 2 ) , ( b 2 , c 3 ) , ( b 2 , c 1 ) } a_1的象集为\{(b_1,c_2),(b_2,c_3),(b_2,c_1) \} a1的象集为{(b1,c2),(b2,c3),(b2,c1)}

    a 2 的象集为 { ( b 3 , c 7 ) , ( b 2 , c 3 ) } a_2的象集为\{(b_3,c_7),(b_2,c_3)\} a2的象集为{(b3,c7),(b2,c3)}

    a 3 的象集为 { ( b 4 , c 6 ) } a_3的象集为\{(b_4,c_6) \} a3的象集为{(b4,c6)}

    a 4 的象集为 { ( b 6 , c 6 ) } a_4的象集为\{(b_6,c_6)\} a4的象集为{(b6,c6)}

    S S S ( B , C ) (B,C) (B,C)上的投影为

    { ( b 1 , c 2 ) , ( b 2 , c 1 ) , ( b 2 , c 3 ) } \{(b_1,c_2),(b_2,c_1),(b_2,c_3)\} {(b1,c2),(b2,c1),(b2,c3)}

    只有 a 1 a_1 a1的象集包含了 S S S ( B , C ) (B,C) (B,C)属性组,所以

    R ÷ S = { a 1 } R \div S = \{a_1 \} R÷S={a1}

  • 除法运算的结果属性是 R R R的属性中去掉与 S S S相同的属性后剩下的其它属性。

    image-20250518101433026

  • 除操作是同时从行和列角度进行运算

image-20250518161115284 ### 扩充的关系运算——属性重名名
  • r r r是模式 R R R上的一个关系, A A A R R R中的一个属性, B B B为属性名, B B B不是 R R R中的属性, B B B A A A具有相同的域。设 R ′ = ( R − A ) ∪ B R' = (R - A) \cup B R=(RA)B,则属性 A A A被重命名为 B B B后,得到的关系 r ′ r' r记为: r ′ ( R ′ ) = δ A → B ( r ) r'(R') = \delta_{A \rightarrow B}(r) r(R)=δAB(r)

  • 重命名后的关系 r ′ r' r可表示如下:

    r ′ ( R ′ ) = { t ′ ∣ t ′ ∈ r ′ ∧ t ∈ r ∧ t ′ [ R − A ] = t [ R − A ] ∧ t ′ [ B ] = t [ A ] } r'(R') = \{t' \mid t' \in r' \land t \in r \land t'[R-A] = t[R-A] \land t'[B] = t[A] \} r(R)={ttrtrt[RA]=t[RA]t[B]=t[A]}

  • 重命名运算可以作用于一组属性

  • 通过属性重命名运算,可以

    • 做同一个关系的笛卡尔积
    • 在同一个关系上做自然连接运算
    • 将两个关系的等值连接方便地表示为自然连接
  • 例:把学生关系中的学号和姓名 S n o Sno Sno S n a m e Sname Sname重命名为 S n o ′ Sno' Sno S n a m e ′ Sname' Sname

    δ S n o , S n a m e → S n o ′ , S n a m e ′ ( S t u d e n t ) \delta{Sno,Sname \rightarrow Sno',Sname'}(Student) δSno,SnameSno,Sname(Student)

扩充的关系运算——外连接

  • 连接运算是把二个关系中的元组按条件连接起来,结果为满足条件的元组集合,这样的连接称为内连接(inner join),还有一种连接称为外连接

  • **外连接(outer join)**是对自然连接运算的扩展。外连接结果中除了满足连接条件的元组外还包含没有被连接的元组。

  • 外连接分

    • 左外连接
    • 右外连接
    • 完全外连接
  • 左外连接

    • R ⋈ L S R \bowtie_L S RLS

    • 连接结果中包含了关系 R ( 左边关系 ) R(左边关系) R(左边关系)中不满足连接条件的元组,在这些元组对应关系 S S S属性上的值为空值。

    • R R R中任意元组,若 S S S中找不到匹配的元组,则 S S S用空元组与之对应; R R R的信息在左外连接的结果中都得到保留。

      image-20250518110458505

  • 右外连接

    • R ⋈ R S R \bowtie_R S RRS

    • 连接结果中包含了关系 S ( 右边关系 ) S(右边关系) S(右边关系)中不满足连接条件的元组,在这些元组对应关系 R R R属性上的值为空值。

    • S S S中任意元组,若 R R R中找不到匹配的元组,则 R R R用空元组与之对应。 S S S的信息在右外连接的结果中都得到保留。

      image-20250518110840516

  • 完全外连接

    • R ⋈ F S R \bowtie_FS RFS

    • 连接结果中包含了关系 R R R中不满足连接条件的元组,同时也包含了关系 S S S中不满足连接条件的元组;即连接结果时左外连接和右外连接结果的并。

  • 关系代数的连接运算

    image-20250518111440671

    自然连接属于内连接

关系代数表达式

  • 关系代数运算

    • 关系代数运算

      并、差、交、笛卡尔积、投影、选择、连接、除

    • 基本运算

      并、差、交、笛卡尔积、投影、选择

    • 交、连接、除法可以用5钟基本运算来表达

      $R \cap S = R - (R - S) $

      $R \bowtie_{A, \theta , B}S = \sigma_{A, \theta , B}(R \times S) $

      $R \div S = \Pi_X® - \Pi_X((\Pi_X® \times \Pi_Y(S) - R) $

      X X X R R R中除去与 S S S相同属性 Y Y Y之后的其余属性

  • 关系代数表达式

    • 关系代数运算经过有限次符合而形成的表达式,称为关系代数表达式。
    • 用关系代数表达式可以表示对数据库的各种操作
      • 检索(查询)
      • 插入
      • 删除
      • 修改(先删除,再插入)
  • 以关系代数运算为基础的数据子语言可以实现对数据库的所有查询和更新操作。关系代数的这种处理能力称为关系的完备性

  • 针对特定操作的关系代数表达式并不唯一。

关系代数对数据库操作示例

假设有如下表

S表

SnoSnameSageSsexSdept
200701刘明亮18计算机
200702李和平17外语
200703王茵21计算机
200704张小芳20数学

SC表

SnoCnoGrade
200701C185
200701C270
200701C378
200702C181
200702C284
200703C275
200703C390

C表

CnoCnameCdept
C1C语言计算机
C2英语外语
C3数据库计算机
C4数学数学
  • 检索计算机系学生的学号和姓名

    Π S n o , S n a m e ( σ S d e p t = ′ 计算 机 ′ ( S ) ) \Pi_{Sno,Sname}(\sigma_{Sdept = '计算机'}(S)) ΠSno,Sname(σSdept=计算(S))

    SnoSname
    200701刘明亮
    200703王茵
  • 检索选修了 C 1 C1 C1课的学生信息。

    Π S n o ( σ C n o = ′ C 1 ′ ( S C ) ) ⋈ S \Pi_{Sno}(\sigma_{Cno = 'C1'}(SC)) \bowtie S ΠSno(σCno=C1(SC))S

    SnoSnameSageSsexSdept
    200701刘明亮18计算机
    200702李和平17外语
  • 检索不选 C 1 C1 C1课的学生信息。

    S − ( Π S n o ( σ C n o = ′ C 1 ′ ( S C ) ) ⋈ S ) S - ( \, \Pi_{Sno}(\sigma_{Cno = 'C1'}(SC)) \, \bowtie S) S(ΠSno(σCno=C1(SC))S)

    SnoSnameSageSsexSdept
    200703王茵21计算机
    200704张小芳20数学
  • 检索选秀了全部课程的学生的学号

    Π S n o , C n o ( S C ) ÷ Π C n o ( C ) \Pi_{Sno,Cno}(SC) \div \Pi_{Cno}(C) ΠSno,Cno(SC)÷ΠCno(C)

    ∅ \emptyset 空集

  • 插入学号为 200701 200701 200701的学生选修了 C 4 C4 C4课、成绩为 88 88 88分的选课记录。

    ​ $SC , \cup , {‘200701’,‘C4’,88 } $

    SnoCnoGrade
    200701C185
    200701C270
    200701C378
    200701C488
    200702C181
    200702C284
    200703C275
    200703C390
  • 删除学生刘明亮选秀的英语课。

    S C − ( Π S n o ( σ S n a m e = ′ 刘明 亮 ′ ( S ) ) ⋈ S C ⋈ Π C n o ( σ C n a m e = ′ 英 语 ′ ( C ) ) SC - (\Pi_{Sno}(\sigma_{Sname='刘明亮'}(S)) \, \bowtie \, SC \, \bowtie \, \Pi_{Cno}(\sigma_{Cname='英语'}(C)) SC(ΠSno(σSname=刘明(S))SCΠCno(σCname=(C))

    SnoCnoGrade
    200701C185
    200701C378
    200701C488
    200702C181
    200702C284
    200703C275
    200703C390
  • 检索与李勇在同一个系的学生的学号和姓名(假设有李勇这个人在表中)

    方式一:

    采用属性重命名

    image-20250518132001181

    Π S n o ′ , S n a m e ′ ( σ S n a m e = ′ 李 勇 ′ ( S ⋈ δ S n o , S n a m e , S a g e , S s e x → S n o ′ , S n a m e ′ , S a g e ′ , S s e x ′ ( S ) ) ) \Pi_{Sno',Sname'}( \\ \sigma_{Sname='李勇'}(S\, \bowtie \\ \, \delta_{Sno,Sname,Sage,Ssex \, \rightarrow \, Sno',Sname',Sage',Ssex'}(S))) ΠSno,Sname(σSname=(SδSno,Sname,Sage,SsexSno,Sname,Sage,Ssex(S)))

    方式二:

    Π S n o , S n a m e , S d e p t ( S ) ÷ Π S d e p t ( σ S n a m e = ′ 李 勇 ′ ( S ) ) \Pi_{Sno,Sname,Sdept}(S) \div \Pi_{Sdept}(\sigma_{Sname='李勇'}(S)) ΠSno,Sname,Sdept(S)÷ΠSdept(σSname=(S))

  • 查询至少选修 C 1 C1 C1课程和 C 3 C3 C3课程的学生的学号

    首先建立一个临时关系 K K K

    Cno
    C1
    C3

    然后求 Π S n o , C n o ( S C ) ÷ K \Pi_{Sno,Cno}(SC) \div K ΠSno,Cno(SC)÷K

    所以查询语句关系代数为:

    KaTeX parse error: Undefined control sequence: \or at position 53: …ma_{Cno = 'C1' \̲o̲r̲ ̲Cno = 'C3' }(C)…

    Sno
    200701
  • 查询至少选修了一门其先行课号 C p n o Cpno Cpno为5的课程的学生姓名。

    假设有如下三张表,进行这个检索指令

    方法1: Π S n a m e ( σ C p n o = ′ 5 ′ ( C ⋈ S C ⋈ S ) ) \Pi_{Sname}(\sigma_{Cpno='5'}(C \, \bowtie \, SC \, \bowtie \, S)) ΠSname(σCpno=5(CSCS))

    方法2: Π S n a m e ( σ C p o = ′ 5 ′ ( C ) ⋈ S C ⋈ Π S n o , S n a m e ( S ) ) \Pi_{Sname}(\sigma_{Cpo='5'}(C)\, \bowtie \, SC \, \bowtie \, \Pi_{Sno,Sname}(S)) ΠSname(σCpo=5(C)SCΠSno,Sname(S))

    方法3: Π S n a m e ( Π S n o ( σ C p n o = ′ 5 ′ ( C ) ⋈ S C ) ⋈ Π S n o , S n a m e ( S ) ) \Pi_{Sname}(\Pi_{Sno}(\sigma_{Cpno = '5'}(C) \bowtie SC )\, \bowtie \, \Pi_{Sno,Sname}(S)) ΠSname(ΠSno(σCpno=5(C)SC)ΠSno,Sname(S))

  • 查询了选修了全部课程的学生的学号和姓名

    步骤一:找出选修了全部课程的学生的学号:

    Π S n o , C n o ( S C ) ÷ Π C n o ( C ) \Pi_{Sno,Cno}(SC) \div \Pi_{Cno}(C) ΠSno,Cno(SC)÷ΠCno(C)

    步骤二:找出全部学生的学号和姓名:

    Π S n o , S n a m e ( S ) \Pi_{Sno,Sname}(S) ΠSno,Sname(S)

    最后完整: Π S n o , C n o ( S C ) ÷ Π C n o ( C ) ⋈ Π S n o , S n a m e ( S ) \Pi_{Sno,Cno}(SC) \div \Pi_{Cno}(C) \, \bowtie \, \Pi_{Sno,Sname}(S) ΠSno,Cno(SC)÷ΠCno(C)ΠSno,Sname(S)

典型关系代数语言

  • ISBL(Information System Base Language)

    • IBM United Kingdom研究中心研制

    • 用于**PRTV(Peterlee Relational Test Vehicle)**实验系统

    • 与关系代数十分相近

    • 允许将关系表达式的值赋给一个关系变量

    • 允许属性的重命名

    • 可以完成关系代数的五种基本运算,是关系完备的

    • 参阅表3-4

      image-20250518144832238

      例子:

      • 检索计算机系学生的学号和姓名

        LIST Student: Sdept = ‘计算机’ % Sno, Sname

      • 检索选修了C1课的学生姓名和学生所在系

        R = Student * SC

        LIST R: Cno = ‘C1’ % Sname, Sdept

3. 关系演算

  • 关系演算:使用谓词演算表达对关系数据的查询

    • 用谓词的形式给出查询结果应该满足的条件;
    • 是以谓词演算为基础的关系数据查询语言;
    • 如何实现查询由系统子集解决;
    • 高度非过程化。
  • 关系演算

    • 元组关系演算

      谓词变量是元组变量

    • 域关系演算

      谓词变量是域变量

元组关系演算

用如下表

image-20250518150625345

  • 用元组演算表达式表示查询

  • 元组演算表达式的形式

    { t : φ ( t ) } \{t: \varphi(t) \} {t:φ(t)}

    • t t t是元组变量,表示某一关系中的元组
    • φ ( t ) \varphi(t) φ(t)是由原子公式和运算符组成的公式。
  • “检索计算机系的学生姓名”的元组演算表达式为:

    { t [ 2 ] : S ( t ) ∧ t [ 5 ] = ′ 计算 机 ′ } \{t[2]:S(t) \, \land \, t[5] = '计算机' \} {t[2]:S(t)t[5]=计算}

    检索选修了C1课的学生信息

    KaTeX parse error: Undefined control sequence: \and at position 13: \{t:S(t) \, \̲a̲n̲d̲ ̲\, \exist u(SC(…

  • 元组关系演算语言ALPHA

    • E.F.Codd提出来的

    • 语言的基本格式为:

      ( 操作符 ) < 工作空间名 > ( 表达式 ) [ : < 条件 > ] (操作符) \, <工作空间名> \, (表达式)[:<条件>] (操作符)<工作空间名>(表达式)[:<条件>]

      • **操作符**为命令语句完成的功能,包括 G e t 、 P u t 、 U p d a t e 、 H o l d 、 D e l e t e Get、Put、Update、Hold、Delete GetPutUpdateHoldDelete
      • **工作空间**是用户与数据库间的数据通信区,用字母 w w w表示
      • **表达式**用于指定语句的操作对象,它可以是关系名或(和)属性名,一条语句可以同时操作多个关系或多个属性。
      • 条件是一个含逻辑运算符的谓词公式(逻辑表达式),用于将操作结果限定在满足条件的元组中;操作条件可以为空。
  • Alpha查询示例

    • 查询所有被选修的课程号码

      G E T W ( S C . C n o ) GET W (SC.Cno) GETW(SC.Cno)

    • 查询信息系(IS)中年龄小于20的学号和年龄

      G E T W ( S t u d e n t . S n o , S t u d e n t . S a g e ) : S t u d e n t . S d e p t = ′ I S ′ ∧ S t u d e n t . S a g e < 20 GET W (Student.Sno,Student.Sage): \\ Student.Sdept='IS' \, \land \, Student.Sage < 20 GETW(Student.Sno,Student.Sage):Student.Sdept=ISStudent.Sage<20

    • 查询计算机科学系(CS)学生的学号、年龄,结果按年龄降序排序。

      $GET W (Student.Sno,Student.Sage): \ Student.Sdept=‘CS’ \textcolor{red}{DOWN} Studetn.Sage $

域关系演算

  • 关系运算表达式中的变量若是**域变量**,则为域关系演算。

  • 与元组变量不同,域变量的变化范围是**指定属性的域**而不是整个关系。

  • 域关系演算表达式的形式

    $ {t_1,t_2,……,t_k: \varphi(t_1,t_2,……,t_k) } $

    • t 1 , t 2 , … … , t k t_1,t_2,……,t_k t1,t2,……,tk是域变量
    • φ ( t 1 , t 2 , … … , t k ) \varphi(t_1,t_2,……,t_k) φ(t1,t2,……,tk)是由原子公式和运算符组成的公
  • “检索计算机系的学生姓名”

    $ {t_1:S(Sname:t_1,Sdept:计算机) } $

  • 域关系演算语言QBE——Query By Example

    • 由M.M.Zloof提出
    • 1978年在IBM370上得以实现
    • 基于屏幕表格的查询语言
    • 以填写表格的方式构造查询
    • 用示例元素(域变量)来表示查询结果可能的情况
    • 查询结果以表格形式显示
    • 是一种非专业用户使用的高级语言
  • QBE的主要操作命令有

    P . ( 显示 ) 、 I . ( 插入 ) 、 D . ( 删除 ) 、 U . ( 修改 ) P.(显示)、I.(插入)、D.(删除)、U.(修改) P.(显示)I.(插入)D.(删除)U.(修改)

  • QBE操作框架

    image-20250518153052917

  • QBE检索操作示例

    image-20250518153217658

4.关系数据语言

  • 关系数据语言的特点

    • 是一中高度非过程化的语言
      • 存取路径的选择由DBMSd的优化机制来完成
      • 用户不必应用循环结构就可以完成数据操作
    • 能够嵌入高级语言中使用
  • 关系代数语言

    • 用对关系的运算来表达查询要求
    • 典型代表:ISBL
  • 关系演算语言:用谓词来表达查询要求。

    • 按谓词变元的基本对象的不同分:
      • 元组关系演算语言
        • 谓词变元的基本对象是元组变量
        • 典型代表:ALPHA,QUEL
      • 域关系演算语言
        • 谓词变元的基本对象是域变量
        • 典型代表:QBE
  • 具有关系代数和关系演算双重特点的语言

    • 典型代表:SQL(Structural Query Language)
    • 它是集Query、DDL、DML、DCL于一体的关系数据语言,充分体现了关系数据语言的特点和优点,是关系数据库的标准语言。

5. 关系运算的安全限制

  • 关系是集合论中的概念,在集合论中,关系可以是无限的。
  • 在关系数据库中,关系被限定为有限的
  • 不产生无限关系的关系表达式称为安全运算表达式,所采取的措施称为安全限制
    • 关系代数运算是安全的,只要参加运算的关系是有限的;关系运算的结果也是有限的;关系运算的有限次复合不会出现无限关系。
    • 关系演算不一定是安全的,需要加以限制;通常方法是定义一个有限的符号集。

6. 关系运算的等价性

  • 在加以安全限制后,三种关系运算(关系代数、元组关系演算、域关系演算)在表达关系的功能上是等价的。
  • 如果 E E E是一个关系代数表达式,则必定存在一个与 E E E等价的安全的元组关系演算表达式;对于每个安全的元组关系演算表达式,必定存在一个等价的安全的域关系演算表达式;对于每个安全的域关系演算表达式,也必定存在一个等价的关系代数表达式。

本章小结

  • 关系模型的三要素
    1. 关系数据结构
      • 关系,关系模式,关系数据库
    2. 关系的完整性约束
      • 实体完整性、参照完整性、其他完整性
    3. 关系操作
      • 检索、插入、删除、修改等
      • 关系代数
      • 关系演算
        • 元组关系演算
        • 域关系演算
  • 关系数据语言
  • 关系运算的安全性和等价性
http://www.xdnf.cn/news/7149.html

相关文章:

  • leetcode报错原因总结需要背下来的程序片 [更新中]
  • MinIO:从入门到精通,解锁云原生存储的奥秘
  • 程序代码篇---python向http界面发送数据
  • Ubuntu搭建TFTP服务器的方法
  • OpenCL C++图像纹理处理
  • jvm安全点(四)openjdk17 c++源码垃圾回收之安全点轮询页内存设置不可访问
  • 前端图片上传组件实战:从动态销毁Input到全屏预览的全功能实现
  • 备份C#的两个类
  • 【DAY22】 复习日
  • 三、高级攻击工具与框架
  • React Flow 边的基础知识与示例:从基本属性到代码实例详解
  • 飞机飞行控制系统补偿模型辨识报告
  • HarmonyOS AVPlayer 音频播放器
  • 【2025软考高级架构师】——2022年11月份真题与解析
  • 【方法论】如何构建金字塔框架
  • C++ for QWidget:connect(连接)
  • C++ asio网络编程(8)处理粘包问题
  • Java IO及Netty框架学习小结
  • 学习黑客 http 响应头
  • Spark 基础自定义分区器
  • 游戏:英雄联盟游戏开发代码(谢苏)
  • 互联网大厂Java面试场景:从简单到复杂的技术深度解析
  • Java注解篇:@CrossOrigin
  • 鸿蒙AI开发:10-多模态大模型与原子化服务的集成
  • 大学之大:墨西哥国立自治大学2025.5.18
  • STM32项目实战:ADC采集
  • [原创工具] 小说写作软件
  • java springMVC+MyBatis项目1,服务端处理json,RequestBody注解,Form表单发送,JavaScript发送
  • 【量子计算与云架构】加密与算法革新展望
  • Python format()函数高级字符串格式化详解