什么是 QL?

已完成

QL 是一种声明性、面向对象的查询语言,经过优化,可实现对分层数据结构(尤其是表示软件项目的数据库)的高效分析。

数据库是有序组织的数据集合。 最常用的数据库模型是关系模型,它将数据存储在表中。 SQL(结构化查询语言)是关系数据库最常用的查询语言。

查询语言的用途是提供一个编程平台,可以在其中询问有关数据库中存储的信息的问题。 数据库管理系统管理数据的存储和管理,并提供查询机制。 查询通常引用相关的数据库实体,并指定结果必须满足的各种条件(称为谓词)。 查询评估涉及检查这些谓词并生成结果。 好的查询语言及其实现所需的一些属性包括:

  • 声明性规范:声明性规范描述结果必须满足的属性,而不提供计算结果的过程。 在数据库查询语言的上下文中,声明性规范将基础数据库管理系统和查询处理技术的详细信息进行了抽象化。 这极大简化了查询编写。
  • 表达能力:功能强大的查询语言可编写复杂的查询。 这可使该语言得到广泛应用。
  • 高效执行:查询有可能很复杂,数据库也可能非常大,因此查询语言的实现能够高效处理和执行查询是至关重要的。

在此单元中,你将了解 QL 编程语言的基本功能,以便可以编写自己的自定义查询或更好地了解预先设置好的可用开放源代码查询。

QL 语法

QL 的语法类似于 SQL。 但是,QL 的语义基于 Datalog,这是一种声明性逻辑编程语言,通常用作查询语言。 这使 QL 主要作为一种逻辑语言使用,且 QL 中的所有操作都是逻辑操作。 此外,QL 从 Datalog 继承了递归谓词,同时添加了对聚合的支持,使复杂的查询更简洁、简单。 例如,试想一个包含亲子关系的数据库。 如果要查找某个人的后代数,通常会:

  1. 查找给定人员的后代(即子女或子女的后代)。
  2. 对上一步找到的后代进行计数。

在 QL 中编写此过程时,它与描述的结构非常相似。 请注意,该示例使用递归来查找给定人员的所有后代,使用聚合来计算后代数。 由于该语言的声明特性,无需添加任何过程详细信息即可将这些步骤转换为最终查询。 QL 代码将如下所示:

Person getADescendant(Person p) {
  result = p.getAChild() or
  result = getADescendant(p.getAChild())
}

int getNumberOfDescendants(Person p) {
  result = count(getADescendant(p))
}

面向对象

对象方向是 QL 中的一项重要功能。 对象方向的优点是众所周知的。 它增加了模块化,启用信息隐藏,并允许重复使用代码。 QL 在提供所有这些优势的同时还不会影响其逻辑基础。 这是通过定义一个简单的对象模型实现的,其中将“类”建模为谓词,将“继承”建模为含义。 可用于所有受支持的语言的库都会广泛使用类和继承。

QL 和常规用途编程语言

下面是常规用途编程语言和 QL 之间的一些显著的概念上和功能上的差异:

  • QL 没有任何命令性功能,例如对变量或文件系统作的赋值。
  • QL 在元组集上进行操作,查询可以看作是定义查询结果的复杂集合操作序列。
  • QL 的基于集的语义使得处理值的集合变得非常自然,而无需担心有效地存储、编制索引和遍历它们。

在面向对象的编程语言中,类的实例化涉及通过分配物理内存以保存该类实例的状态来创建对象。 在 QL 中,类只是用于描述已有值集的逻辑属性。