8. ZORIENTOWANE OBIEKTOWO JŁ-ZYKI ZAPYTAŃ
Zajmijmy się teraz klauzulą SELECT. Dla każdej struktury, która należy' do zbioru powstałego jako wynik klauzuli GROUP BY, tworzymy nową strukturę, która jest wiclozbiorem wyniku zapytania. Pierwsza składowa to std, tzn. nazwą pola jest std, a jego wartością jest wartość pola sta struktur}' wynikowej GROUP BY. Druga składowa powstaje w sposób analogiczny i zawiera pole r oraz wartość pola r z wyniku GROUP BY.
Trzecia składowa w każdej strukturze wyjściowej ma postać następującą:
SUM(SELECT p.m.długość FROM partition p)
Zwróćmy tu najpierw uwragę na fakt, że zmienna p przebiega elementy pola partition struktury wynikowej Group by. Każda wartość p ma postać Struct (m: o), gdzie o jest obiektem typu film. A zatem wyrażenie p.m odnosi się do obiektu o. Stąd też p.m.długość oznacza składową długość obiektu klasy Film.
W związku z tym zapytanie select-from-where tworzy wielozbiory długości filmów' w poszczególnych grupach. Zatem, jeśli na przykład wartością std jest „Disney", a wartością r - 1990, to wynikiem klauzuli select-from jest wiclozbiór długości filmów wyprodukowanych przez Disneya w 1990 roku. Po zastosowaniu do tego wielozbioru operatora Sum otrzymamy sumę wszystkich długości filmów należących do tej grupy. A więc jedna ze struktur wielozbioru wyjściowego ma następującą postać:
Struct(std: „Disney", r: 1990, sumaDługości: 1234)
gdzie 1234 jest liczbą, która określa sumę długości wszystkich filmów Disneya wyprodukowanych w 1990 roku.
□
Jeśli w klauzuli FROM występuje więcej niż jedna zmienna, to podana interpretacja wymaga kilku modyfikacji, ale podstawowe zasady są takie same jak przy opisie przy padku z jedną zmienną. Załóżmy więc, że w klauzuli from występują następujące zmienne: x]y x2,.... xk. Wówczas:
1. Wszystkie zmienne x\y x2y ..., xk mogą występować w' wyrażeniach e-,, e2y..., e„ klauzuli GROUP BY.
2. Pola w strukturach należących do wielozbioru, który jest wartością pola partition, nazywają się: x\, x2,xk
3. Załóżmy, żc /j, i2...., /* są kolejnymi wartościami zmiennych xh x2,..., xk, które spełniają klauzulę WKERE. Wówczas w zbiorze wynikowym klauzuli GROUP BY istnieje struktura o następującej postaci:
Strucc(/i: ej Oj, i2>..., /*),e„(iu i2y..., /*), partition:P)
gdzie P jest strukturą postaci:
Struct(*,: ii, x2: i2,..., xk\ ik)
Po klauzuli GROUP by w języku OQL może występować jeszcze klai żula HAVING, której znaczenie jest takie jak klauzuli HAvING w języku SQ1 Zatem klauzula postaci:
HAVING <warunek>
służy do usunięcia pewnych grup utworzonych w klauzuli GROUP by. War nek dotyczy wartości pola partirior. w poszczególnych strukturach wynil GROUP 3Y. Jeśli warunek jest spełniony, to struktura zostaje dołączona c wyniku dla przetworzenia zgodnego z opisem zamieszczonym w p. 8.3. Jeśli jednak warunek nie jest spełniony, to lej struktury nic przetwarza s dalej.
SELECT std, r, sumaDługości: SUM{SELECT p.m.długość
FROM partition p)
FROM Filmy m
GROUP BY std: m.studio, r: m.rok
HAVING MAX (SELECT p.m.długość FROM partition p) > 12 RYSUNEK 8.8
Ograniczenie rozważanych grup PRZYKŁAD 8.14
Powtórzmy teraz przykład 8.13, ale tym razem zapytajmy o sumę długoś filmów wyprodukowanych tylko w tych studiach, które w każdym roku w produkowały co najmniej jeden film trwający dłużej niż 120 minut. Zapytań zamieszczone na rys. 8.8 rozwiązuje to zadanie. Zauważmy, że w klauzi HAVING użyliśmy tego samego zapytania, które występuje w klauzuli s LECT, a służy do uzyskania wielozbioru długości filmów w danym studi wdanym roku. W klauzuli HAVING maksymalną z tych wartości porównuj my z wartością 120.
Dla dwóch obiektów typu zbiór lub wielozbiór można użyć operatorć sumowania, przecięcia lub różnicy. Te operatory' w języku OQL są repreze towane tak samo jak w języku SQL, odpowiednio słowami kluczowyi
UNION, INTERSECTION i EXCEPT.
PRZYKŁAD 8.15
Zbiór wszystkich filmów z udziałem Harrisona Forda, które nie były prod kowane w studio Disneya, można otrzymać jako różnicę dwóch klauzul $