簡介
查詢語言一直是
資料庫系統知識庫系統研究的重要內容。一般而言 , 查詢相當於是一個作用在庫上的
函式, 而
返回值為滿足條件的內容。傳統上的關係查詢語言,是一種基於值的說明性的
高級語言, 其查詢獨立於庫中數據的變化並且其查詢目標與結果均基於關係元組。 而對象查詢語言作為
面向對象資料庫管理系統(OODBMS)的一個有機組成部分 , 其查詢的目標是庫中的對象,由於
面向對象數據模型綜合了包括語義數據模型 、嵌套關係數據模型等模型的特點 , 因而其查詢語言更加完備、高效與複雜,與關係查詢語言相比 , 其優點表現在:
基於對象標識符(OID)的導航式查詢與基於值的相聯式查詢同時存在, 並互為補充。
數據定義語言(DOL)與數據操作語言(DML)有機集成,即查詢語言與資料庫程式設計語言的統一性 , 消除了語義失配的現象 , 從而簡化了複雜的數據密集型套用的實現過程。
表達能力強 、語義豐富,例如在查詢語言中繼承語義的體現。
由於類層次結構 , 複雜對象與動態行為、方法的引人,使得面向對象數據模型的複雜性遠高於其它數據模型 , 至今仍缺乏有效的形式語義刻劃。造成了對象查詢語言設計與實現上的困難。不過 , 迄今為止 , 人們已設計出10多個對象查詢語言 , 它們在查詢
模型、 設計風格 、 對象、
代數以及查詢最佳化等方面作了不少有益的探索。
所以 , 對象查詢語言的設計途徑可分為:
在單純的說明性SQL或QUEL語言的基礎上進行面向對象(OO)風格的擴充 例如Iris的OSQL語言。
在
OODB程式設計語言的基礎上增加查詢的功能 , 其中包括
SQL與非SQL兩種風格。例如,OQL[C++]以C++作為宿主語言進行查詢擴充 , 仍舊保留了SQL風格 , 而OQL[UF]則丟棄了SQL風格。
設計規則
OQL是一種面對對象的數據查詢語言,它具備傳統
SQL的主要功能,又能與傳統的
宿主語言,如
C++、
JAVA等,自由地結成一個整體,既可以將宿主語言和OQL查詢混合起來,能夠嵌入量詞和方法。它的設計原則主要包括:
OQL是專門為ODMG對象模型定製的查詢語言,以ODMG為對象模型為基礎。
OQL的語法和SQL-92非常類似,也做了不少擴展,增加了有關ODMG概念的特徵,包括對象標識,複合對象、路徑表達式、多態、操作調用、繼承、滯後聯編等。
OQL提供高層原語,用於處理對象集合、結構體和列表。
OQL是一種函式式語言,只要運算元遵循ODL類型系統的規範,操作符可以任意的自由組合。
OQL是一種簡單的查詢語言,並不具備計算完備性。
OQL不提供顯式的更新操作符,而是通過在對象中定義相關的操作函式來實現更新操作。
OQL提供對對象的訪問,並依靠這種訪問特性最佳化查詢。
OQL的形式語義易於定義。
查詢表達式
查詢定義的聲明
查詢定義是具有如下形式的表達式
define query_id as query_expression
其中,query_id是標識符,表示查詢名;query_espression是查詢表達式。
例如:有如下的查詢定義聲明,
define age(string x) as select p.sge from persons p where p.nanme=x
刪除查詢定義的語句如下:
Undefine query_id
路徑表達式
OQL中通過採用點表示法的複雜類型來訪問標量的分量。
例如,如果Obj表示屬於類C的對象,attr是該類的某個特性(即屬性、聯繫或者方法),Obj_attr就表示把attr用於Obj的結果
若attr是屬性,Obj_attr是對象Obj的該屬性值。
若attr是聯繫,Obj_attr是通過聯繫attr與Obj相連的對象或對象的聚集。
若attr是方法,Obj_attr就是把attr用於Obj的結果。
基本表達式select-from-where
select-from-where表達式。
一般OQL的select-from-where表達式的組成如下:
select後跟著表達式的列表。
from後跟著一個或多個變數說明的列表,其值是聚集類型的表達式和變數名。
查詢將產生對象的包。在嵌套的循環中,通過考查FROM子句中所有可能的值來計算這個包。如果這些變數值的任何組合都滿足WHERE子句的條件,那么就把SELECT子句所描述的對象加到包中,該包就是select-from-where語句的結果。
量詞表達式
例如,檢測集合S的所有成員是否都滿足條件C(x)(其中x是變數),可以使用OQL表達式
FOR ALL x IN S:C(x)
EXISTS X IN S:C(x)。
如果S中至少有一個X使得C(x)為真,則表達式EXISTS X IN S:C(x)為真,否則為假。
聚合表達式
COUNT可以套用於任何聚集
SUM和AVG可以用於算術類型的聚集
MIN和MAX可以用於任何可比較的的類型(例如算術值或者字元串)的聚集
分組表達式
分組表達式使用
GROUP BY子表示。關鍵字GROUP BY及用逗號分開的分區屬性的列表。
每個分區屬性組成如下:
域名f :表達式e
GROUP BY子句的格式為:
GROUP BY f1 : e1,f2 : e2,....
HAVING子句
OQL的GROUP BY子句後可以跟
HAVING子句,含義類似於SQL的HAVING。
格式:
HAVING<條件>
集合運算符
可以把並、交和差運算符用於類型為集合或者包的兩個對象上。像SQL那樣,這三個運算符分別用於關鍵字
UNION、INTERSECT和EXCEPT表示。
常見特徵
儘管對象查詢語言的套用目的、句法結構 、針對實現所採用的技術性手段各有不同 , 但有些問題是首先必須考慮到的 ,將其稱之為常見的或共同特徵。對這些特徵的理解與研究已經比較充分,不過,這裡要強調的是共同特徵指一定範圍內的選擇並不指唯一的選擇。例如 , 路徑表達式就有
隱式與顯式兩種選擇。以下具體討論對象查詢語言的8個共同特徵 。
SQL SFW風格
一般而言遵循傳統的
SQL查詢語言的句法、結構較易實現向上兼容與標準化 , 並且符合用戶使用傳統格式的心理。不過 , 基於
OO數據模型構造的
SFW子句 即(Sclect、From與Where子句 )具有更豐富的語義 ,而完全擺脫SQL風格的對象查詢語言亦不在少數 。
路徑表達式
在模式級進行查詢路徑的邏輯說明為大多數對象查詢語言所採用 , 它表現為複雜聚合對象各級結構屬性的相聯判斷。由於最佳化上的關係 , 物理查詢路徑很可能不同於邏輯路徑表達式所指示的路徑。
繼承支持
幾乎所有的對象查詢語言都支持繼承語義 , 但是 , 並不是所有的對象查詢語言都支持多繼承 , 即使支持 , 其繼承衝突的分解策略不相同 。
顯式連線(explicit join)
除了
隱式的基於對象實體的連線外 , 對象查詢語言也通過變數設定與標識相等性來實現兼容類型的值之間的顯式連線方式 , 這是與關係查詢語言類似的地方。
集合值(set_value)屬性
除了以單一的對象屬性,亦即所謂標址屬性,作為操作目標之外 , 對象查詢語言亦提供集合值屬性以及集合比較運算元與範圍量詞的選擇 。
嵌套查詢
在查詢語言中, 這種查詢方式是指一個查詢的結果當作另一個查詢語句謂詞條件中的自變數,同時它也表現了查詢語言的封閉性 。 由於對象封裝的原因 , 子模式、視圖並不像關係庫那樣強調。
聚合函式
聚合函式包括 COUNT、MAX、AVERAGE 等等。它們常常作為謂詞條件的一部分或者是對檢索目標的說明。
修改
在模型中, 集合的概念一般指顯式或隱含生成的一個類中實例的集合。在一些場合 , 亦稱之為
匯集(Collection)沿用
SQL同時修改多個滿足條件元組的思想 , 對象查詢語言亦提供了面向集合的修改機制 。