精华内容
下载资源
问答
  • 的一列即为一个属性,给每一个属性一个名称,即属性名 4)码(键) 码是数据系统的基本概念。所谓码就是能唯一标识实体的属性,他是整个实体集的性质,而不是单个实体的性质。它包括超码,候选码,主码。 ...

    1)关系(Relation)

    一个关系对应通常说的一张表

    2)元组(Tuple)

    表中的一行即为一个元组

    3)属性(Attribute)

    表中的一列即为一个属性,给每一个属性起一个名称,即属性名

    4)码(键)

    码是数据系统中的基本概念。所谓码就是能唯一标识实体的属性,他是整个实体集的性质,而不是单个实体的性质。它包括超码,候选码,主码。

    • 超码是一个或多个属性的集合,这些属性可以让我们在一个实体集中唯一地标识一个实体。
    • 候选码:关系(表)中的某个属性组,它可以唯一确定一个元组。
    • 若一个关系(表)中有多个候选码,则选定其中一个为主码。
    • 全码:关系的所有属性都包含在候选码中。
    • 主属性:包含在任何一个候选码中的属性
    • 非主属性 不包含在任何码中的属性
    • 主码: 主键就是候选键里面的一个,是人为规定的,例如学生表中,我们通常会让“学号”做主键,教师表中让“教师编号”做主键。
    • 外码: 外键比较简单,学生表中的外键就是“教师编号”。外键主要是用来描述两个表的关系。
    • 域(Domain):属性的取值范围。
    • 分量:元组中的一个属性值。
    • 形式化定义
      R(D 1 ,D 2 ,…D n )
      R:关系名
      n:关系的目或度(Degree)
      例:
      关系名(属性1,属性2,…,属性n)
      学生(学号,姓名,年龄,性别,系,年级)
      候补码和超码
      候选码是从超码中选出的,自然地候选码也是一个或多个属性的集合。
      因为超码的范围太广,很多是我们并不感兴趣即无用处的。所以候选码是最小超码,它们的任意真子集都不能成为超码。
      例如,如果K是超码,那么所有包含K的集合都不能是候选码;如果K,J都不是超码,那么K和J组成的集合(K,J)有可能是候选码。
    展开全文
  • 候选码(Candidate Key):能唯一标识关系中元组一个属性属性集 性质:唯一性,最小性 二、关系的主码和外码 主码(Primary Key):从多个候选码选择一个作为查询、插入或删除元组的操作变量,被选用的候选码...

    一、关系的候选码

    候选码(Candidate Key):能唯一标识关系中元组的一个属性属性集

    性质:唯一性,最小性

    二、关系的主码和外码

    主码(Primary Key):从多个候选码中选择一个作为查询、插入或删除元组的操作变量,被选用的候选码称为主关系码(主键,主码,关系键,关键字)

    每个关系必定有且仅有一个主码,选定后不能重复!

    相关概念

    • 主属性(Prime Attribute):包含在主码中的各个属性称为主属性
    • 非主属性(Non-Prime Attribute):不包含在任何候选码中的属性称为非主属性(或非码属性)
    • 全码:所有属性的组合是关系的候选码
    • 超码:包含候选码的属性集合

    外码(Foreign Key):如果关系R2的一个或一组属性X不是R2的主码,而是另一个关系R1的主码,则该属性或属性组X称为关系R2的外部关系键或外码,并称R2为参照关系(Referencing Relation),关系R1称为被参照关系(Referenced Relation)

    被参照关系的主码和参照关系的外码必须定义在同一个域上

    三、关系完整性

    1、概述

    ​ 为了维护关系数据库中数据与现实世界的一致性,对关系数据库的插入、删除和修改操作必须有一定的约束条件,这些约束条件实际上是现实世界的要求。任何关系在任何时刻都要满足这些语义约束

    2、三类完整性约束

    • 实体完整性:必须满足的性质
      • 定义:主码的值不能为空或部分为空
    • 参照完整性:必须满足的性质
      • 定义:如果关系R2的外码X与关系R1的主码相符,则X的每个值或者等于R1中主码的某一个值或者取空值
    • 用户自定义完整性:具体领域的语义约束
      • 定义:针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求

    四、关系代数

    1、关系代数的分类及其运算符

    • 关系代数是一种抽象的查询语言
    • 关系代数的运算对象与运算结果都是关系
    • 关系代数运算符

    关系代数的运算按运算符的不同主要分为两类

    • 传统的集合运算

      • 把关系看成元组的集合,以元组作为集合中元素来进行运算,其运算时从关系的“水平”方向即行的角度进行的。包括并、差、交和广义笛卡尔积等运算

      • 传统集合(除笛卡尔积)是典型的二目运算,因此需要在两个关系中进行,两个关系R,S若满足

        • 具有相同的度n
        • R中第i个属性和S中第i个属性必须来自同一个域(列同质)

        则说关系R、S是相容的

    • 专门的关系运算

      • 不仅涉及行运算,也涉及列运算,这种运算是为数据库的应用而引进的特殊运算。包括选取、投影、连接(θ连接,自然连接)和除法等运算

    2、连接

    • θ连接:等值连接,小于连接,大于连接
    • 自然连接:在等值连接的情况下,当连接属性X与Y具有相同属性组时,把在连接结果中重复的属性列去掉

    等值连接与自然连接的区别

    • 自然连接要求相等属性值的属性名相同,而等值连接不要求
    • 自然连接是去掉重复列的等值连接

    3、除法

    除法运算是二目运算,设有关系R(X,Y)与关系S(Y,Z),其中X,Y,Z为属性集合,R中的Y与S中的Y可以有不同的属性名,但对应属性必须出自相同的域

    五、元组关系的演算

    • 定义:元组关系演算中,以元组为单位,通过谓词公式约束所要查找元组的条件,可以表示为{t |ψ(t)}。
      其中,t为元组变量,即查询的目的。ψ称为元组演算的谓词公式,即查询的条件。
    • {t |ψ(t)}表示使为真的元组t的集合。
    • ψ(t)可以通过原子公式、约束变量、自由变量、运算符构成
    • 若元组演算公式中的一个元祖变量前有“全称量词”和“存在量词”,则称该变量为约束元组变量,否则称自由元组变量

    六、域关系演算

    定义:以元组中的域为单位,按照谓词公式所约束的条件查询所需的元组,表示为:{<x1,x2,…xn>|R(x1,x2,…xn)}

    • 其中x1,x2,…xn代表域变量,即元组的分量,R代表由原子构成的公式
    • R的定义如元组演算关系,同样是反复由原子公式、自由变量、约束变量和运算符构成

    域关系演算语言

    QBE(Query By Example)

    • 它是一种高度的非过程化,基于屏幕表格的查询语言
    • 用户通过填写表格,并给出查询事例的方式获取结果
    • 给出的查询事例是域变量

    QBE语言的使用

    关系名属性1属性n
    操作命令属性值或查询条件属性值或查询条件
    • 操作命令:P打印或显示、U修改、I插入、D删除
    • 或关系写在两行中
    • 多表查询时,需要给出相同例子的域变量
    展开全文
  • 包括一个运算的集合,集合运算以一个或两个关系为输入,产生一个新的关系作为结果。 关系代数的基本运算包括:选择、投影、并、集合差、笛卡尔积、更名。 其他运算:集合交、自然连接、赋值,可用基本运算来定义...

    关系代数

    关系代数(relational algebra):一种过程化查询语言。包括一个运算的集合,集合中运算以一个或两个关系为输入,产生一个新的关系作为结果。

    关系代数的基本运算包括:选择、投影、并、集合差、笛卡尔积、更名。

    其他运算:集合交、自然连接、赋值,可用基本运算来定义。

    关系运算的结果自身也是一个关系,可用一个关系运算表达式作为另一个关系运算的参数,因此可以把多个关系代数运算组合成一个关系代数表达式(relational-algebra expression

     

    关系代数定义了一套在表上运算且输出结果也是表的代数运算。这些运算可以混合使用来得到表达所希望查询的表达式。关系代数定义了关系查询语言中使用的基本运算。

    关系代数运算可分为:基本运算、附加的运算(可用基本运算表达)、扩展的运算(其中一些扩展了关系代数的表达能力)。

    关系代数是一种简介的、形式化的语言,不适用于那些偶尔使用数据库系统的用户,因此商用数据库系统采用有更多“语法修饰”的语言。(SQL基于关系代数)

     

    1. 基本运算

    一元运算:对一个关系进行运算,包括选择、投影、更名运算。

    二元运算:对两个关系进行运算,包括并、集合差、笛卡尔积运算。

     

    选择(select)运算选出满足给定谓词的元组,用小写sigma(σ)表示,下标为谓词,括号中为参数关系。

    e.g. 找出关系instructor中属于物理系的所有教师

    σdept_name=”Physics”(instructor)

    e.g. 找出工资额大于90000美元的所有教师

    σsalary>90000(instructor)

    可用连词and(∧)、or(∨)、not(¬)将多个谓词合并为一个较大的谓词。

    e.g. 找出属于物理系且工资大于90000美元的所有教师

    σdept_name=”Physic”salary>90000(instructor)

    选择谓词中可包括两个属性的比较。

    e.g. 找出所有系名与楼名相同的系

    σdept_name=building(department)

    注意:关系代数中的属于select与SQL中的关键词select含义不同,关系代数中属于select对应SQL中的where。

     

    投影(project)运算:返回作为参数的关系,但把某些属性排除在外,所有重复行均被去除。用大写pi(Π)表示,下标为在结果中出现的属性,括号中为参数关系。

    e.g. 列出所有教师的ID、name和salary,而不关系dept_name。

    ΠID, name, salary(instructor)

    e.g. 找出物理系所有教师的名字

    Πnamedept_name=”Physics”(instructor))

     

    并(union)运算: 可将两个集合并起来,找出出现在两个集合之一或同时出现在两个集合中的所有元组。用表示。

    e.g. 找出开设在2009年秋季学期或者2010年春季学期或者这二者皆开的所有课程的集合。

    Πcourse_idsemester=”Fall”year=2009(section))∪Πcourse_idsemester=”Spring”year=2010(section))

    /*注意:结果中重复值只留下单个元组。*/

    必须保证做并运算的关系是相容的,否则运算结果没有意义。要使并运算rs有意义(rs可以是数据库关系或作为关系代数表达式结果的临时关系),要求以下两个条件同时成立:

    a. 关系r和s必须是同元的(属性数目相同)。

    b. 对所有的i,r的第i个属性的域必须和s的第i个属性的域相同。

     

    集合差(set-difference)运算:表达式r-s包含所有在r中而不在s中的元组的关系。

    e.g. 找出所有开设在2009年秋季学期但是在2010年春季学期不开的课程。

    Πcourse_idsemester=”Fall”year=2009(section))-Πcourse_idsemester=”Spring”year=2010(section))

    类似并运算,必须保证做集合叉运算的关系是相容的,否则运算结果没有意义。要使集合差运算r-s有意义,要求一下两个条件同时成立:

    a. 关系r和s必须是同元的。

    b. 对所有的i,r的第i个属性的域必须和s的第i个属性的域相同。

     

    笛卡尔积(Cartesian-product)运算:将任意两个关系的信息组合在一起,结果中包含所有可能的元组对。关系r1和r2的笛卡尔积写作r1×r2,假如r1有n1个元组,r2有n2个元组,则可由n1×n2种方式选择元组对。

    由于相同的属性名可能同时出现在r1和r2中,需要一个命名机制来区别这些属性。可采用把属性所来自的关系名称附加到该属性上的方法。

    e.g. r = instructor×teaches的关系模式

    (instructor.ID, instructor.name, instructor.dept_name, instructor.salary, teaches.ID, teaches.course_id, teaches.sec_id, teaches.semeser, teaches.year)

    /*对于只在两个关系模式之一出现的属性,通常省略其关系名前缀。因此可将r的关系模式写作:*/

    (instructor.ID, name, dept_name, salary, teaches.ID, course_id, sec_id, semester, year)

    注意:该命名规则规定作为笛卡尔积运算参数的关系名称必须不同,因此当某个关系要与自身做笛卡尔积或在笛卡尔积中使用关系代数表达式结果时可能产生问题,可通过更名运算给关系一个名字以引用其属性来解决。

    e.g. 找出物理系中的所有教师,以及他们所教授的所有课程。

    /* σdept_name=”Physics”(instructor×teaches)只包含物理系的教师的元组,但course_id列可能包含并非这些教师所教授的课程;

    σinstructor.ID=teaches.IDdept_name=”Physics”(instructor×teaches))包含物理系教师以及他们所教的课程的元组;

    Πname, course_idinstructor.ID=teaches.IDdept_name=”Physics”(instructor×teaches)))投影得到需要的教师名字列和corse_id列。*/

    Πname, course_idinstructor.ID=teaches.IDdept_name=”Physics”(instructor×teaches)))

    /*用关系代数表达查询的方法并不唯一,也可采用如下等价查询:*/

    Πname, course_idinstructor.ID=teaches.ID((σdept_name=”Physics”(instructor))×teaches))

     

    更名(rename)运算:给关系代数表达式的结果赋上名字以供引用,用小写rho(ρ)表示。

    表达式ρx(E)返回给定关系代数表达式E的结果并把名字x赋给它。更名运算也可用于关系,可得到具有新名字的一个相同的关系。

    更名运算的另一形式:ρx(A1, A2, …, An)(E)。假设关系代数表达式E是n元的,运算返回表达式E的结果,并把名字x赋给它,同时将各属性更名为A1, A2, …, An

    e.g. 找出大学里的最高工资

    /*步骤1:计算出一个由非最高工资组成的临时关系。

    首先通过更名运算引用其中一个instructor关系以便计算笛卡尔积instructor×instructor,再构造选择运算比较任意两个出现在同一元组中的salary选择较低的元组。通过投影选取instructor.salary列得到非最高工资构成的临时关系*/

    Πinstructor.salaryinstructor.salary<d.salary(instructor×ρd(instructor)))

    /*步骤2:计算关系Πsalary (instructor)和刚才计算出的非最高工资构成的临时关系的集合差,得到结果。*/

    Πsalary (instructor)-Πinstructor.salaryinstructor.salary<d.salary(instructor×ρd(instructor)))

     

    更名运算不是必须的,因为可以用位置标记隐含地作为关系(或关系代数表达式运算的结果)的属性名,用$1、$2、…指代第一个属性、第二个属性…以此类推。

    e.g. 用位置标记来计算大学里的非最高工资构成的临时关系

    /*在笛卡尔积(instructor×instructor)中,$4代表第一个instructor的属性salary,$8代表第二个instructor的属性salary。*/

    Π$4$4<$8(instructor×instructor))

    如果一个二元运算需要区分其运算对象的两个关系,也可使用为指标及作为关系的名称。E.g. $R1指代第一个作为运算对象的关系,$R2指代第二个关系。

     

     

    2. 关系代数的形式化定义

    关系代数中基本的表达式是以下二者之一:a. 数据库中的一个关系;b. 一个常数关系。

     

    常数关系:可在{}内列出其元组来表示。

    E.g. {(22222, Einstein, Physics, 95000), (76543, Singh, Finance, 80000)}

     

    设E1和E2都是关系代数表达式,则以下这些都是关系代数表达式:

    ·E1∪E2

    ·E1-E2

    ·E1×E2

    ·σp(E1),P为E1属性上的谓词。

    ·ΠS(E1),S为E1上某些属性的列表。

    ·ρx(E1),x为E1结果的新名字。

     

     

    3. 附加的关系代数表达式

    关系代数的基本运算足以表达任何关系代数查询。附加的关系代数运算不能增强关系代数的表达能力,但可以简化一些常用的查询。

     

    集合交(intersection)运算 ()

    e.g. 找出在2009年秋季和2010年春季都开设的课程

    Πcourse_idsemester=”Fall”year=2009(section))∩Πcourse_idsemester=”Spring”year=2010(section))

    任何使用了集合交的关系代数表达式都可以通过一对集合差运算替代重写:

    r∩s=r-(r-s)

     

    自然连接(natural join)运算 ():首先形成两个参数关系的笛卡尔积,然后基于两个关系模式中都出现的属性上的相等性进行选择(只考虑两个关系在所有相同属性有相同值的元组组成的元组对),最后去除重复属性(并不重复记录在两个关系模式中都出现的属性)。

    自然连接的形式化定义:

    设r(R)和s(S)(模式分别为R和S的两个关系),其自然连接的结果r ⋈ s是模式R∪S上的一个关系。

    r ⋈ s = ΠRSr.A1=s.A1r.A2=s.A2r.An=s.An(r×s)),其中R∩S={A1, A2, …, An}。

    如果r和s不含有任何相同属性,即R∩S=∅,则r ⋈ s = r×s。

    所列出的属性的顺序:两个关系模式的相同属性排在最前,只属于第一个关系模式的属性其次,只属于第二个关系模式的属性最后。

    e.g. 找出所有教师的姓名,连同他们教的所有课程的course_id。

    /*instructor和teaches自然连接的结果模式为(ID, name, dept_name, salary, course_id),投影后得到模式为(name, course_id)的关系。*/

    Πname, course_id(instructor ⋈ teaches)

     考虑两个关系模式R和S,可将关系模式看作集合:用R∩S表示同时出现在R和S中的属性名,用R∪S表示出现在R中、S中或在二者中都出现的属性名,用R-S表示出现在R中而不出现在S中的属性名,用S-R表示出现在S中而不出现在R中的属性名。

    自然连接时可结合的(associative)。

    e.g. 找出计算机系的所有教师,以及他们教授的所有课程的名称。

    /* 自然连接instructor ⋈ teaches ⋈ course的执行顺序可能为

    (instructor ⋈ teaches) ⋈ course 或 instructor ⋈ (teaches ⋈ course),二者是等价的。*/

    Πname, titledept_name=”Comp.Sci.”(instructor ⋈ teaches ⋈ course))

     theta连接(theta join)运算:是自然连接的扩展。

    考虑关系r(R)和s(S),θ是模式R∪S的属性上的谓词。r ⋈θ s = σθ(r×s)

     

    赋值(assignment)运算 ():可用于给临时关系变量赋值,便于写关系代数表达式。

    e.g. 自然连接运算r ⋈s的定义可写作

    temp1←r×s

    temp2←σr.A1=s.A1r.A2=s.A2r.An=s.An(temp1)

    result = ΠRS(temp2)

    对关系代数查询而言,赋值必须是赋给一个临时关系变量。对永久关系的赋值形成了对数据库的修改。

     

    外连接(outer-join)运算:连接运算的扩展,可处理缺失的信息(因为不满足自然连接条件而不能在自然连接结果中找到的元组),避免信息的丢失。

    外连接运算与自然连接运算类似,不同之处在于外连接在连接计算结果中添加额外的带空值的元组,以此保留在连接中丢失的元组。

    外连接运算有三种形式:

    左外连接(left outer join)():取出左侧关系中所有与右侧关系的任一元组都不匹配的元组,用空值填充所有来自右侧关系的属性,再把产生的元组加到自然连接的结果中。所有来自左侧关系的信息在左外连接结果中都得到保留。

    右外连接(right outer join)():与左外连接相对称,用空值填充来自右侧关系的所有与左侧关系任一元组都不匹配的元组,将结果加到自然连接的结果中。所有来自右侧关系的信息在右外连接中都得到保留。

    全外链接(full outer join)():既做左外连接又做右外连接,既填充左侧关系中与右侧关系的任一元组都不匹配的元组,又填充右侧关系中与左侧关系任一元组都不匹配的元组,并把结果都加到连接的结果中。

    注意:外连接运算可用基本关系代数运算表示。E.g. 左外连接运算r⟕s可写作

    /*其中常数关系{(null, …, null)}的模式为S-R。*/

    (r ⋈ s)∪(r - ΠR(r ⋈ s)) × {(null, …, null)}

     

     

    4. 扩展的关系代数运算

    扩展的关系代数(extended relational-algebra)运算可实现一些不能用基本的关系代数运算来表达的查询

     

    广义投影(generalized-projection):通过允许在投影列表使用算术运算和字符串函数等来对投影进行扩展。

    运算形式:

    ΠF1, F2, …, Fn(E)

    其中E为任意关系代数表达式,F1, F2, …, Fn都是涉及常量以及E的模式中属性的算术表达式。

    最基本情况下算术表达式可以仅仅是一个属性或常量,在表达式中可使用对数值属性或产生数值结果的表达式的+、-、*、/等代数运算。广义投影还允许其他数据类型上的运算(如字符串的串接)。

    e.g. 查询每个教师的ID、name、dept_name以及每月的工资

    ΠID, name, dept_name, salary/12(instructor)

     

    聚集运算(?)

    聚集函数(aggregate function):输入值的一个汇集,将单一值作为结果返回。E.g. 聚集函数sum、avg、count、min、max。

    e.g. 使用聚集查询所有教师的工资总和的关系代数表达式

    ? sum(salary)(instructor)

     

    在计算聚集函数前如果想去除重复,可使用连字符将distinct附加在函数名后。

    e.g. 找出在2010年春季学期教课的教师数(每名教师只应计算一次,而不管他教了几门课程。)

    /*聚集函数count-distinct确保:即使某位教师授课多于一门,在结果中也只对他计数一次。*/

    ? count-distinct(ID)semester=”Spring”year=2010(teaches) )

     

    可对一组元组集合(而不是单个元组集合)执行聚集函数。

    聚集运算的通常形式为:

    G1, G2, …, Gn? F1(A1), F2(A2), …, Fm(Am)(E)

    其中E为任意关系代数表达式,G1, G2, …, Gn是用于分组的一系列属性,每个Fi是一个聚集函数,每个Ai是一个属性名。表达式E的结果中的元组被分成若干组,各组用属性G1, G2, …, Gn上的值唯一标识。

    属性列G1, G2, …, Gn可以为空,则唯一一组包含关系中所有的元组(相当于没有分组)。

    e.g. 分别查询a. 每个系教师的平均工资 b. 所有教师的平均工资

    /*先通过dept_name属性对关系instructor进行分组,再对每个分组执行指定查询。*/

    dept_name ? average(salary)(instructor)

    /*从运算符?左边去掉了属性dept_name,整个关系被当做单个组来执行聚集。*/

    ? average(salary)(instructor)

     

    多重集(multiset):使用聚集函数对其进行操作的汇集中,一个值可以出现多次,值出现的顺序是无关紧要的,这样的汇集称为多重集。集合(set)是多重集的特例,其中每个值都只出现一次。

    多重集关系代数(multiset relational algebra):SQL与关系代数不同,允许在输入关系以及查询结果汇总存在元组的多重拷贝。为了映射SQL的这种模式,我们定义了多重集关系代数来对多重集进行操作。

    多重集关系代数基本运算的定义:

    1. 如果在r1元组t1有c1份拷贝,并且t1满足选择σθ,那么在σθ(r1)中元组t1有c1份拷贝;

    2. 对于r1中元组t1的每份拷贝,在ΠA(r1)中都有一个与之对应的ΠA(t1),表示单个元组t1的投影。

    3. 如果在r1中元组t1有c1份拷贝,在r2中元组t2有c2份拷贝,那么在r1×r2中就有元组t1t2的c1*c2份拷贝。

    按照SQL中的相应含义,还可用相似方法定义多重集的并、交、集合差运算。(聚集运算在多重集定义下没有变化)

     

     

    元组关系演算

    不同于关系代数表达式,元组关系演算(tuple relational calculus非过程化的(nonprocedural)查询语言,只描述所需信息,而不给出获得该信息的具体过程。

    元组关系演算中的查询表达为:{ t | P(t) }。含义:所有使谓词P为真的元组t的集合。

     

    1. 查询示例

    e.g. 找出工资大于80000美元的所有教师的ID

    /*所有满足如下条件的元组t的集合:在关系instructor中存在元组s使t和s在属性ID上的值相等,且s在属性salary上的值大于80000美元。

    因为ID属性是对t进行限制的条件所涉及的唯一属性,因此结果只得到ID列上的关系。*/

    { t| ∃s∈instructor( t[ID] = s[ID] ∧ s[salary] >80000 ) }

    e.g. 找出位置在Watson楼的系中的所有教师姓名

    /*元组变量u保证该系位于Watson楼,元组变量s被限制到与u的dept_name相同。结果得到name列上的关系。*/

    { t | ∃s∈instructor( t[name] = s[name]

    ∧∃u∈department( u[dept_name] = s[dept_name]

                         ∧ u[building] = ‘Watson’ ) ) }

    e.g. 找出在2009年秋季学期或2010年春季学期或这两个学期都开设的所有课程的course_id

    /*给出至少满足下面两个条件之一的couse_id元组的集合:

    ·在关系section中满足semester=Fall且year=2009的某个元组包含该course_id;

    ·在关系section中满足semester=Spring且year=2010的某个元组包含该course_id。*/

    { t | ∃s∈section ( t[course_id] = s[course_id] )

         ∧s[semester] = “Fall”∧s[year] = 2009 )

    ∨∃u∈section (u[course_id] = t[course_id] )

         ∧u[semester] = “Spring”∧u[year] = 2010 )

    e.g. 找出只在2009年秋季和2010年春季两个学期都开设的所有课程的course_id

    { t | ∃s∈section ( t[course_id] = s[course_id] )

         ∧s[semester] = “Fall”∧s[year] = 2009 )

    ∧∃u∈section (u[course_id] = t[course_id] )

         ∧u[semester] = “Spring”∧u[year] = 2010 )

    e.g. 找出2009年秋季开设而2010年春季不开的所有课程的course_id

    /*从2009年秋季开设的课程中去掉那些在2010年春季开设的课程*/

    { t | ∃s∈section ( t[course_id] = s[course_id] )

         ∧s[semester] = “Fall”∧s[year] = 2009 )

    ∧¬∃u∈section (u[course_id] = t[course_id] )

         ∧u[semester] = “Spring”∧u[year] = 2010 )

    e.g. 找出所有那些选了生物系全部课程的学生

    /*所有满足如下条件的ID列上的元组t的集合:

    对关系course中所有元组u,如果u在dept_name属性上的值是’Biology’,那么在关系takes中一定存在一个包含该学生ID以及该课程course_id的元组。

    注意:如果生物系没有开设任何课程,则所有学生ID都满足条件。该情况下,∃r∈student ( r[ID] = t[ID] )保证结果是关系student里的学生ID的值。*/

    { t | ∃r∈student ( r[ID] = t[ID] ) ∧

      ∀u∈course (u[dept_name] = “Biology”⇒

    ∃s∈takes ( t[ID] = s[ID]

    ∧s[course_id] = u[course_id] ) ) }

     

     

    形式化定义

    元组关系演算表达式的形式:{ t | P(t) }

    P为一个公式,公式中可出现多个元组变量,如果元组变量不被∃或∀修饰则称为自由变量,否则称为受限变量

    公式由原子构成。原子可以为如下形式之一:

    ·s∈r,其中s为元组变量,r为关系;

    ·s[x] ? u[y],其中s、u为元组变量,x为s所基于的关系模式中的一个属性,y为u所基于的关系模式中的一个属性,?为比较运算符(<, ≤, =, ≠, >, ≥)(要求x和y所属域成员可用?比较);

    ·s[x] ? c,其中s为元组变量,x为s所基于的关系模式中的一个属性,c是属性x所属域中的常量。

    根据如下规则用原子构造公式:

    ·原子是公式;

    ·如果P1是公式,则¬P1和(P1)也都是公式;

    ·如果P1和P2是公式,则P1∨P2、P1∧P2和P1⇒P2也都是公式;

    ·如果P1(s)是包含自由元组变量s的公式,r为关系,则∃s∈r(P1(s))和∀s∈(P1(s))也都是公式。

     

    元组关系演算中的等价性规则:

    ·P1∧P2等价¬(¬(P1)∨¬(P2));

    ·∀t∈r(P1(t))等价¬∃t∈r(¬P1(t));

    ·P1⇒P2等价¬(P1)∨P2

     

     

    元组关系演算表达式的安全性

    为避免元组关系演算表达式产生一个无限的关系,需对元组关系演算进行限制。

    域(domain):元组关系公式P的域用dom(P)表示,是P所引用的所有值的集合。它既包括P自身用到的值,又包括P中所涉及的关系的元组中出现的所有值。(i.e. P中显式出现的值,以及名称出现在P中的那些关系的所有值的集合)。

    如果出现在表达式{ t | P(t) }结果中的所有值均来自dom(P),则表达式是安全的,安全的表达式一定包含有限的结果。

     

    语言表达能力

    限制在安全表达式范围内的元组关系演算和基本关系代数(不包括扩展的关系代数运算符)具有相同的表达能力。

    因此:

    对于每个只运用基本操作的关系代数表达式,都有与之等价的元组关系演算表达式;

    对于每个元组关系演算表达式,也都有与之等价的关系代数表达式。

     

     

    域关系演算

    域关系演算(domain relational calculus):关系演算的另一种形式,使用从属性域中取值的域变量,而不是整个元组的值。

     

    1. 形式化定义

    域关系演算中的表达式形式:

    { <x1, x2, …, xn> | P(x1, x2, …, xn) }

    其中x1, x2, …, xn代表域变量,P代表由原子构成的公式。

    原子可以为如下形式之一:

    ·<x1, x2, …, xn>∈r,其中r为n个属性上的关系,x1, x2, …, xn为域变量或域常量;

    ·x?y,其中x和y为域变量,?为比较运算符(要求属性x和y所属域可用?比较);

    ·x?c,其中x为域变量,c是x作为域变量的那个属性域中的常量。

    根据如下规则用原子构造公式:

    ·原子是公式;

    ·如果P1是公式,则¬P1和(P1)也都是公式;

    ·如果P1和P2是公式,则P1∨P2、P1∧P2和P1⇒P2也都是公式;

    ·如果P1(x)是包含自由域变量x的公式,则∃x(P1(x))和∀x(P1(x))也都是公式。

    我们把∃a,b,c(P(a,b,c))作为a(∃b(∃c(P(a,b,c))))的简写。

     

    2. 查询示例

    e.g. 找出工资在80000美元以上的教师的ID、name、dept_name和salary。

    { <i, n, d, s> | <i, n, d, s>∈instructor∧s>80000 }

    e.g. 找出工资大于80000美元的所有教师的姓名

    { < i > | ∃n, d, s (<i, n, d, s>∈instructor∧s>80000) }

    e.g. 找出在物理系的所有教师的姓名,以及他们教授的所有课程的course_id。

    { <n, c> | ∃i, a, s, y (<I, c, a, s, y>∈teaches

       ∧∃d, s(<i, n, d, s>∈instructor∧d=”Physics”) ) }

    e.g. 找出在2009年秋季学期或2010年春季学期或这两个学期都开设的所有课程的集合

    { < c > | ∃a, s, y, b, r, t(<c, a, s, y, b, r, t>∈section

         ∧s=”Fall”∧y=”2009”)

       ∨∃a, s, y, b, r, t(<c, a, s, y, b, r, t>∈section

         ∧s=”Spring”∧y=”2010”) }

    e.g. 找出选了生物系开设的全部课程的所有学生

    /*如果生物系没开设任何课程,结果将包含所有学生。*/

    { < i > | ∃n, d, tc(<i, n, d, tc>∈student) ∧

      ∀ci, ti, dn, cr(<ci, ti, dn, cr>∈course ∧ dn=“Biology” ⇒

      ∃si, se, y, g(<I, ci, si, se, y, g>∈takes) ) }

     

    表达式的安全性

    不安全的域关系演算表达式的结果中会出现不在表达式域中的值。

    如果下列条件同时成立,则认为表达式{ <x1, x2, …, xn> | P(x1, x2, …, xn) }是安全的:

    1. 表达式的元组中所有值均来自dom(P);

    2. 对每个形如∃x(P1(x))的子公式,子公式为真当且仅当dom(P1)中有某个值x使P1(x)为真;

    3. 对每个形如∀x(P1(x))的子公式,子公式为真当且仅当P1(x)对dom(P1)中所有值x均为真。

     

    语言表达能力

    限制在安全表达式范围内的域关系演算和限制在安全表达范围内的元组关系演算具有相同的表达能力(因此也与基本关系代数的表达能力等价)。

    注意:没有任何一个域关系演算等价于聚集运算,但它可以扩展以支持聚集。

     

    元组关系演算和域关系演算是非过程化语言,代表了关系查询语言所需的基本能力。基本关系代数是一种过程化的语言,在能力上等价于被限制在安全表达式范围内的关系演算的这两种形式。

    关系演算是简介的、形式化的语言,不适合于那些偶尔使用数据库系统的用户。(QBE和Datalog基于元祖关系演算和域关系演算)

    转载于:https://www.cnblogs.com/RDaneelOlivaw/p/8149086.html

    展开全文
  • 学完数据库,我们对SQL SERVER 2008的部分关键字有了大概的了解,下面我来总结一下几个比较重要的关键字:字段、属性、列、...类似,在这里的某一个字段就是对“员工“控件属性。 二、记录(元组):事物特征...

    学完数据库,我们对SQL SERVER 2008中的部分关键字有了大概的了解,下面我来总结一下几个比较重要的关键字:字段、属性、列、记录(元组)、表、主键、外键。

    一、字段:某一个事物的一个特征,或者说是属性

    字段

    在我们学vb时,总是用到控件的各种属性,比如name属性、captain属性、width属性等属性。类似,在这里的某一个字段就是对“员工“控件中的属性。

    二、记录(元组):事物特征的组合,可以描述一个具体的事物。

     

    在vb中当我们将一个控件的所有的属性都设置好后,我们就可以对整个控件的样子有个一详细的了解。在数据库中也是这样,当我们在完成一条记录以后,一个员工的详细信息也就清楚了。元组是记录的另个一称呼。

    三、表:记录的组合 表示同一类事物的组合

     

           表,相当于具有相似特征事物的一个集合。如同vb中许多具有具体属性的textbox控件。

    四、列:字段的另一种称谓


    五、元组:记录的另一种称谓

    下面我们再来说一说另一个概念

    六、主键:能唯一标识信息的事物


    在说主键之前,先看上面一个表格,上述格式可以存储信息,但是某一天当出现两个姓名,性别、年龄都相同的张三时,就无法辨别,我们管这种现象叫做冗余,并且这两信息就无法辨别,所以这是就需要设置一个特定的东西来唯一的标识信息。所以我们就用编号来唯一标识员工的信息。那么我们管这个能唯一标识信息的事物叫做主键。即此表格的编号是主键。

    七、外键:一个执行另个一个表的指针

    在讨论外键之前,我们先看看先看看下面的图。

     

    当在员工信息表中在填上部门、部门人数、部门地址等几个属性后。你发现了什么问题。或者说能不能把员工的信息和部门信息放到一起?

    不能!!为什么?因为从前三名可以看出,如果几个人都属于一个部门,那么部门,人数,部门地址信息重复了三次,所以当有大量的人同属一个部门时再次会造成信息冗余。

    现在我们该怎么办呢——看下表:

    对,就是通过将连个信息表分开的方法,你看这样的话,部门信息的输入工作了少多了吧。但是当员工信息和部门信息两个表分开来写时,的确减少的信息冗余,但是如何建立关系呢?这时我们可以通过部门编号建立关系,此时的“部门编号”就是“员工信息”表(不是“部门信息”表)的关系链——外键。(注意在两个表分开写后,我们为“部门信息”增加一个主键“部门编号”当然如果不增加的话,部门名称同样可以成为“部门信息”表的主键)

    此时的外键如同指向“部门信息”表中某一具体记录的地址指针(不懂指针的宝宝请暂时飘过),通过员工对应“指针”去部门信息表找对应的部门具体信息。

    展开全文
  • (3、列表元素都有索引和值两个属性,索引从0开始,每个索引都对应一个值;(4、有括号括起来元素,元素之间有逗号隔开。 2、元组:(1、一经定义内容无法改变;(2、元组元素可以是不同的类型;(3、元组使用圆括号括...
  • SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)我们来介绍一下:数据库是如何存储数据的。数据库是如何存储数据的来看一个小例子scott 是Orale软件里面的一个...
  • 我们读不同的描写数据库的文章,会看到不同的概念名称,从某种意义上来讲,是公说公...至于如何定义一个实体,则会根据不同的需要,不同的视角有所不同,比如我们将生物作为实体,那么我们就考虑这个实体有哪些属性
  • 候选码:关系中一个属性或者属性组,能够唯一标识一个元组,且它的真子集不能唯一标识元组。 主码:从所有候选码选择一个,作为主码。例如:学生关系(学号,身份证号,姓名,院系,专业,性别 ,生日),有两个...
  • 数据库是如何存储数据的来看一个小例子现在,假如我们现在想存储 员工的信息。也就是说:我们来通过这个例子来看看 字段、记录、表 是一个什么东西。我们下面通过存储一个员工的信息,来把这些专业术语都来解释一遍...
  • 码:指能够唯一标识一个元组属性组(是属性组,包含多个一个或多个属性),但是不是一个最小码组合的情况,也就是其子集还能够唯一标识一个记录 候选码:指能够唯一标识一个元组属性组(是属性组,包含多个一个...
  • python元组的操作

    2021-04-06 21:16:47
    id: 用来唯一标识一个对象 type:对象的类型 value:对象的值 类型转换 整型:int() 浮点型:float() 字符串:str() 元组 : (1) tuple() #只可以对可迭代的对象使用 (2)单个数据可采用(x,)注:x点为其他数据...
  • 关系模型中能唯一标识一个元组属性集称为关系模式的超码。 候选码(Candidate Key): 不含多余属性的超码。 (注:这里的不含多余属性类似于随机过程状态的最小闭集的概念,即是说,在候选码这个属性集U...
  • 关系中的某一属性属性组的值能唯一标识一个元组,而其任何、子集都不能再标识,则称该属性组为(超级码)候选码。 例如:在学生实体,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的...
  • 1.码=能够唯一标识一组元组属性集 2.主键:能够唯一标识一组元组属性集 主键是从候选键选择一个作为主键。 3.候选码,能够唯一标识一组元组属性集 候选码的任一真子集都不能唯一标识一组元组。 主属性:候选...
  • 主键:可以作为一张表的唯一标志物 外键:表示该XX 来自 何处 列:也叫字段或者属性(列) 行:字段的组合,称为记录或者元组(行) 外键设置方法: 点击关系——常规后面的省略号——选择设置外键 ...
  • 关系中一个属性属性组的值能够唯一标识一个元组,且他的真子集不能唯一标识一个元组,则称这个属性属性组做候选码。 2、主码:主码指主关键字。主关键字(primary key)是表一个或多个字段,它的值...
  • 候选码(关键字):某一属性组的值能唯一标识一个元组而其子集不能(去掉任意一个属性都不能标识该元组),则称该属性组为候选码(补充元组:表的一行即为一个元组) 主属性:候选码包含的属性一个或多个属性) 主码...
  • 7.候选码:关系中的某一属性组的值能唯一标识一个元组,而子集不能,则称该属性组(人话:有好几个属性可以作为一行(元祖)的标识,例如序号,课程号,身份证号,那么这三个都是候选码) 8.主码:从候选码选定其中...
  • Python的不可变类型包括整型、浮点型、字符串 、元组和布尔型,可变类型包括列表、集合和字典,每对象都包括标识、类型和值3个属性;==比较对象值是否相等,is比较对象id是否相等。字典由键值对组成,值可以是...
  • 超键:在关系中能够唯一标识一个元组属性集称为超键。超键可以是一个属性,也可以是多个属性的组合。 候选键:不含多余元素的超键。也就是说,只要删除候选键的任意一行属性,它就不再能唯一标识一个元组了。 ...
  • Python的一切都是一个对象。每个对象都有自己的数据属性和与之关联的方法。为了有效和恰当地使用一个对象,我们应该知道如何与它们进行交互。 列表、元组和集合是3种重要的对象类型。它们的共同点是,它们被用作...
  • 超键:凡是能够唯一标识一个元组属性属性组,均称为超键 候选键:候选键是最小的超键,它的任意真子集都不能成为超键 主键:在一个关系中可能存在多个候选主键,选取其中一个候选键作为主键 外...
  • 唯一标识一个元组的单个属性或者属性组合。 性质: 唯一性:候选码能唯一标识一个元组。 最小性:一个候选码的真子集不能唯一标识一个元组。 主码: 定义: 某个候选码,即:若候选码有多个,则选择其中一个...
  • (2)若关系中的某一属性组的值能够唯一标识一个元组,则称该属性组为候选码,从候选码选定的一个码为主码;如果一个属性在表(关系既不是主码也不是候选码,但是他是另一个关系的主码那它就是外码。 (3)...
  • Tuple 元组 的解释

    千次阅读 2008-10-29 17:22:00
    Tuple 元组 关系的一行称为一个元组元组可表示一个实体或实体之间的联系。 数据库里面的一些专业词汇 英对照 · 数据仓库(Data Warehouse)一个数据仓库就是一个自带数据库的商业应用系统。利用现有的...
  • 候选码:某一个属性组的值能够唯一标识一个元组,而其子集不能,则称该属性组为候选码 主码:若一个关系中有多个候选码,则选定其中的一个为主码 主属性:候选码属性的各个属性称为主属性 非主属性:不包含在候选码...
  • 如何求一个关系模式的候选码

    万次阅读 多人点赞 2017-06-20 10:39:07
    首先来看候选码的定义:若关系中的某一属性组的值能唯一标识一个元组,则称该属性组为候选码。 若W是候选键,则必须满足两个条件:W的闭包是U;W没有冗余。 设关系模式RU=ABC.......等N个属性,U属性在FD...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,257
精华内容 5,702
关键字:

关系中能够唯一标识一个元组的属性