XQueryThe Thuong
In this lecture• Summary of XQuery• Default data type mapping(http://en.wikipedia.org/wiki/XQuery_API_for_Java)• FLWOR exp...
XQuery• Based on XPath• http://www.w3.org/TR/xquery/XQuery 2.0
FLWR ExpressionsWhat does FLWR stand forF - forL - letW - whereR - return
XQueryFind all book titles published after 1995:FOR $x IN doc ("books")/bib/bookWHERE $x/year > 1995RETURN $x/titleFOR $x ...
XQueryFor each author of a book by MorganKaufmann, list all books she published:FOR $a IN distinct-values(doc ("books.xml"...
XQueryResult:<result><author>Jones</author><title> abc </title><title> def </title></result><result><author> Smith </autho...
XQuery• FOR $x in expr -- binds $x to each elementin the list expr• LET $x = expr -- binds $x to the entire listexpr– Usef...
XQuerycount = a (aggregate) function that returns the number of elms<big_publishers>FOR $p IN distinct-values(doc ("books....
XQueryFind books whose price is larger thanaverage:LET $a=avg(doc(“books.xml")/bib/book/@price)FOR $b in doc("books.xml")/...
XQuerySummary:• FOR-LET-WHERE-RETURN = FLWRFOR/LET ClausesWHERE ClauseRETURN ClauseList of tuplesList of tuplesInstance of...
FOR v.s. LETFOR• Binds node variables  iterationLET• Binds collection variables  one value
FOR v.s. LETFOR $x IN doc ("books.xml")/bib/bookRETURN <result> $x </result>FOR $x IN doc ("books.xml")/bib/bookRETURN <re...
Collections in XQuery• Ordered and unordered collections– /bib/book/author = an ordered collection– Distinct-values(/bib/b...
Collections in XQueryWhat about collections in expressions ?• $b/@price  list of n prices• $b/@price * 0.7  list of n nu...
Sorting in XQuery<publisher_list>FOR $p IN distinct-values(doc("books.xml")//publisher)RETURN <publisher> <name> $p/text()...
Sorting in XQuery• Sorting arguments: refer to the name spaceof the RETURN clause, not the FOR clause• To sort on an eleme...
If-Then-ElseFOR $h IN //holdingRETURN <holding>$h/title,IF $h/@type = "Journal"THEN $h/editorELSE $h/author</holding> SORT...
Other Stuff in XQuery• BEFORE and AFTER– for dealing with order in the input• FILTER– deletes some edges in the result tre...
Group-By in Xquery ??• No GROUPBY currently in XQuery• A recent proposal (next)– What do YOU think ?
Group-By in Xquery ??FOR $b IN doc ("http://www.bn.com")/bib/book,$y IN $b/@yearWHERE $b/publisher="Morgan Kaufmann"RETURN...
Group-By in Xquery ??FOR $b IN doc("http://www.bn.com")/bib/book,$a IN $b/author,$y IN $b/@yearRETURN GROUPBY $a, $yIN <re...
Group-By in Xquery ??FOR $b IN doc("http://www.bn.com")/bib/book,$a IN $b/author,$y IN $b/@year,$t IN $b/title,$p IN $b/pu...
Upcoming SlideShare
Loading in...5
×

X Query for beginner

458

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
458
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "X Query for beginner"

  1. 1. XQueryThe Thuong
  2. 2. In this lecture• Summary of XQuery• Default data type mapping(http://en.wikipedia.org/wiki/XQuery_API_for_Java)• FLWOR expressions• FOR and LET expressions• Collections and sortingResourcesW3C recommendation: www.w3.org/TR/xquery/Google
  3. 3. XQuery• Based on XPath• http://www.w3.org/TR/xquery/XQuery 2.0
  4. 4. FLWR ExpressionsWhat does FLWR stand forF - forL - letW - whereR - return
  5. 5. XQueryFind all book titles published after 1995:FOR $x IN doc ("books")/bib/bookWHERE $x/year > 1995RETURN $x/titleFOR $x IN doc ("books")/bib/bookWHERE $x/year > 1995RETURN $x/titleResult:<title> abc </title><title> def </title><title> ghi </title>
  6. 6. XQueryFor each author of a book by MorganKaufmann, list all books she published:FOR $a IN distinct-values(doc ("books.xml")/bib/book[publisher=“Morgan Kaufmann”]/author)RETURN <result>$a,FOR $t IN /bib/book[author=$a]/titleRETURN $t</result>FOR $a IN distinct-values(doc ("books.xml")/bib/book[publisher=“Morgan Kaufmann”]/author)RETURN <result>$a,FOR $t IN /bib/book[author=$a]/titleRETURN $t</result>distinct = a function that eliminates duplicates
  7. 7. XQueryResult:<result><author>Jones</author><title> abc </title><title> def </title></result><result><author> Smith </author><title> ghi </title></result>
  8. 8. XQuery• FOR $x in expr -- binds $x to each elementin the list expr• LET $x = expr -- binds $x to the entire listexpr– Useful for common subexpressions and foraggregations
  9. 9. XQuerycount = a (aggregate) function that returns the number of elms<big_publishers>FOR $p IN distinct-values(doc ("books.xml")//publisher)LET $b := doc ("books.xml")/book[publisher = $p]WHERE count($b) > 100RETURN $p</big_publishers><big_publishers>FOR $p IN distinct-values(doc ("books.xml")//publisher)LET $b := doc ("books.xml")/book[publisher = $p]WHERE count($b) > 100RETURN $p</big_publishers>
  10. 10. XQueryFind books whose price is larger thanaverage:LET $a=avg(doc(“books.xml")/bib/book/@price)FOR $b in doc("books.xml")/bib/bookWHERE $b/@price > $aRETURN $bLET $a=avg(doc(“books.xml")/bib/book/@price)FOR $b in doc("books.xml")/bib/bookWHERE $b/@price > $aRETURN $b
  11. 11. XQuerySummary:• FOR-LET-WHERE-RETURN = FLWRFOR/LET ClausesWHERE ClauseRETURN ClauseList of tuplesList of tuplesInstance of Xquery data model
  12. 12. FOR v.s. LETFOR• Binds node variables  iterationLET• Binds collection variables  one value
  13. 13. FOR v.s. LETFOR $x IN doc ("books.xml")/bib/bookRETURN <result> $x </result>FOR $x IN doc ("books.xml")/bib/bookRETURN <result> $x </result>Returns:<result> <book>...</book></result><result> <book>...</book></result><result> <book>...</book></result>...LET $x := doc ("books.xml")/bib/bookRETURN <result> $x </result>LET $x := doc ("books.xml")/bib/bookRETURN <result> $x </result>Returns:<result> <book>...</book><book>...</book><book>...</book>...</result>
  14. 14. Collections in XQuery• Ordered and unordered collections– /bib/book/author = an ordered collection– Distinct-values(/bib/book/author) = an unorderedcollection• LET $a = /bib/book  $a is a collection• $b/author  a collection (several authors...)RETURN <result> $b/author </result>RETURN <result> $b/author </result>Returns:<result> <author>...</author><author>...</author><author>...</author>...</result>
  15. 15. Collections in XQueryWhat about collections in expressions ?• $b/@price  list of n prices• $b/@price * 0.7  list of n numbers• $b/@price * $b/@quantity  list of n x m numbers ??• $b/@price * ($b/@quant1 + $b/@quant2) ≠$b/@price * $b/@quant1 + $b/@price * $b/@quant2!!
  16. 16. Sorting in XQuery<publisher_list>FOR $p IN distinct-values(doc("books.xml")//publisher)RETURN <publisher> <name> $p/text() </name> ,FOR $b IN doc("books.xml")//book[publisher = $p]RETURN <book>$b/title ,$b/@price</book> SORTBY(price DESCENDING)</publisher> SORTBY(name)</publisher_list><publisher_list>FOR $p IN distinct-values(doc("books.xml")//publisher)RETURN <publisher> <name> $p/text() </name> ,FOR $b IN doc("books.xml")//book[publisher = $p]RETURN <book>$b/title ,$b/@price</book> SORTBY(price DESCENDING)</publisher> SORTBY(name)</publisher_list>
  17. 17. Sorting in XQuery• Sorting arguments: refer to the name spaceof the RETURN clause, not the FOR clause• To sort on an element you don’t want todisplay, first return it, then remove it withan additional query.
  18. 18. If-Then-ElseFOR $h IN //holdingRETURN <holding>$h/title,IF $h/@type = "Journal"THEN $h/editorELSE $h/author</holding> SORTBY (title)FOR $h IN //holdingRETURN <holding>$h/title,IF $h/@type = "Journal"THEN $h/editorELSE $h/author</holding> SORTBY (title)
  19. 19. Other Stuff in XQuery• BEFORE and AFTER– for dealing with order in the input• FILTER– deletes some edges in the result tree• Recursive functions– Currently: arbitrary recursion– Perhaps more restrictions in the future ?
  20. 20. Group-By in Xquery ??• No GROUPBY currently in XQuery• A recent proposal (next)– What do YOU think ?
  21. 21. Group-By in Xquery ??FOR $b IN doc ("http://www.bn.com")/bib/book,$y IN $b/@yearWHERE $b/publisher="Morgan Kaufmann"RETURN GROUPBY $yWHERE count($b) > 10IN <year> $y </year>FOR $b IN doc ("http://www.bn.com")/bib/book,$y IN $b/@yearWHERE $b/publisher="Morgan Kaufmann"RETURN GROUPBY $yWHERE count($b) > 10IN <year> $y </year>SELECT yearFROM BibWHERE Bib.publisher="Morgan Kaufmann"GROUPBY yearHAVING count(*) > 10SELECT yearFROM BibWHERE Bib.publisher="Morgan Kaufmann"GROUPBY yearHAVING count(*) > 10 with GROUPBYEquivalent SQL 
  22. 22. Group-By in Xquery ??FOR $b IN doc("http://www.bn.com")/bib/book,$a IN $b/author,$y IN $b/@yearRETURN GROUPBY $a, $yIN <result> $a,<year> $y </year>,<total> count($b) </total></result>FOR $b IN doc("http://www.bn.com")/bib/book,$a IN $b/author,$y IN $b/@yearRETURN GROUPBY $a, $yIN <result> $a,<year> $y </year>,<total> count($b) </total></result>FOR $Tup IN distinct-values(FOR $b IN doc("http://www.bn.com")/bib,$a IN $b/author,$y IN $b/@yearRETURN <Tup> <a> $a </a> <y> $y </y> </Tup>),$a IN $Tup/a/node(),$y IN $Tup/y/node()LET $b = doc("http://www.bn.com")/bib/book[author=$a,@year=$y]RETURN <result> $a,<year> $y </year>,<total> count($b) </total></result>FOR $Tup IN distinct-values(FOR $b IN doc("http://www.bn.com")/bib,$a IN $b/author,$y IN $b/@yearRETURN <Tup> <a> $a </a> <y> $y </y> </Tup>),$a IN $Tup/a/node(),$y IN $Tup/y/node()LET $b = doc("http://www.bn.com")/bib/book[author=$a,@year=$y]RETURN <result> $a,<year> $y </year>,<total> count($b) </total></result> with GROUPBYWithout GROUPBY 
  23. 23. Group-By in Xquery ??FOR $b IN doc("http://www.bn.com")/bib/book,$a IN $b/author,$y IN $b/@year,$t IN $b/title,$p IN $b/publisherRETURNGROUPBY $p, $yIN <result> $p,<year> $y </year>,GROUPBY $aIN <authorEntry>$a,GROUPBY $tIN $t<authorEntry></result> Nested GROUPBY’s

×