通过上面两个例子我们可以看出,二者既有类似之处,又有很多不同,作为两种主流的查询语言,我们可以对两者进行一个比较:
sql
是对关系型数据库的操作
模式(schema)是已知的,并且已经有相应的策略。
使用select, from, where, group by以及having语句命令
关系属性值
tuple
完整的xml 文档
用tuple变量代替tuple
在每个select语句中只能搭配一个group变量
在where语句过滤出tuple后,group by 和having 语句方可处理group。
仅仅是单一的属性子查询能够被用于where语句
语法形式纷繁复杂
仅仅返回一个关系
select语句返回简单的值
xquery
是对xml文档的操作
模式不是必须的。在不久的未来模式可以被用于验证和进行xquery查询。
使用for-let, where和return表达式对应于sql中的from, where和select语句。在xquery中是不需要group by以及having语句的。
单一的xml元素
for变量代表的是一个元素(一个子树)let变量代表的是一系列元素(一个森林)可以有多个for和let变量
where语句可以被用于过滤由for和let变量定义的一个元素或者一系元素。
let变量可以被用于创建任意数目的类似分组机制。
在xquery中没有这样的要求。在xquery中,可以在你需要使用子查询的任何时候使用它
简洁清晰的语法结构。合乎普通语法的结构都是可用的。还包括了,if then else,聚集和数词
可以返回xml文档甚至是简单的文本文档
return语句允许元素被调整成任意的结构作为结果输出。
xquery的实现与应用
xquery作为一种全新的数据查询语言,已经被众多的科研机构与企业所接受和采纳。目前微软、ibm和oracle公司数据库核心都是采用的xquery标准。
ibm的xperanto-based information integrator集成了xml、xquery、文件搜索技术及web services技术。可让人们在关系数据库、xml文件、一般文件、电子表格及其他数据源中查询数据,有如在单一数据库中。
bea推出的liquid data是以xml和xquery为基础的引擎及可视化工具,可以将不同地点的数据源连接起来,包括表格、文件、影音资料。可以加速企业內部、企业与合作夥伴间的信息整合与集成。
oracle在2002年3月发表java xquery的原型标准,现在我们可以通过下面的地址获得一个最新下载:到本文完稿时最新版本为 release_0.2_030217,这是一个技术预览版。http://otn.oracle.com/sample_code/tech/xml/xmldb/xmldb_xquerydownload.html其中包含一个带有 oracle xquery 原型(在一个 jar 文件中)和 java 文档的 jar 文件。一旦安装完成,就可以使用 java api (ojxqi) 或命令行实用工具来测试该原型。
运行这个原型还需具备一些最基本的环境,如xdk,最低版本需要xdk 9i production release - xdk 9.2.0.1.0。另外就是jdk,最低版本为jdk 1.3,如果要访问数据库还要用到oracle xsu以及jdbc驱动。
解压缩xquery文件后,需要设置环境变量,我们假设xquery文件夹背解压缩到c盘根目录,那么对环境变量的操作如下:
classpath=c:\xquery\xquery.jar;c:\xdk\lib\xmlparserv2.jar;
如果设置完全没有问题,你现在就应当可以进行一个xquery查询了。
由于oracle官方下载包xquery原型中的样例exmpl1.xql看起来似乎有些问题,我们在此基础之上作一些修改,得到了下面的一个测试程序:
<bib>
{
for $b in document("bib.xml")/bib/book
where $b/publisher = "addison-wesley" and $b/@year > 1991
return
<book>
{$b/@year}
{$b/title}
</book>
}
</bib>
切换到命令行状态下,进入解压缩xquery.jar的文件夹,在命令行下我们输入:java oracle.xquery.xqlpluse exmpl2.xql便会从命令行中返回下面的查询结果:
另外还有一种交互式的方法,笔者感觉设计的还不完善,所以不作为介绍内容。如果想了解可以参考oracle的在线文档。
该技术的特色是实现了w3c的xquery标准再加上oracle的扩展功能,且着重支持关系数据库及xquery用例(xquery use cases),另一特色是包含一個实验性质的jdbc式的java api供xquery使用,乲像sql的函数类似,可以在sql的查询结果上使用xquery。oracle的目标是提供兼具sql风格及xquery-based的查询语法,以便查询oracle数据库中的xml数据。oracle 9i也支持xml schema,可用xml格式存取原本关系数据库中的数据,成为native xml数据库。最新的oracle 10g也进一步加强了对xquery的支持。
microsoft早在2001年5月就推出的xml查询语言演示 (xml query language demo)网,你可以通过下面的地址访问到:(http://131.107.228.20/)。你可以使用上面的例子来进行查询演示,也可以自己来编写xquery查询程序。我们下面来看一下一个具体的示范查询:
在sql server 2000 中microsoft提供了对xml支持。而在即将推出的代号为yukon的新版sql server中不但增强了对xml的支持,用于管理和存储结构和非结构化的数据。而且还加入和对xquery查询能力的深度支持,允许xml对象的数据层计算。同时还提供了创建xquery查询程序的一套新的工具集。
参考文献:
下面提供出来的不但有本文成文时参考的一些材料,还有一些是我希望推荐给大家的极其珍贵的学习材料,希望能够对读者学习xquery有所帮助:
? xquery from the experts: a guide to the w3c xml query language, addison wesley
? xml query use cases, w3c working draft, (http://www.w3.org/tr/xmlquery-use-cases)
? xml query requirements, w3c working draft, (http://www.w3.org/xml/group/xmlquery/xmlquery-req)
? xquery 1.0 and xpath 2.0 data model, w3c working draft(http://www.w3.org/tr/query-datamodel/)
? xquery 1.0 and xpath 2.0 formal semantics, w3c working draft (http://www.w3.org/tr/query-semantics/)