在数据库系统概念第6版第2章(关系代数)一书中,它指出了三种形式查询语言,关系代数,元组关系演算和域关系演算,它们是基于数学逻辑的声明式查询语言。但是,在另一页上它指出关系代数是过程性的,而元组关系演算和域关系演算是非过程性的。以下哪项是正确的说法?您能否提供简单的示例来说明差异?
在数据库系统概念第6版第2章(关系代数)一书中,它指出了三种形式查询语言,关系代数,元组关系演算和域关系演算,它们是基于数学逻辑的声明式查询语言。但是,在另一页上它指出关系代数是过程性的,而元组关系演算和域关系演算是非过程性的。以下哪项是正确的说法?您能否提供简单的示例来说明差异?
文笔很差。“声明式”是非正式的,他们以两种方式使用它。一般意思是,“描述一个结果(不是过程)”。但是许多对结果的描述都有一个明显的过程解释。因此,无论是否有意,那些“描述结果和过程” 。第一个说“这些符号可以用来描述结果而不需要任何特定的过程”。第二个说“代数有程序解释而微积分没有”。
但后一种说法是一个神话。它被鹦鹉学舌地接受了[伪]智慧。代数有一个明显的程序解释——我们在参数上调用运算符。但演算也是如此。演算在标准关系运算符方面没有明显的程序解释。
但想法是,结石不用于请求此类程序。
演算在标准关系运算符方面具有直接的程序解释,您可以将它们机械地转换为“prenex 范式”,然后将它们机械地转换为标准关系代数。(Codd 的归约算法。)此外,在尝试每个可能的元组作为结果的成员时,它们有一个明显的过程解释(不是关系代数)。(就像谓词演算的标准 Tarskian 语义一样。)此外,它们在代数方面有一个明显的过程解释,添加了两个简单但不切实际的运算符——UNION 的泛化(对应于 OR)和一个返回元组的运算符不在关系(对应于 NOT)。(已经NATURAL JOIN对应AND & PROJECTing out对应EXISTS。
关系代数和关系演算之间的差异
过程和非过程查询语言差异