什麼是 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 會在 Tuple 集合上運作,而查詢可視為定義查詢結果的複雜集合作業序列。
  • QL 的以集合為基礎的語意使得處理值的集合變得非常自然,不必擔心如何有效率地進行儲存、編製索引和遍歷這些值。

在物件導向程式設計語言中,具現化類別會配置實體記憶體以保留該類別執行個體的狀態,藉此建立物件。 在 QL 中,類別只是描述現有值集合的邏輯屬性。