对象查询语言

对象查询语言

目录导航

概述

查询语言一直是数据库系统知识库系统研究的重要内容。一般而言 , 查询相当于是一个作用在库上的函数, 而返回值为满足条件的内容。传统上的关系查询语言,是一种基于值的说明性的高级语言, 其查询独立于库中数据的变化并且其查询目标与结果均基于关系元组。 而对象查询语言作为面向对象数据库管理系统(OODBMS)的一个有机组成部分 , 其查询的目标是库中的对象,由于面向对象数据模型综合了包括语义数据模型 、嵌套关系数据模型等模型的特点 , 因而其查询语言更加完备、高效与复杂,与关系查询语言相比 , 其优点表现在:

  • 基于对象标识符(OID)的导航式查询与基于值的相联式查询同时存在, 并互为补充。
  • 数据定义语言(DOL)与数据操作语言(DML)有机集成,即查询语言与数据库程序设计语言的统一性 , 消除了语义失配的现象 , 从而简化了复杂的数据密集型应用的实现过程。
  • 表达能力强 、语义丰富,例如在查询语言中继承语义的体现。

由于类层次结构 , 复杂对象与动态行为、方法的引人,使得面向对象数据模型的复杂性远高于其它数据模型 , 至今仍缺乏有效的形式语义刻划。造成了对象查询语言设计与实现上的困难。不过 , 迄今为止 , 人们已设计出10多个对象查询语言 , 它们在查询模型、 设计风格 、 对象、代数以及查询优化等方面作了不少有益的探索。

所以 , 对象查询语言的设计途径可分为:

在单纯的说明性SQL或QUEL语言的基础上进行面向对象(OO)风格的扩充 例如Iris的OSQL语言。

在OODB程序设计语言的基础上增加查询的功能 , 其中包括SQL与非SQL两种风格。例如,OQL[C++]以C++作为宿主语言进行查询扩充 , 仍旧保留了SQL风格 , 而OQL[UF]则丢弃了SQL风格。

OQL的特点和设计规则

OQL是一种面对对象的数据查询语言,它具备传统SQL的主要功能,又能与传统的宿主语言,如C++、JAVA等,自由地结成一个整体,既可以将宿主语言和OQL查询混合起来,能够嵌入量词和方法。它的设计原则主要包括:[1]

  1. OQL是专门为ODMG对象模型定制的查询语言,以ODMG为对象模型为基础。
  2. OQL的语法和SQL-92非常类似,也做了不少扩展,增加了有关ODMG概念的特征,包括对象标识,复合对象、路径表达式、多态、操作调用、继承、滞后联编等。
  3. OQL提供高层原语,用于处理对象集合、结构体和列表。
  4. OQL是一种函数式语言,只要操作数遵循ODL类型系统的规范,操作符可以任意的自由组合。
  5. OQL是一种简单的查询语言,并不具备计算完备性。
  6. OQL不提供显式的更新操作符,而是通过在对象中定义相关的操作函数来实现更新操作。
  7. OQL提供对对象的访问,并依靠这种访问特性优化查询。
  8. OQL的形式语义易于定义。

OQL查询表达式

查询定义的声明

查询定义是具有如下形式的表达式[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的结果。

基本表达式selectfromwhere

  1. OQL包含最基本的SQL查询格式;
  2. select-from-where表达式。
  3. 一般OQL的select-from-where表达式的组成如下:
    1. select后跟着表达式的列表。
    2. from后跟着一个或多个变量说明的列表,其值是聚集类型的表达式和变量名。
    3. where后跟着布尔表达式。
  4. 查询将产生对象的包。在嵌套的循环中,通过考查FROM子句中所有可能的值来计算这个包。如果这些变量值的任何组合都满足WHERE子句的条件,那么就把SELECT子句所描述的对象加到包中,该包就是select-from-where语句的结果。

量词表达式

量词表达式用于表达集合的数量保护关系。

例如,检测集合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)为真,否则为假。

聚合表达式

  1. OQL使用与SQL相同的五种聚合运算符:AVG、COUNT、SUM、MIN、MAX
    1. COUNT可以应用于任何聚集[1]
    2. SUM和AVG可以用于算术类型的聚集
    3. 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个共同特征 。

SQLSFW风格

一般而言遵循传统的SQL查询语言的句法、结构较易实现向上兼容与标准化 , 并且符合用户使用传统格式的心理。不过 , 基于OO数据模型构造的SFW子句 即(Sclect、From与Where子句 )具有更丰富的语义 ,而完全摆脱SQL风格的对象查询语言亦不在少数 。

路径表达式

在模式级进行查询路径的逻辑说明为大多数对象查询语言所采用 , 它表现为复杂聚合对象各级结构属性的相联判断。由于优化上的关系 , 物理查询路径很可能不同于逻辑路径表达式所指示的路径。

继承支持

几乎所有的对象查询语言都支持继承语义 , 但是 , 并不是所有的对象查询语言都支持多继承 , 即使支持 , 其继承冲突的分解策略不相同 。

显式连接explicitjoin

除了隐式的基于对象实体的连接外 , 对象查询语言也通过变量设置与标识相等性来实现兼容类型的值之间的显式连接方式 , 这是与关系查询语言类似的地方。

集合值setvalue属性

除了以单一的对象属性,亦即所谓标址属性,作为操作目标之外 , 对象查询语言亦提供集合值属性以及集合比较算子与范围量词的选择 。

嵌套查询

在查询语言中, 这种查询方式是指一个查询的结果当作另一个查询语句谓词条件中的自变量,同时它也表现了查询语言的封闭性 。 由于对象封装的原因 , 子模式、视图并不像关系库那样强调。

聚合函数

聚合函数包括 COUNT、MAX、AVERAGE 等等。它们常常作为谓词条件的一部分或者是对检索目标的说明。

修改

在模型中, 集合的概念一般指显式或隐含生成的一个类中实例的集合。在一些场合 , 亦称之为汇集(Collection)沿用SQL同时修改多个满足条件元组的思想 , 对象查询语言亦提供了面向集合的修改机制 。

相关百科
返回顶部
产品求购 求购