查询语言一直是数据库系统知识库系统研究的重要内容。一般而言 , 查询相当于是一个作用在库上的函数, 而返回值为满足条件的内容。传统上的关系查询语言,是一种基于值的说明性的高级语言, 其查询独立于库中数据的变化并且其查询目标与结果均基于关系元组。 而对象查询语言作为面向对象数据库管理系统(OODBMS)的一个有机组成部分 , 其查询的目标是库中的对象,由于面向对象数据模型综合了包括语义数据模型 、嵌套关系数据模型等模型的特点 , 因而其查询语言更加完备、高效与复杂,与关系查询语言相比 , 其优点表现在:
由于类层次结构 , 复杂对象与动态行为、方法的引人,使得面向对象数据模型的复杂性远高于其它数据模型 , 至今仍缺乏有效的形式语义刻划。造成了对象查询语言设计与实现上的困难。不过 , 迄今为止 , 人们已设计出10多个对象查询语言 , 它们在查询模型、 设计风格 、 对象、代数以及查询优化等方面作了不少有益的探索。
所以 , 对象查询语言的设计途径可分为:
在单纯的说明性SQL或QUEL语言的基础上进行面向对象(OO)风格的扩充 例如Iris的OSQL语言。
在OODB程序设计语言的基础上增加查询的功能 , 其中包括SQL与非SQL两种风格。例如,OQL[C++]以C++作为宿主语言进行查询扩充 , 仍旧保留了SQL风格 , 而OQL[UF]则丢弃了SQL风格。
OQL是一种面对对象的数据查询语言,它具备传统SQL的主要功能,又能与传统的宿主语言,如C++、JAVA等,自由地结成一个整体,既可以将宿主语言和OQL查询混合起来,能够嵌入量词和方法。它的设计原则主要包括:[1]
查询定义是具有如下形式的表达式[1]
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的结果。
量词表达式用于表达集合的数量保护关系。
例如,检测集合S的所有成员是否都满足条件C(x)(其中x是变量),可以使用OQL表达式
FOR ALL x IN S:C(x)
该表达式的结果只有TRUE和FALSE两种。如果全部满足,则上述表达式为TRUE;否则为FALSE。
检测集合S的所有成员是否存在满足条件C(x)(其中x是变量)的成员,可以使用如下OQL表达式:
EXISTS X IN S:C(x)。
如果S中至少有一个X使得C(x)为真,则表达式EXISTS X IN S:C(x)为真,否则为假。
分组表达式使用GROUP BY子表示。关键字GROUP BY及用逗号分开的分区属性的列表。
每个分区属性组成如下:
域名f :表达式e
GROUP BY子句的格式为:
GROUP BY f1 : e1,f2 : e2,....
OQL的GROUP BY子句后可以跟HAVING子句,含义类似于SQL的HAVING。
格式:
HAVING<条件>
可以把并、交和差运算符用于类型为集合或者包的两个对象上。像SQL那样,这三个运算符分别用于关键字UNION、INTERSECT和EXCEPT表示。
尽管对象查询语言的应用目的、句法结构 、针对实现所采用的技术性手段各有不同 , 但有些问题是首先必须考虑到的 ,将其称之为常见的或共同特征。对这些特征的理解与研究已经比较充分,不过,这里要强调的是共同特征指一定范围内的选择并不指唯一的选择。例如 , 路径表达式就有隐式与显式两种选择。以下具体讨论对象查询语言的8个共同特征 。
一般而言遵循传统的SQL查询语言的句法、结构较易实现向上兼容与标准化 , 并且符合用户使用传统格式的心理。不过 , 基于OO数据模型构造的SFW子句 即(Sclect、From与Where子句 )具有更丰富的语义 ,而完全摆脱SQL风格的对象查询语言亦不在少数 。
在模式级进行查询路径的逻辑说明为大多数对象查询语言所采用 , 它表现为复杂聚合对象各级结构属性的相联判断。由于优化上的关系 , 物理查询路径很可能不同于逻辑路径表达式所指示的路径。
几乎所有的对象查询语言都支持继承语义 , 但是 , 并不是所有的对象查询语言都支持多继承 , 即使支持 , 其继承冲突的分解策略不相同 。
除了隐式的基于对象实体的连接外 , 对象查询语言也通过变量设置与标识相等性来实现兼容类型的值之间的显式连接方式 , 这是与关系查询语言类似的地方。
除了以单一的对象属性,亦即所谓标址属性,作为操作目标之外 , 对象查询语言亦提供集合值属性以及集合比较算子与范围量词的选择 。
在查询语言中, 这种查询方式是指一个查询的结果当作另一个查询语句谓词条件中的自变量,同时它也表现了查询语言的封闭性 。 由于对象封装的原因 , 子模式、视图并不像关系库那样强调。
聚合函数包括 COUNT、MAX、AVERAGE 等等。它们常常作为谓词条件的一部分或者是对检索目标的说明。
在模型中, 集合的概念一般指显式或隐含生成的一个类中实例的集合。在一些场合 , 亦称之为汇集(Collection)沿用SQL同时修改多个满足条件元组的思想 , 对象查询语言亦提供了面向集合的修改机制 。