通过关系代数,我遇到了“过程查询语言”这个术语。那么程序查询语言和非程序查询语言有什么区别呢?
2 回答
有一个神话,关系代数符号是程序性的,而关系微积分符号不是。但是每个关系表达式都对应一个具有相同树结构的微积分表达式。因此,当微积分不是时,它就不可能是程序性的。您可以根据其表达式树以任一表示法实现/执行查询 - 或不执行。
(查询)语言在必须使用循环或以其他方式依赖状态时是程序性的。另一种方法通常称为声明式或函数式。
任何更新数据库的数据库符号都是过程性的,包括 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 查询,有许多连接、条件、限制等。可以设计许多不同的查询执行顺序(实际上,查询优化器的任务是设计一个有效的顺序来执行这些操作,因此将此声明性查询转换为程序性查询)。