过程和非过程查询语言差异



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

有一个神话,即关系代数符号是过程性的,而关系微积分符号不是。但是每个关系表达式都对应于具有相同树结构的某个微积分表达式。因此,当微积分不是程序时,它就不可能是程序性的。您可以根据表达式树以任一表示法实现/执行查询,也可以不实现/执行查询。

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

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

在过程查询语言(如关系代数)中,将查询编写为由关系和代数运算器组成的表达式,如连接、叉积、投影、限制等。就像在算术表达式中一样(例如2 / (3 + 4)),运算符有一个顺序(在示例中,加法是在除法之前执行的)。例如,您联接两个不同投影的结果,然后执行限制等。像这样的语言称为过程语言,因为每个表达式都建立了执行其运算符的某种顺序。

相反,像关系演算这样的查询语言和众所周知的SQL查询语言被称为"非过程",因为它们仅通过其属性来表达预期结果,而不是为生成它而执行的运算符的顺序。例如,使用如下 SQL 表达式:

SELECT t1.b
FROM t1
WHERE t1.b > 10

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

最新更新