数据库专题--XQuery语句
XQuery 相对于 XML 的关系,等同于 SQL 相对于数据库表的关系。
XQuery 被设计用来查询 XML 数据 - 不仅仅限于 XML 文件,还包括任何可以 XML 形态呈现的数据,包括数据库。
XQuery 是用来从 XML 文档查找和提取元素及属性的语言。
这是一个 XQuery 解决实际问题的例子:
“从存储在名为 cd_catalog.xml 的 XML 文档中的 CD 集那里选取所有价格低于 10 美元的 CD 记录。”
XQuery 可用于:
- 提取信息以便在网络服务中使用
- 生成摘要报告
- 把 XML 数据转换为 XHTML
- 为获得相关信息而搜索网络文档
现有一个xml文件 books.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
打开xml文件
doc("books.xml")
选取元素
使用路径表达式选取
doc("books.xml")/bookstore/book/title
/bookstore 选取 bookstore 元素,/book 选取 bookstore 元素下的所有 book 元素,而 /title 选取每个 book 元素下的所有 title 元素
选取结果
<title lang="en">Everyday Italian</title> <title lang="en">Harry Potter</title> <title lang="en">XQuery Kick Start</title> <title lang="en">Learning XML</title>
有条件的选取
选取 bookstore 元素下的所有 book 元素,并且所选取的 book 元素下的 price 元素的值必须小于 30
doc("books.xml")/bookstore/book[price<30]
选取结果
<book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book>
使用 FLWOR 从 "books.xml" 选取节点
FLWOR 是 "For, Let, Where, Order by, Return" 的只取首字母缩写。
-
for语句把 bookstore 元素下的所有 book 元素提取到名为 $x 的变量中。
-
where 语句选取了 price 元素值大于 30 的 book 元素。
-
order by 语句定义了排序次序。将根据 title 元素进行排序。
-
return 语句规定返回什么内容。在此返回的是 title 元素。
选取 bookstore 元素下的 book 元素下所有的 title 元素,并且其中的 price 元素的值必须大于 30
for $x in doc("books.xml")/bookstore/book where $x/price>30 return $x/title
结果
<title lang="en">XQuery Kick Start</title> <title lang="en">Learning XML</title>
使用order进行排序
for $x in doc("books.xml")/bookstore/book where $x/price>30 order by $x/title return $x/title
结果
<title lang="en">Learning XML</title> <title lang="en">XQuery Kick Start</title>
结果中加入标签
则需要将查询结果用大括号括起来
for $x in doc("book.xml")/bookstore/book where $x/year = 2003 and $x/price > 40 return <result> {$x} </result>
结果
<result><book category="WEB"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book></result>
对实体属性的值进行限制
$实体[属性条件]
for $x in doc("book.xml")/bookstore/book where $x[price="39.95"] return <test>{$x/author}</test>
<bib> <vendor id="idl_2"> <name>china-pub</name> <book> <title>JAVA编程思想</title> <publisher>机械工业出版社</publisher> <year>2002</year> <author> <firstname>Bruce</firstname> <lastname>Eckel</lastname> </author> <price>99</price> </book> <book> <title>XML手册</title> <publisher>电子工业出版社</publisher> <year>2003</year> <author> <firstname>CharlesF.</firstname> <lastname>Goldfarb</lastname> </author> <price>69</price> </book> </vendor> </bib>
返回书籍的最高价格
let $maxPrice := max( for $book in doc("book.xml")/bookstore/book return $book/price ) return $maxPrice
结果
49.99
返回最低价格
let $minPrice := min( for $book in doc("book.xml")/bookstore/book return $book/price ) return $minPrice
结果
29.99
平均值
let $minPrice := avg( for $book in doc("book.xml")/bookstore/book return $book/price ) return $minPrice
结果
37.4825
22年试卷
查找该xml文档中价格最高的书,输出其title和price信息
let $maxPrice := max( for $book in doc("book.xml")/bookstore/book return xs:float($book/price) ) for $book in doc("book.xml")/bookstore/book where xs:float($book/price) = $maxPrice return <result> <title>{ $book/title }</title> <price>{ $book/price }</price> </result>
结果
<result><title><title lang="en">XQuery Kick Start</title></title><price><price>49.99</price></price></result>
输出该文档第1本书和第2本书的价钱之差
let $firstBookPrice := doc("book.xml")/bookstore/book[1]/price let $secondBookPrice := doc("book.xml")/bookstore/book[2]/price return $firstBookPrice - $secondBookPrice
结果
0.01
查找该文档中价格高于70的书,输出其title和price信息
for $x in doc("book.xml")/bookstore/book where $x/price > 70 return <result> <title>{$x/title}</title> <price>{$x/price}</price> </result>
结果
<result><title><title lang="en">Learning XML</title></title><price><price>71</price></price></result>
本文作者:清澈的澈
本文链接:https://www.cnblogs.com/lmc7/p/17931659.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步