Seminární skupina 5, 6, 9, 10 PB138

Dotazovací jazyk XQuery (29. 3. / 14. 4.)

FLWOR

  • FOR, RETURN
  • for $p in /people/person return $p (x)

    for $p in /people/person/name return $p (x)

  • zobrazení části dokumentu, formát výstupu

for $p in /people/person return $p/name  (x)

for $p in /people/person[@id='2'] return $p/name/text() (x)

for $p in /people/person[@id='2'] return <jmeno>{$p/name/text()}</jmeno> (x)

  • LET, přiřazení

 

let $persons := /people/person
for $p in $persons return $p/name 
(x)

 

let $id := '2'
let $persons := /people/person
for $p in $persons[@id=$id] return $p/name 
(x)

  • WHERE, podmínky

for $p in /people/person where contains($p/name, 'Pav') return $p/name  (x)

for $p in /people/person where count($p/cars/car)>0 return <zaznam><jmeno>{$p/name/text()}</jmeno><prijmeni>{$p/surname/text()}</prijmeni><pocet>{count($p/cars/car)}</pocet></zaznam>  (x)

for $p in /people/person let $c := $p/cars/car where $c/year < 2000 return <zaznam><prijmeni>{$p/surname/text()}</prijmeni>{$c/type}</zaznam>  (x)

  • ORDER, řazení

for $p in /people/person order by $p/surname descending return $p/surname  (x)

 

  • hodnota atributů - data($p/@id)
  • ​pozor, zrada - vícenasobné elementy, př. note se opakuje v jednom záznamu víckrát. Dotaz, který vás jako první napadne, nebude fungovat.
  • for $p in /people/person where contains($p/note, 'pozn') return $p/note (x)
  • správné řešení je zeptat se "hele, a nemáte tam note, který by splňoval tuhle podmínku?"
  •  for $p in /people/person where some $n in $p/note satisfies contains(upper-case($n), upper-case('pozn')) return <r><prijmeni>{$p/surname/text()}</prijmeni>{$p/note}</r>  (x)
     
  • Úloha: Napište dotaz, který vypíše SPZ aut Škoda, která jsou starší než 1998.
  • Úloha: Vypište id a plat lidí, kteří nemají auto.
  • Úloha: Vypište součet platů.