数据库专题--XQuery语句

发布时间 2023-12-27 23:11:52作者: 清澈的澈

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>