DB2 9 基础(730 检验)认证指南,第 7 局部: XQuery 简介(2)

developerWorks








XQuery 概述

DB2 9 供给了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而希图的新的盘考言语,它是 W3C 行业标准的一局部。XQuery 运用户可以在 XML 文档固有的层次机关中导航。因此,可以运用 XQuery 检索 XML 文档或文档片断。还可以编写包孕基于 XML 的谓词的 XQuery,从而将不需求的数据从 DB2 将前去的效果中 “过滤出去”。XQuery 供给了很多其他听命,例如对 XML 输出中缀转换以及将条件逻辑兼并到盘考中。

在学习怎样运用 XQuery 之前,需求体味这种言语的一些基础概念。

XQuery 基础

XQuery 老是将 XQuery Data Model 的一个值转换为 XQuery Data Model 的另一个值。XQuery Data Model 中的一个值是由零个或更多条款构成的序列。条款可以是:

  • 任何原子值
  • XML 节点(偶然分称为 XML 文档片断),例如元素、属性或文本节点
  • 完好的 XML 文档


XQuery 的输出每每是一个 XML 文档鸠合。

清单 1 施展分析一个 XML 文档,其中包孕 8 个元素节点、1 个属性节点和 6 个文本节点。元素节点由元素标记默示。在这个文档中,Client、Address、street、city、state、zip 和两个 email 元素都是元素节点。若是细致看看 Client 元素,就会发明它包孕一个属性节点,客户的 id。文档的一些元素节点有相联络干系的文本节点。例如,city 元素的文本节点是 San Jose。

清单 1. 示例 XML 文档

                    
<Client id="123"> 
	<Address>
		<street>9999 Elm St.</street>
		<city>San Jose</city>
		<state>CA</state>
		<zip>95141</zip>
	</Address>
	<email>anyemail@yahoo.com</email>
	<email>anotheremail@yahoo.com</email>
</Client>


图 1 施展分析这个示例文档中的节点。

图 1. 示例 XML 文档中的元素、属性和文本节点
示例 XML 文档中的元素、属性和文本节点

XQuery 言语滥觞于 XPath(界说用户如何在 XML 文档中导航)和 XML Schema(让用户可觉得文档指定有用的机关和数据类型)等其他 XML 标准。在本教程中,学习怎样将 XPath 表达式连络到 XQuery 中。

XQuery 供给了几种分歧的表达式,可以遵照自身喜好的任何体式技俩组合运用它们。每个表达式都前去一系列值,这些值可以用作其他表达式的输出。最外层表达式的效果即是盘考的效果。

本教程讨论两种首要的 XQuery 表达式:

途径表达式
允许用户在 XML 文档的层次机关中导航(能够说 “周游”)并前去在途径末了找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条款并可选地前去每个条款标某些计算效果。











XQuery 与 SQL 的差异

很多 SQL 用户误觉得 XQuery 与 SQL 异常近似。但是,XQuery 在很多方面与 SQL 差异很大年夜,由于希图这种言语的方针是独霸具有相反性质的分歧数据模子。XML 文档包孕层次机关并有固有的序次。与之相反,干系 DBMS(能够更准确地说,基于 SQL 的 DBMS)支持的表是平面的和基于鸠合的,以是行是无序的。

数据模子中的这些差异使得用来支持它们的盘考言语有很大年夜差异。例如,XQuery 使递次员可以在 XML 的层次机关中导航。深刻的 SQL(不带 XML 扩展)没有(也不需求)在表数据机关中 “导航” 的表达式。XQuery 支持有类型数据和无类型数据,而 SQL 数据老是要用特定的类型中缀界说。 在 XQuery 和 SQL 之间有不少差异。供给双方面的列表超出了这个简介性教程的讨论局限,但是 参考质料 中有关于这个主题的更多信息。

XQuery 没有空值(null),由于 XML 文档纰漏缺掉的或未知的数据。SQL 运用空值默示缺掉的或未知的数据。XQuery 前去 XML 数据的序列;SQL 前去各类 SQL 数据类型的效果集。末了,XQuery 只操作 XML 数据。SQL 操作遵照传统 SQL 类型界说的列,SQL/XML(带 XML 扩展的 SQL)操作 XML 数据和传统类型的 SQL 数据。









XQuery 中的途径表达式

XQuery 支持 XPath 表达式,运用户可以在 XML 文档层次机关中导航,找到他们所需求的局部。具体讨论 XPath 超出了本教程的局限,但是我们在这里要看几个简朴的示例。

XPath 表达式看起来异常像在操作传统计算机文件琐细时运用的表达式。思索一下在 Unix 或 Windows 目次中是怎样导航的,就可以理解运用 XPath 在 XML 文档中中缀导航的体式技俩。

XQuery 中的途径表达式由一系列 “步” 构成,步之间由斜线字符分隔隔离涣散。在最简朴的形式中,每一步在 XML 层次机关中降落一层,寻觅前一步前去的元素的子元素。途径表达式中的每一步还可以包孕一个谓词,它对这一步前去的元素中缀过滤,只保存惬心条件的元素。稍后将看到这样的一个示例。

一种罕见的任务是从 XML 文档根(XML 层次机关的最顶层)起头导航,寻觅感兴味的某个节点。例如,要想取得清单 1 的文档中的 email 元素,可以编写下面的表达式:

清单 2. 导航到 email 元素

                    
/Client/email


若是文档包孕多个 email 元素,而您只想取得第一个,那么可以编写:

清单 3. 导航到第一个 email 元素

                    
/Client/email[1]


除了在途径表达式中指定元素节点之外,还可以运用 @ 标记指定属性节点,从而在元素中识别出属性。下面这个途径表达式导航到 id 属性等于 123 的 Client 元素中的第一个 email 元素:

清单 4. 指定属性节点和值

                    
/Client[@id='123']/email[1]


前面这个示例运用了一个基于属性值的过滤谓词。还可以遵照其他节点值中缀过滤。XPath 用户每每遵照元素值中缀过滤,例如下面的表达式前去住在加利福尼亚的客户的 zip 元素:

清单 5. 遵照元素值中缀过滤

                    
/Client/Address[state="CA"]/zip


可以运用通配符(“*”)婚配途径表达式中各个步上的任何节点。下面的示例获取在 Client 元素的任何直接子元素下找到的任何 city 元素。

清单 6. 运用通配符

                    
/Client/*/city


对于我们的示例文档,这将前去值为 San Jose 的 city 元素。导航到这个 city 元素的更准确的体例是:

清单 7. 导航到 city 元素的更准确的体例

                    
/Client/Address/city


清单 8 给出几个其他类型的途径表达式示例。

清单 8. 更多途径表达式及其寄义

                    
//*                        (获取文档中的全数节点) 
//email                    (寻觅文档中任何中央的 email 元素) 
/Client/email[1]/text()    (取得 Client 元素下第一个 email 元素的文本节点)
/Client/Address/*          (选择根 Client 元素的 Address 子元素的全数子节点)
/Client/data(@id)          (前去 Client 元素的 id 属性的值)
/Client/Address[state="CA"]/../email    (寻觅地址在加利福尼亚的客户的 email 元素。
				“..” 这一步导航回 Address 节点的父元素。) 


细致,XPath 是大年夜小写敏感的。在编写 XQuery 时记着一点很首要,由于这是 XQuery 与 SQL 分歧的一个方面。例如,若是将途径表达式 “/client/address” 放进 XQuery,对于 清单 1 中的示例文档,不会前去任何效果。









XQuery 中的 FLWOR 表达式

人们每每提到 XQuery 中的 FLWOR 表达式。与 SQL 中的 SELECT-FROM-WHERE 块一样,XQuery FLWOR 表达式可以包孕多个由关键字指示的子句。FLWOR 表达式的子句以下面的关键字收尾:

  • for:遍历一个输出序列,按序将一个变量绑定到每个输出条款
  • let:声明一个变量并给它赋值,值可以是包孕多个条款标列表
  • where:指定对盘考效果中缀过滤的标准
  • order by:指定效果的排递序次
  • return:界说前去的效果


我们来简明引见一下每个关键字。我们将在一节中讨论 forreturn,以是可以看到一个完好的示例。(若是没有 return 子句,表达式就不完好。)

forreturn
forreturn 关键字用来遍历一系列值并为每个值前去某些效果。下面是一个异常简朴的示例:
for $i in (1, 2, 3)
return $i


在 XQuery 中,变量名前面有一个美元标记(“$”)。以是,前面的示例将数字 1、2 和 3 绑定到变量 $i(每次绑定一个数字),并对于每次绑定前去 $i 的值。前面表达式的输出是 3 个值的序列:

1
2
3



let
偶然分人们难以剖断什么时分应该运用 let 关键字而不是 forlet 关键字并不像 for 关键字那样遍历一系列输出,并将每个条款按序绑定到一个变量,而是将一个单一输出值赋值给变量,但是这个输出值可以是零个、一个或更多条款标序列。因此,在 XQuery 中 forlet 的行为差异很大年夜。

看一个示例应该有助于廓清这一差异。请思索下面这个运用 for 关键字的表达式,并细致前去的输出:

for $i in (1, 2, 3) 
return <output> {$i} </output>
<output>1</output>
<output>2</output>
<output>3</output>


表达式的末了一行要求为每次迭代前去一个名为 output 的新元素。这个元素的值是 $i 的值。由于 $i 按序设置为数字值 1、2 和 3,以是这个 XQuery 表达式前去 3 个 output 元素,它们具有分歧的值。

现在思索运用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return <output>{$i}</output>
<output>1 2 3</output> 


输出很纷好比样。输出只需一个 output 元素,它的值是 “1 2 3”。

这两个示例申明了一个重点:for 关键字遍历输出序列中的条款(每次一个),并将每个条款按序绑定到一个指定的变量。与之相反,let 关键字将输出序列中的全数条款同时绑定到一个指定的变量。

where
在 XQuery 中,where 的听命很像 SQL 中的 WHERE 子句:它运用户可以将过滤标准使用于盘考。思索以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return <output>{$i}</output>
<output>1</output>
<output>2</output>


order by
运用户可以让前去的效果遵照指定的序次排序。思索以下 XQuery 表达式和它的输出(输出没有遵照任何用户指定的序次中缀排序):
for $i in (5, 1, 2, 3)
return $i
5
1
2
3


可以运用 order by 关键字对效果中缀排序。下面的示例使前去的效果遵照降序排序:

for $i in (5, 1, 2, 3)
order by $i descending 
return $i
5
3
2
1












DB2 对 XQuery 的支持

DB2 把 XQuery 看成一类言语,这允许用户直接编写 XQuery 表达式,而不需求将 XQuery 嵌入或包装到 SQL 语句中。DB2 的盘考引擎将原生地措置 XQuery,这意味着它直接解析、评价和优化 XQuery,而不需求在幕后将它们转换为 SQL。若是情愿,可以编写同时包孕 XQuery 和 SQL 的 “多语种” 盘考。DB2 也会措置和优化这些盘考。

要在 DB2 中直接实施 XQuery,必须在盘考前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 解析器来措置苦求。若是将 XQuery 作为最外层的(顶级)言语运用,那么只需这么做就够了。若是将 XQuery 表达式嵌入 SQL 中,那么不需求在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为首要言语,以是这里给出的全数盘考都在收尾处加上 xquery 关键字。




版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始来因 、作者信息和本声明。否则将深究功令责任。

posted @ 2011-03-07 00:09  蓝色的天空III  阅读(168)  评论(0编辑  收藏  举报