Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104570132
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570133
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570134
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570135
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570136
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570137
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570138
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570129
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570140
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570141
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570142
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570143
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570144
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570145
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570146
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570148
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570149
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570150
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570151
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570152
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570153
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570144
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570155
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570156
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570157
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570158
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570159
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570160
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570161
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570162
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570163
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570164
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570165
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570166
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570167
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570168
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570159
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570170
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570171
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570172
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570173
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570174
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570175
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570176
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570177
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570178
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570179
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570180
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570181
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570182
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570183
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks

DB2 9 基础(730 考试)认证指南,第 7 部分: XQuery 简介(2)-sdccf-ChinaUnix博客
  • 博客访问: 104570174
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 22:08:48

developerWorks



XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119653) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119652) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119651) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119650) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119649) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119648) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119646) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119645) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119641) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119640) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119639) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119637) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119636) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119635) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119634) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119633) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119632) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119630) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119628) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119627) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119626) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119622) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119619) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119618) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119617) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119616) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119615) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119614) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119613) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119612) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119611) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119610) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119608) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119604) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119603) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


XQuery 概述

DB2 9 提供了对 XQuery 的支持。XQuery 是一种专门为操作 XML 数据而设计的新的查询语言,它是 W3C 行业标准的一部分。XQuery 使用户能够在 XML 文档固有的层次结构中导航。因此,可以使用 XQuery 检索 XML 文档或文档片段。还可以编写包含基于 XML 的谓词的 XQuery,从而将不需要的数据从 DB2 将返回的结果中 “过滤出去”。XQuery 提供了许多其他功能,比如对 XML 输出进行转换以及将条件逻辑合并到查询中。

在学习如何使用 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。



                    
 
	
9999 Elm St. San Jose CA 95141
anyemail@yahoo.com anotheremail@yahoo.com

图 1 显示这个示例文档中的节点。



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

XQuery 语言来源于 XPath(定义用户如何在 XML 文档中导航)和 XML Schema(让用户能够为文档指定有效的结构和数据类型)等其他 XML 标准。在本教程中,学习如何将 XPath 表达式结合到 XQuery 中。

XQuery 提供了几种不同的表达式,可以按照自己喜欢的任何方式组合使用它们。每个表达式都返回一系列值,这些值可以用作其他表达式的输入。最外层表达式的结果就是查询的结果。

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

路径表达式
允许用户在 XML 文档的层次结构中导航(或者说 “漫游”)并返回在路径末端找到的节点。
FLWOR 表达式
它很像 SQL 中的 SELECT-FROM-WHERE 表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。







许多 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 支持 XPath 表达式,使用户能够在 XML 文档层次结构中导航,找到他们所需要的部分。详细讨论 XPath 超出了本教程的范围,但是我们在这里要看几个简单的示例。

XPath 表达式看起来非常像在操作传统计算机文件系统时使用的表达式。考虑一下在 Unix 或 Windows 目录中是如何导航的,就能够理解使用 XPath 在 XML 文档中进行导航的方式。

XQuery 中的路径表达式由一系列 “步” 组成,步之间由斜线字符分隔。在最简单的形式中,每一步在 XML 层次结构中下降一层,寻找前一步返回的元素的子元素。路径表达式中的每一步还可以包含一个谓词,它对这一步返回的元素进行过滤,只保留满足条件的元素。稍后将看到这样的一个示例。

一种常见的任务是从 XML 文档根(XML 层次结构的最顶层)开始导航,寻找感兴趣的某个节点。例如,要想获得清单 1 的文档中的 email 元素,可以编写下面的表达式:



                    
/Client/email

如果文档包含多个 email 元素,而您只想获得第一个,那么可以编写:



                    
/Client/email[1]

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



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

前面这个示例使用了一个基于属性值的过滤谓词。还可以根据其他节点值进行过滤。XPath 用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的 zip 元素:



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

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



                    
/Client/*/city

对于我们的示例文档,这将返回值为 San Jose 的 city 元素。导航到这个 city 元素的更精确的方法是:



                    
/Client/Address/city

清单 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 表达式。与 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  {$i} 


1
2
3

表达式的最后一行要求为每次迭代返回一个名为 output 的新元素。这个元素的值是 $i 的值。因为 $i 依次设置为数字值 1、2 和 3,所以这个 XQuery 表达式返回 3 个 output 元素,它们具有不同的值。

现在考虑使用 let 关键字的类似表达式:

let $i := (1, 2, 3) 
return {$i}


1 2 3 

输出很不一样。输出只有一个 output 元素,它的值是 “1 2 3”。

这两个示例说明了一个重点:for 关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let 关键字将输入序列中的所有条目同时绑定到一个指定的变量。

where
在 XQuery 中,where 的功能很像 SQL 中的 WHERE 子句:它使用户能够将过滤标准应用于查询。考虑以下示例:
for $i in (1, 2, 3) 
where $i < 3 
return {$i}


1
2

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 当作一类语言,这允许用户直接编写 XQuery 表达式,而不需要将 XQuery 嵌入或包装到 SQL 语句中。DB2 的查询引擎将原生地处理 XQuery,这意味着它直接分析、评估和优化 XQuery,而不需要在幕后将它们转换为 SQL。如果愿意,可以编写同时包含 XQuery 和 SQL 的 “多语种” 查询。DB2 也会处理和优化这些查询。

要在 DB2 中直接执行 XQuery,必须在查询前面加上关键字 xquery。这指示 DB2 调用它的 XQuery 分析器来处理请求。如果将 XQuery 作为最外层的(顶级)语言使用,那么只需这么做就够了。如果将 XQuery 表达式嵌入 SQL 中,那么不需要在前面加上 xquery 关键字。

在本教程中,将以 XQuery 作为主要语言,所以这里给出的所有查询都在开头处加上 xquery 关键字。

阅读(119602) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~