概述

关系代数不是一种成熟的 SQL 语言,而是一种获得理论上对关系处理理解的方法。因此,它不应该引用表,记录和字段等物理实体; 它应该引用抽象结构,如关系,元组和属性。说这些,我不会使用本文档中的学术术语,并将坚持更广为人知的外行术语 - 表格,记录和字段。

我们开始之前的几个关系代数规则:

  • 关系代数中使用的运算符在整个表而不是单个记录上工作。
  • 关系表达式的结果将始终是一个表(这称为闭包属性

在本文档中,我将参考以下两个表:

StackOverflow 文档

选择

选择运算符返回主表的子集。
选择 <table> where <condition>

例如,检查表达式:

选择人**,其中** DepartmentID 的= 2

这可以写成:
StackOverflow 文档

这将导致表的记录包含 People 表中 DepartmentID 值等于 2 的所有记录 :
StackOverflow 文档

条件也可以加入以进一步限制表达式:

选择人**,其中** StartYear> 2005 年 DepartmentID 的= 2

将产生下表:
StackOverflow 文档

项目

项目的运算符将会从表中返回不同的字段值。
项目 <table> over <field list>

例如,检查以下表达式:
project People over StartYear

这可以写成:
StackOverflow 文档

这将导致一个表包含 People 表的 StartYear 字段中保存的不同值。 **
StackOverflow 文档

由于 closure 属性创建了一个关系表,因此从结果表中删除了重复值 :关系表中的所有记录都必须是不同的。

如果字段列表包含多个单个字段,则结果表是这些字段的不同版本。
项目人员超过 StartYear,DepartmentID 将返回: 由于 2006 StartYear 和 1 DepartmentID 的重复,删除了一条记录。
StackOverflow 文档

GIVING

可以通过使用 giving 关键字命名单个表达式,或通过将一个表达式嵌入另一个表达式中来将关系表达式链接在一起。

<关系代数表达式> 给出 <别名>

例如,考虑下面的表达式:
选择人**,其中** DepartmentID 的= 2 给出一个
项目一个 PERSONNAME B

这将导致下面的表 B,表 A 是第一个表达式的结果。
StackOverflow 文档

计算第一个表达式,并为结果表提供别名 A.然后在第二个表达式中使用该表,为最终表提供别名 B.

编写此表达式的另一种方法是将第二个表达式中的表别名替换为括号内的第一个表达式的整个文本:
project选择 People ,其中 DepartmentID = 2)而不是 PersonName 给出 B

这称为嵌套表达式

天然加入

自然连接使用表之间共享的公共字段将两个表粘在一起。


假设<field 1>在<table 1>中并且<field 2>在<table 2>中,加入 <table 1> <table 2> ,其中 <field 1> = <field 2>。

例如,下面的联接表达式将加入人们部门基于所述 DepartmentID 的ID 列中的各表中:
加入部门其中 DepartmentID 的 ID =

StackOverflow 文档

请注意,只有 DepartmentID 的表示,而不是 ID部门表。只需要显示一个要比较的字段,这通常是连接操作中第一个表的字段名称。

尽管在该示例中未示出,但是连接表可能导致两个字段具有相同的标题。例如,如果我使用标题 Name 来标识 PersonNameDept 字段(即标识 Person Name 和 Department Name)。出现这种情况时,我们使用表名来使用点表示法限定字段名称: People.NameDepartments.Name

加入结合 selectproject 可以一起使用来拉取信息:

加入 DepartmentID = ID 的人员部门*,给** A
选择 A ,其中 StartYear = 2005 Dept =‘Production’ B
项目 B over PersonName C*

或作为组合表达式:

项目选择参加部门*,其中** DepartmentID 的= ID) ,其中 StartYear = 2005 部门=生产 PERSONNAME Ç*

这将导致此表:
StackOverflow 文档

ALIAS

划分

联合

路口

区别

更新(:=)

TIMES