Dotazovací jazyk XQuery (29. 3. / 14. 4.)
- obdoba SQL pro XML databáze
- v základu XPath, jednoduchý dotaz např.: doc('test')/people/person[@id='2']
- online: www.xpathtester.com/xquery + pokusný XML soubor
- GUI -BaseX
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ů.