首页 > 数据库 >数据库专题--XQuery语句

数据库专题--XQuery语句

时间:2023-12-27 23:11:06浏览次数:40  
标签:语句 xml return -- doc price XQuery book bookstore

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>

标签:语句,xml,return,--,doc,price,XQuery,book,bookstore
From: https://www.cnblogs.com/lmc7/p/17931659.html

相关文章

  • c++调用c#
    c++调用c#dll(2种方式,com组件和clr工程)_c++调用c#dll-CSDN博客C++调用C#总结_clrcreateinstance-CSDN博客 以下C#的字符串和std:string之间互转:stringClr字符串转Cpp(System::String^strClr){constchar*chars=(constchar*)(System::Runtime::InteropServices::Mar......
  • 内置组件-Transition
    介绍<Transition>是一个内置组件,这意味着它在任意别的组件中都可以被使用,无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发:由v-if所触发的切换由v-show所触发的切换由特殊元素切换的动态组件改变特殊......
  • GOF23--23种设计模式(三)
    一.桥接模式Java中的桥接模式(BridgePattern)是一种结构性设计模式,它将抽象部分和实现部分分离,使它们可以独立变化,同时通过桥接对象将它们连接起来。这种模式将抽象与其实现解耦,使得抽象和实现可以独立变化。抽象和它的实现通过一个桥接类进行连接,使得它们可以各自独立地变化。......
  • Reformer 模型 - 突破语言建模的极限
    Reformer如何在不到8GB的内存上训练50万个词元Kitaev、Kaiser等人于20202年引入的Reformer模型是迄今为止长序列建模领域内存效率最高的transformer模型之一。最近,人们对长序列建模的兴趣激增,仅今年一年,就涌现出了大量的工作,如Beltagy等人的工作(2020)、Roy等......
  • 12.27阅读笔记《软件需求分析》
    许多工程项目不能按时完成或者最后导致失败的一个很大的原因就是弄不清需求是什么,不能准确理解客户的需求意图,所以前期做好需求调研是一件非常重要的工作,是一件与系统代码开发占有同等比重的工作。读这本书的同时,要注意实践过程,不必非得要从一个新项目开始应用,可以找一个以前......
  • Unreal入门,开关04,蓝图通讯的几种方式(总结)
    1.直接调用,一开始做的开关就是这种方式,在地图编辑的时候给开关对象设置好关联的灯的引用,触发的时候直接调用灯提供的开关函数即可1.1给ActorSwitch添加一个ObjectReference成员1.2在地图编辑器中初始化这个成员,关联到ActorLight1.3在Overlap事件中通过ActorLight的引......
  • 2023.12.26——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.软件案例分析明日计划:学习......
  • 内置组件-TransitionGroup
    介绍<TransitionGroup>是一个内置组件,用于对v-for列表中的元素或组件的插入、移除和顺序改变添加动画效果。和<Transition>的区别​<TransitionGroup>支持和<Transition>基本相同的props、CSS过渡class和JavaScript钩子监听器,但有以下几点区别:默认情况下,它不......
  • spring原理(一)
    定义bean类的属性值类publicclassPropertyValue{privatefinalStringname;privatefinalObjectvalue;publicPropertyValue(Stringname,Objectvalue){this.name=name;this.value=value;}publicStringgetName()......
  • 离散数学
    计算题1:假设\(p\)表示“我喜欢数学”,\(q\)表示“我会编程”,\(r\)表示“我喜欢阅读”,\(s\)表示“我会游泳”。现有如下命题:(1)如果我不喜欢数学,那么我一定不会编程;(2)如果我会编程,那么我要么喜欢阅读,要么会游泳;(3)我不会游泳且不喜欢阅读。回答:将以上命题翻译成命题......