HOO 8 ZORIENTOWANE OBIEKTOWO Jl-ZYKl ZAPYTAŃ
!e) Należy znaleźć nazwy bitew, w których zatonęły okręty z co najmniej dwóch różnych państw.
!!f) Należy podać nazwy tych wszystkich bitew, w których nie umieszczono żadnych danych o zniszczonych okrętach.
W bieżącym rozdziale przyjrzymy się jeszcze innym operatorom, obok select-from-wherc, pomocnym przy tworzeniu wyrażeń. Do tych operatorów zaliczamy kwantyfikatory logiczne - dla-każdego oraz istnieje - operatory agregowania i grupowania oraz operatory algebry zbiorów - suma, przecięcie oraz różnica.
Można sprawdzić, czy wszystkie albo co najmniej jeden element zbioru spełnia pewien warunek. Aby sprawdzić, czy wszystkie elementy zbioru S spełniają warunek C(x), gdzie * jest zmienną, używamy następującego wyrażenia OQL:
FOR ALL * IN S: C(x)
Wynik tego wyrażenia wynosi TRUE, jeśli wszystkie elementy x ze zbioru S po kolei spełniają warunek C(x), a FAL SE w przeciwnym przypadku.
Z kolei wyrażenie
EXISTS x IN S: C(x)
ma wartość TRUE, jeśli w S występuje co najmniej jeden taki element x, że warunek C(x) ma wartość TRUE, w przeciwnym razie wyrażenie przyjmuje wartość FALSE.
PRZYKŁAD 8.10
Na rysunku 8.5 przedstawiamy kolejny sposób wyrażenia zapytania „znajdź wszystkie gwiazdy filmów Disneya”. Tutaj uwagę koncentrujemy na gwieź-dzie s i pytamy, czy są takie filmy m produkcji Disneya, w których ona występuje. W wierszu 3) zapisano polecenie rozpatrzenia wszystkich filmów m ze zbioru filmów s. występuj eW, który określa zbiór tych wszystkich filmów-, w których dana gwiazda s wystąpiła. Następnie w wierszu 4) sprawdzamy, czy film m został wyprodukowany przez Disneya. Jeśli znajdzie się chociaż jeden taki film /w, to wartością wyrażenia EXISTS z wierszy 3) i 4) będzie TRUE, inaczej będzie ona równa FALSE.
□
1) SELECT s
2) FROM Gwiazdy s
3) WHERE EXISTS m IN s.WystępujeW:
4) m.należyDo.nazwa - „Disney"
RYSUNEK 8.5
Korzystanie z zapytania egzystencjalnego
1) SELECT s
2) FROM Gwiazdy s
3) WHERE FOR ALL m TN s.WystępujeW:
4) m.należyDo.nazwa = „Disney"
RYSUNEK 8.6
Korzystanie z zapylania z kwantyfikatorcm ogólnym
PRZYKŁAD 8.11
Skorzystamy teraz z operatora dia-każdego do zapisu zapytania o te gwiazc filmowe, które wystąpiły wyłącznic w filmach produkowanych przez Disney W naszym przypadku ten zbiór będzie pusty. Można do tego zapytania doi czyć jeszcze jeden warunek, żeby do tego zbioru dołączać tylko te gwiazd które wystąpiły' chociaż w jednym filmie, ale tę poprawkę pozostawimy ■ wykonania jako ćwiczenie. Zapytanie zostało przedstawione na rys. 8.6.
W języku OQL można korzystać z takich samych pięciu operator* agregowania jak w'języku SQL, tzn.: AVG, COUNT, SUM, MIN i MAX. Jedna! w języku SQL były one stosowane do poszczególnych kolumn tabi a w języku OQL te same operatory stosuje się do kolekcji, których clemei muszą być określonego typu. A więc: COUNT można stosować do dowol kolekcji, SUM oraz AVG można zastosować tylko do kolekcji typów arytr tycznych, jak np. ty p integer, a z kolei MIN i max można zastosować do lekcji elementów typu. który daje się porządkować (np. typ całkowity tekstowy).
PRZYKŁAD 8.12
Przy' wyliczaniu średniej długości filmu trzeba utworzyć wielozbiór zav rający długości wszystkich filmów. Zauważmy, że nic należy w tym pi padku tworzyć zbioru, ponieważ wówczas dwie takie same długości dw rożnych filmów zostałyby potraktowane jako jedna. Zapytanie ma nastę jącą postać:
AVG (SELECT m.dłuyość FROM Filmy m)