程序性和非程序性查询语言的区别

时间:2017-11-22 12:11:03

标签: relational-algebra procedural tuple-relational-calculus domain-calculus

通过关系代数,我遇到了术语"程序查询语言"。 那么过程查询语言和非过程查询语言之间有什么区别呢?

2 个答案:

答案 0 :(得分:2)

myth关系代数符号是程序性的,而关系式代数符号则不是。但是每个关系表达式对应于具有相同树结构的特定微积分表达式。因此,当微积分没有时,它不可能是程序性的。您可以使用表达式树的表示法实现/执行查询 - 或者不执行。

(查询)语言程序,当它必须使用循环或以其他方式依赖于状态时。替代方案通常称为声明性或功能性。

更新数据库的任何数据库表示法都是程序性的,包括SQL。但这不是“查询”。通常,DBMS具有SQL扩展,允许您根据实现概念部分控制查询执行和/或数据存储顺序;这是非程序性的。但那不是SQL。

答案 1 :(得分:1)

在一个过程查询语言中,比如Relational Algebra,你可以将一个查询编写为一个由关系和代数Opertors组成的表达式,比如连接,交叉乘积,投影,限制等。就像在算术表达式中一样(例如{{1} }),运算符有一个顺序(在这个例子中,加法是在除法之前执行的)。因此,例如,您加入两个不同投影的结果,然后执行限制等。这样的语言称为程序性,因为每个表达式都建立了执行其运算符的特定顺序。

相反,像Relational Calculus这样的查询语言和井上的SQL查询语言被称为“非程序性”,因为它们仅通过其属性表达预期结果,而不是为了生成它而执行的运算符的顺序。例如,使用如下的SQL表达式:

2 / (3 + 4)

我们指定我们想要SELECT t1.b FROM t1 WHERE t1.b > 10 为真的关系t1的所有元组,并且从这些元组我们想要t1.b > 10的值,但我们不指定是否首先必须先执行投影,然后再进行限制,或限制,然后再进行投影。想象一个复杂的SQL查询,有许多连接,条件,限制等。可以设计许多不同的执行查询的顺序(实际上,查询优化器的任务是设计执行这些操作的有效顺序,所以将此声明性查询转换为程序性查询。)