ZSBD-2st-1.2-w10.tresc-1.4-Slajd7
XQuery "w całości" (1/2)
Przykładowe zapytanie XQuery przedstawione na slajdzie wykorzystuje wszystkie możliwe klauzule. Ich znaczenie w zapytaniu jest następujące
- Klauzula FOR wyszukuje w dokumencie zespoly.xml elementy wskazywane przez wyrażenie ścieżkowe //id_zesp. Każdy dopasowany element jest przypisywany zmiennej $d i powoduje utworzenie tzw. krotki. Klauzula FOR działa podobnie jak klauzule for w innych językach programowania wykorzystuje zmienne do iteracji po określonych wartościach.
- Dla każdego przypisania zmiennej $d klauzula LET przypisuje zmiennej $e zbiór takich elementów pracownik, które posiadają podelement id_zesp o zawartości identycznej z wartością zmiennej $d. Elementy pracownik wyszukiwane są z dokumentu o nazwie pracownicy.xml.
- W wyniku działania klauzul FOR i LET otrzymujemy tzw. strumień krotek. Liczba krotek zależy od klauzuli FOR, natomiast liczba zmiennych w krotce zależy od klauzul FOR i LET. W naszym przykładzie liczba krotek jest równa liczbie elementów id_zesp w dokumencie zespoly.xml. Każda krotka zawiera parę zmiennych $d i $e posiadających określone wcześniej wartości.
- Zadaniem klauzuli WHERE jest selekcja strumienia krotek utworzonych za pomocą klauzul FOR i LET. W naszym przykładzie klauzula WHERE filtruje ten strumień pozostawiając tylko te krotki, w których zbiór elementów pracownik przypisanych do zmiennej $e składa się, z co najmniej 10 elementów.
- Zadaniem klauzuli ORDER BY jest odpowiednie posortowanie wynikowych krotek. W powyższym przykładzie krotki zostaną posortowane wg średniej wartości elementów placa_pod znajdujących się w elementach pracownik przypisanych do zmiennej $e.
- Na zakończenie klauzula RETURN konstruuje wynik zapytania. W naszym przykładzie każda krotka za pomocą klauzuli RETURN stworzy element duzy-zespol, którego zawartością będzie kolejno: element $d (id_zesp), element liczba-pracowników którego zawartością będzie liczba będąca ewaluacją wyrażenia count($e) oraz element srednia-placa z zawartością wynikającą z wyrażenia avg($e/placa_pod)