概述
关系代数不是一种成熟的 SQL 语言,而是一种获得理论上对关系处理理解的方法。因此,它不应该引用表,记录和字段等物理实体; 它应该引用抽象结构,如关系,元组和属性。说这些,我不会使用本文档中的学术术语,并将坚持更广为人知的外行术语 - 表格,记录和字段。
我们开始之前的几个关系代数规则:
- 关系代数中使用的运算符在整个表而不是单个记录上工作。
- 关系表达式的结果将始终是一个表(这称为闭包属性 )
在本文档中,我将参考以下两个表:
选择
在选择运算符返回主表的子集。
选择 <table> where <condition>
例如,检查表达式:
选择人**,其中** DepartmentID 的= 2
这可以写成:
这将导致表的记录包含 People 表中 DepartmentID 值等于 2 的所有记录 :
条件也可以加入以进一步限制表达式:
选择人**,其中** StartYear> 2005 年和 DepartmentID 的= 2
将产生下表:
项目
该项目的运算符将会从表中返回不同的字段值。
项目 <table> over <field list>
例如,检查以下表达式:
project People over StartYear
这可以写成:
这将导致一个表包含 People 表的 StartYear 字段中保存的不同值。 **
由于 closure 属性创建了一个关系表,因此从结果表中删除了重复值 :关系表中的所有记录都必须是不同的。
如果字段列表包含多个单个字段,则结果表是这些字段的不同版本。
项目人员超过 StartYear,DepartmentID 将返回: 由于 2006 StartYear 和 1 DepartmentID 的重复,删除了一条记录。
GIVING
可以通过使用 giving 关键字命名单个表达式,或通过将一个表达式嵌入另一个表达式中来将关系表达式链接在一起。
<关系代数表达式> 给出 <别名>
例如,考虑下面的表达式:
选择人**,其中** DepartmentID 的= 2 给出一个
项目一个在 PERSONNAME 给B
这将导致下面的表 B,表 A 是第一个表达式的结果。
计算第一个表达式,并为结果表提供别名 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 =
请注意,只有 DepartmentID 的从人表示,而不是 ID 从部门表。只需要显示一个要比较的字段,这通常是连接操作中第一个表的字段名称。
尽管在该示例中未示出,但是连接表可能导致两个字段具有相同的标题。例如,如果我使用标题 Name 来标识 PersonName 和 Dept 字段(即标识 Person Name 和 Department Name)。出现这种情况时,我们使用表名来使用点表示法限定字段名称: People.Name 和 Departments.Name
加入结合 select 和 project 可以一起使用来拉取信息:
加入 DepartmentID = ID 的人员和部门*,给** A
选择 A ,其中 StartYear = 2005 , Dept =‘Production’ 给 B
项目 B over PersonName 给 C*
或作为组合表达式:
项目 ( 选择 ( 参加人及部门*,其中** DepartmentID 的= ID) ,其中 StartYear = 2005 和部门=生产) 在 PERSONNAME 给 Ç*
这将导致此表: