资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,第,5,章,XQuery,简介,重点:,创建,DB2 9,XML,数据库,Create,Database,dbxml,automatic,storage,yes,using,codeset,utf-8,territory,cn,注意:,当前,,DB2,只在定义为,Unicode,(,UTF-8,)的数据库中支持,XML,列。如果数据库在创建时没有启用,Unicode,支持,就不能在其中创建,XML,列。,自动存储,clients,表包含几个传统,SQL,数据类型的列,一个新的,SQL “XML”,数据类型的列。,clients,表的定义:,create table,clients,(,id,int,primary key not null,name,varchar(50),status,varchar(10),contactinfo,xml,);,客户的联系信息,示例表,clients,insert into,clients,values (3227, Ella,Kimpton, Gold,5401 Julio Ave.,San Jose,CA,95116,4084630000,4081111111,4082222222,4087776666,love2shop, );,向,clients,示例表插入数据,:,在文件,Clients.sql,中有,6,行数据可以插入表中。,例,1,:,XML,文档,9999 Elm St.,San Jose,CA,95141,anyemail,anotheremail,包含,8,个,元素,节点、,1,个,属性,节点和,6,个,文本,节点,属性节点,id,city,元素的,文本节点,是,San Jose,email,是元素节点,XML,文档中的元素、属性和文本节点,XQuery,简介,XQuery,是一种专门为,操作,XML,数据,而设计的新的,查询语言,。,可以利用,XQuery,检索,XML,列中存储的整个,XML,文档或,XML,片段。,两种重要的,XQuery,表达式,:,路径表达式,允许用户在,XML,文档的层次结构中导航(或者说“漫游”)并返回,在路径末端找到的节点。,FLWOR,表达式,它很像,SQL,中的,SELECT-FROM-WHERE,表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。,XQuery,中的路径表达式,XQuery,中的路径表达式由一系列“,步,” 组成,步之间由斜线字符分隔。每一步在,XML,层次结构中下降一层,寻找前一步返回的元素的子元素,例,2,:要想获得例,1,的文档中的,email,元素,可以编写下面的表达式:,/Client/email,例:要想获得例,1,的文档中的,email,元素的文本,可以编写下面的表达式:,/Client/email/text(),XQuery,中的路径表达式,例,3,:如果文档包含多个,email,元素,而您只想获得第一个,那么可以编写:,/,Client/email,1,路径表达式中的每一步还可以,包含一个,谓词,,它对这一步返回的元素进行过滤,,只保留满足条件的元素。,XQuery,中的路径表达式,例,4,:路径表达式导航到,id,属性等于,123,的,Client,元素中的第一个,email,元素,/,Client,id,=123,/email1,一个基于属性值的过滤谓词,除了在路径表达式中指定元素节点之外,还可以,使用,符号指定属性节点,,从而在元素中识别出属性。,XQuery,中的路径表达式,例,5,:返回住在加利福尼亚的客户的,zip,元素,/Client/,Address,state,=CA,/zip,根据元素值进行过滤,XQuery,中的路径表达式,例,6,:获取在,Client,元素的任何直接子元素下找到的任何,city,元素,/Client/,*,/city,/Client/,Address,/city,使用通配符,(*)或(,/,),匹配路径表达式中各个步上的任何节点,/Client/city,或,等价于,更多路径表达式及其含义,/*,(获取文档中的所有节点),/email,(寻找文档中任何地方的,email,元素),/Client/email1/text(),(获得,Client,元素下第一个,email,元素的文本节点),/Client/Address/*,(选择根,Client,元素的,Address,子元素的所有子节点),/Client/,data(id,),(返回,Client,元素的,id,属性的值),XQuery,中的,FLWOR,表达式,FLWOR,表达式的子句以下面的关键字开头:,for,:,遍历一个输入序列,依次将一个变量绑定到每个输入条目,let,:,声明一个变量并给它赋值,值可以是包含多个条目的列表,where,:,指定对查询结果进行过滤的标准,order by,:,指定结果的排序次序,return,:,定义返回的结果,for,和,return,for,$,i in (1, 2, 3),return $i,1,2,3,在,XQuery,中,,变量名前,面有一个,美元符号,$,将数字,1,、,2,和,3,绑定到变量,$i,(,每次绑定一个数字,)。,表达式的输出是,3,个值的序列:,每次绑定返回,$i,的值,在,XQuery,中,for,和,let,的差异,for $i in (1, 2, 3),return ,$i,1,2,3,let $i := (1, 2, 3),return ,$i,1 2 3,每次迭代返回一个名为,output,的新元素,使用,let,关键字的,XQuery,表达式:,使用,for,关键字的,XQuery,表达式:,输出一个,output,元素,值是,“,1 2 3,”,在,XQuery,中,,where,的功能,for $i in (1, 2, 3),where $i 3,return $i,1,2,where,的功能:,使用户能够将过滤标准应用于查询。,Order by,的功能,Order by,的功能,:使用户能够让返回的结果按照指定的次序排序,XQuery,表达式和它的输出,:,for $i in (5, 1, 2, 3),return $i,5,1,2,3,for $i in (5, 1, 2, 3),order by,$i,descending,return $i,5,3,2,1,DB2,对,XQuery,的支持,注意:,在,DB2,中直接执行,XQuery,必须在查询前面加上关键字,XQuery,DB2,调用它的,XQuery,分析器来处理请求,XQuery,是大小写敏感的,Select,检索,XML,文档,例:用一般的,SQL,检索,contactinfo,列中包,含的完整,XML,文档集,.,select,contactinfo,from,clients,检索,DB2,中存储的完整,XML,文档,例,1,:返回包含客户联系信息的,XML,文档序列,xquery,db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO),db2-fn:xmlcolumn,函数:,指定输入数据来源的一种方法。这个函数有一个输入参数,这个参数标识用户感兴趣的,DB2,表和,XML,列。函数返回给定的列中存储的,XML,文档序列 。,必须在查询前面加上关键字,XQuery,思考:,为什么这个查询中指定的表和列名是大写的,?(CLIENTS.CONTACTINFO),虽然创建这个表的,SQL,语句中表和列名是小写的,,DB2,会在内部编目表中将,表和列名转换为大写,。因为,XQuery,是大小写敏感,的,所以在写,XQuery,查询语句中表和列名大写。,例,2,:用一般的,SQL,检索,contactinfo,列中包含的完整,XML,文档集,select,contactinfo,from clients,检索特定的,XML,元素,flwor,表达式,例,3,:检索客户传真号的,FLWOR,表达式,如下,xquery,for,$y in db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client/fax,return,$y,DB2,调用它的,XQuery,分析器,每个,fax,元素依次绑定到变量,$y,每次迭代返回,$y,的值,4087776666,4085555555,执行结果:,例,4,:检索客户传真号的,路径表达式,xquery,db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client/fax,检索特定的,XML,元素,路径表达式,获得,XML,元素值的文本表示,例,5,:检索客户传真号的文本表示的两个查询,xquery,for $y in db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client/fax,return,$y/text(),(或),xquery,db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client/fax/,text(),在,return,子句中调用,text(),函数,检索复杂,XML,类型的,XQuery,例,6,:检索客户联系信息的,Address,元素,xquery,for,$y in,db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client/Address,return $y,(或),xquery,db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client/Address,根据,XML,元素值进行过滤的查询,例,7,:返回邮政编码为,95116,的所有客户的邮政地址,xquery,for $y in db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client/Address,where,$y/zip,=95116,return $y,Flwor,表达式:,带过滤谓词的路径表达式 :,xquery,db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client/,Addresszip,=95116,根据,XML,元素值进行过滤的查询,过滤谓词,查询客户的邮政编码为,95116,,返回的结果:,5401 Julio Ave.,San Jose,CA,95116,指定多个过滤谓词,例,8-1,:查询那些住在,San Jose,市,或者,邮政编码为,95032,的客户的电子邮件信息 。,用,FLWOR,表达式,根据多个,XML,元素值进行过滤,:,xquery,for,$y,in db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/,Client,where,$y/Address/zip,=95032,or,$y,/Address/city,=San Jose,return,$y/email,变量,$y,绑定到,Client,元素,对于,clients,表中的示例数据,前面两个查询的输出是:,love2shop,beatlesfan36,lennonfan36,输出没有表明哪些电子邮件地址来自同一个,XML,文档,对于没有提供电子邮件地址的客户,没有返回,XML,数据(,因为,XQuery,不使用空值,),例,8-2,:查询那些住在,San Jose,市,或者,邮政编码为,95032,的客户的电子邮件信息,返回客户的第一个,email,元素。,xquery,for,$y in db2-fn:xmlcolumn,(CLIENTS.CONTACTINFO)/Client,where,$y/Address/zip=95032 or $y,/Address/city=San Jose,return,$y/,email1,(或),xquery,db2-fn:xmlcolumn(CLIENTS.CONTACTINFO)/,ClientAddress,/zip=95032,or Address/city=San Jose/,email1,查询产生下面的输出:,love2shop,beatlesfan36,使用转换表示,XML,文档中缺失的或重复的元素,xquery,for,$y in db2-fn:xmlcolumn(CLIENTS.CONTACTINFO)/Client,where,$,y/Addresszip,=95032 or $,y/Addresscity,=San Jose,return, $y/email ,例,9,:以,emailList,标记输出,住在,San Jose,市,或者,邮政编码为,95032,的客户的电子邮件信息,返回的输出包装在一个新的,XML,元素中,查询结果如下:,love2shop,beatlesfan36,lennonfan36,带有条件的输出语句,例,9,:针对例,8,的查询条件,如果客户没有电子邮件地址,那么输出他的地址。,xquery,for,$y in db2-fn:xmlcolumn(CLIENTS.CONTACTINFO)/Client,where,$,y/Addresszip,=95032 or,$,y/Addresscity,=San Jose,return (,if,($y/email),then, $y/email ,else,$y/Address),“混合型”查询,将,SQL,嵌入,XQuery,中,用,db2-fn:sqlquery,函数替代,db2-fn:xmlcolumn,函数,传递给,db2-fn:sqlquery,的,SQL,查询必须,只返回,XML,数据,将,XQuery,嵌入,SQL,中,问题引入,select,contactinfo,from,clients,where,status=,Gold,获得,Gold,客户的联系信息。,获得,Gold,客户的地址。,Xquery,for $y,in,db2-fn:sqlquery,(,select,contactinfo,from,clients,where,status=,Gold,)/Client,return,$y/Address, ,Gold, ,使用了两个单引号, “额外的” 单引号是转义字符,db2-fn:sqlquery,函数,db2-fn:sqlquery,函数,函数的参数为,select,命令,函数执行的,select,查询必须只返回,XML,数据,db2-fn:sqlquery,(,select,contactinfo,from,clients,where,status=,Gold,),将,SQL,嵌入,XQuery,中,例:假设希望获得住在,San Jose,的,Gold,客户的所有电子邮件地址。如果一个客户有多个电子邮件地址,那么希望这些地址在输出中是同一个记录的组成部分。最后,如果符合条件的,Gold,客户没有提供电子邮件地址,那么希望检索他的邮政地址。,将,SQL,嵌入,XQuery,中,xquery,for $y,in,db2-fn:sqlquery,(,select,contactinfo,from,clients,where,status=,Gold,)/Client,where,$y/Address/city=San Jose,Return,$y/email,例:获得住在,San Jose,的,Gold,客户的所有电子邮件地址。,将,SQL,嵌入,XQuery,中,xquery,for $y,in,db2-fn:sqlquery,(,select,contactinfo,from,clients,where,status=,Gold,)/Client,where,$y/Address/city=San Jose,return,(,if ($y/email) then,$y/email,else,$y/Address,),(,Gold,)使用了两个单引号, “额外的” 单引号是转义字符,将,XQuery,嵌入,SQL,中,select,name, status,xmlquery,(,$c,/Client/phone/home,passing,contactinfo,as,c,),from,clients,where,xmlexists,(,$y,/Client/Addresszip,=95032,passing,contactinfo,as,y,),例:将,XQuery,路径表达式嵌入,SQL,来获取和限制,XML,数据,路径表达式引用一个变量(,$c,),这个变量引用,contactinfo,列,变量,y,标识,DB2,将在,contactinfo,列中寻找,XML,文档,将,XQuery,嵌入,SQL,中,XMLExists,函数,XMLExists,函数以,XQuery,表达式作为输入,从而导航到文档中感兴趣的节点,将返回的结果限制为那些包含满足指定条件(即指定的条件为 “,true”,)的,XML,文档的行,XMLQuery,函数,通常用来从,XML,文档中检索一个或多个元素,XMLQuery,函数以,XQuery,表达式作为输入,注意:,XMLQuery,:表示这个函数返回的结果应该作为,SQL,结果集中的一列,XMLExists,:表示,DB2,应该根据一个,XML,谓词对结果进行限制。,练习,创建表,t,列名,类型,i,int,doc,xml,Create table t ( i,int, doc xml),输入数据,insert into T values(1, aabbbcccddd),insert,into T values(2, ,ChicagoRenee,Zellweger, Richard,Gere,Catherine Zeta-Jones),insert into T values(3, ,TransFormer, ,擎天柱,大黄蜂,爵士,),写出下列语句含义,xquery,for $d in db2-fn:xmlcolumn (T.DOC) let $a:=$d/movie/title return $a,xquery,for,$d in db2-fn:xmlcolumn (T.DOC),let,$a:=$d/,title,return,$a,xquery,for,$d in db2-fn:xmlcolumn (T.DOC),let,$a:=$d/,title,return,$a/text(),写出下列语句含义,Xquery,for $d in db2-fn:xmlcolumn (T.DOC),let $a:=$,d/title,$b,:=$d/actor,where $a/text()=Chicago,return $b,xquery,for,$d in db2-fn:xmlcolumn (T.DOC),let,$a:=$d/,title,order by,$d/movie/year,descending,return,$a,xquery,for,$d in db2-fn:,sqlquery,(select doc from t),where,$d/movie/actor/text,()=,爵士,return,$d/movie/title/text,(),xquery,for $d in db2-fn:sqlquery(select doc from t),where $,d/movieactor,=,爵士,return $d/movie/title/text(),select,i,xmlquery,($doc/movie/title, passing doc as doc),from,T,where i,1,如果不执行,where i1,select,i,xmlquery,(,for,$d in,$doc/movie,where,$d/year=2007,return,$d/title passing,doc,as doc),from,T,where i,1,select,i,xmlquery,(,for,$d in,$doc/movie,where,$d/year=2007 or $d/year=2008,return,$d/title passing,doc,as doc),from,T,where i,1,select,i,xmlquery,(,for,$d in $doc/movie,where,$d/year=2007,or,$d/year=2008,return,$d/title passing,doc,as doc),from,T,where i,1,select,i,xmlquery,($DOC,/movie/title/text() passing doc as DOC),from,T,where,xmlexists,($DOC/movieyear,=”2008” or year=”2007”passing doc as DOC),习题,
展开阅读全文