XQuery作为专门为XML数据设计的查询语言,能够高效从XML数据库或者XML文档中提取、筛选、转换数据,其语法结构清晰,支持路径匹配、条件过滤、结果排序等多种查询能力,是处理XML数据的核心工具。
XQuery基础查询语法
XQuery的核心查询能力建立在XPath路径表达式之上,最基础的查询可以直接使用路径表达式定位XML中的节点。比如我们有一个存储图书信息的XML文档,结构如下:
<library>
<book category="编程">
<title>XQuery实战</title>
<author>张三</author>
<price>89.9</price>
</book>
<book category="文学">
<title>散文精选</title>
<author>李四</author>
<price>45.0</price>
</book>
<book category="编程">
<title>XML入门</title>
<author>王五</author>
<price>69.9</price>
</book>
</library>
如果要查询所有图书的标题,基础的XQuery语句可以写成:
for $b in doc("library.xml")/library/book
return $b/title
这里的doc("library.xml")用于加载XML数据库中的文档,/library/book是XPath路径,匹配所有book节点,$b是变量用来存储每个匹配的节点,return后面指定返回的内容。
FLWOR表达式核心用法
FLWOR是XQuery中最强大的表达式结构,由For、Let、Where、Order by、Return五个部分构成,分别对应循环、变量定义、条件过滤、排序、结果返回五个逻辑,能够完成复杂的查询需求。
1. For子句:循环遍历节点
For子句用来遍历XML中的多个节点,和编程中的for循环逻辑类似,语法为for $变量名 in 节点路径,示例如下:
for $book in doc("library.xml")/library/book
return $book/title
这段代码会遍历所有book节点,返回每个book下的title节点内容。
2. Where子句:条件过滤
Where子句用来筛选符合特定条件的节点,比如我们要查询所有编程类的图书:
for $book in doc("library.xml")/library/book
where $book/@category = "编程"
return $book/title
这里的$book/@category是获取book节点的category属性,通过等于判断筛选出编程类的图书。
3. Order by子句:结果排序
Order by子句可以对查询结果进行排序,默认是升序,加上descending可以改为降序。比如查询编程类图书并按价格从高到低排序:
for $book in doc("library.xml")/library/book
where $book/@category = "编程"
order by $book/price descending
return ($book/title, $book/price)
返回结果会先展示价格高的编程类图书的标题和价格。
4. Let子句:定义中间变量
Let子句可以定义临时变量,简化复杂表达式的编写,比如我们可以先计算所有图书的平均价格,再筛选出价格高于平均价格的图书:
let $avgPrice := avg(doc("library.xml")/library/book/price)
for $book in doc("library.xml")/library/book
where $book/price > $avgPrice
return ($book/title, $book/price)
avg()是XQuery内置的聚合函数,用来计算平均值,$avgPrice就是定义的中间变量存储平均值。
常用内置函数
XQuery提供了丰富的内置函数,方便处理XML数据,常用的包括:
count():统计节点数量,比如count(doc("library.xml")/library/book)可以统计图书总数sum():计算数值总和,比如sum(doc("library.xml")/library/book/price)可以计算所有图书总价string():提取节点的文本内容,比如string($book/title)可以获取标题的纯文本contains():判断字符串是否包含指定内容,比如where contains($book/title, "XQuery")筛选标题包含XQuery的图书
完整查询示例
下面是一个完整的XQuery查询示例,需求是查询编程类图书中价格低于80元的图书标题、作者和价格,按价格升序排序:
for $book in doc("library.xml")/library/book
where $book/@category = "编程" and $book/price < 80
order by $book/price ascending
return
<result>
<title>{string($book/title)}</title>
<author>{string($book/author)}</author>
<price>{string($book/price)}</price>
</result>
这里的{}是XQuery的表达式求值语法,会把大括号内的表达式结果插入到XML节点中,最终返回的是结构化的XML结果,也可以根据需求调整为返回纯文本或者其他格式。
XQueryXML_databaseXML_queryFLWOR_expression修改时间:2026-06-22 13:27:52