484 S. ZORIENTOWANE OBIEKTOWO JE2YK! ZAPYTAŃ
SELECT m FROM Filmy :r.
WHERE m.należyDo.nazwa = „Disney"
Teraz używamy tego zapylania jako podzapytania definiującego zbiór stanowiący zakres dla zmiennej d, która reprezentuje filmy Disneya.
SELECT DISTINCT S.nazwisko FROM (SELECT m
FROM Filmy m
WHERE m.należyDo.nazwa = „Disney") ci, d.gwiazdy s
Takie przedstawienie wyrażenia „znajdź wszystkie gwiazdy z filmów Disneya” nie jest bardziej zwięzłe niż to, które podano w przykładzie 8.6, a jest ono nawet pewnie mniej zwięzłe. Jednakże stanowi ono dobrą ilustrację nowych możliwości konstruowania zapytań w języku OQL. W omawianym zapylaniu w klauzuli FROM występują dwie pętle zagnieżdżone. W pierwszej z nich zmienna d przebiega zbiór filmów Disneya, który powstaje w wyniku podzapytania w klauzuli FROM. W pętli wewnętrznej zmienna s przebiega zbiór gwiazd występujących w filmie d. Zauważmy, że nie potrzeba w tym przypadku klauzuli WHERE.
□
Wynikiem wyrażenia select-from-whcre w języku OQL jest albo wielo-zbiór, albo (jeśli skorzysta się z DI5TINCT) zbiór. Można określić wynik jako listę, a jednocześnie wybrać sposób porządkowania elementów listy', jeśli na końcu instrukcji sclcct-from-where dopisze się klauzulę ORDER BY. Klauzula ORDER BY wf języku OQL jest całkiem podobna do takiej klauzuli w języku SQL. Po słowie kluczowym ORDER BY umieszcza się listę wyrażeń. Pierwsze z nich wylicza się dla każdego obiektu dopisywanego do wyniku zapylania i określa ono pozycję lego obiektu na liście wynikowej. Jeśli wartości na liście powtarzają się, to o porządku elementów decyduje drugie wyrażenie w klauzuli Order by, a potem trzecie itd.
PRZYKŁAD 8.9
Znajdźmy ponownie zbiór filmów Disneya, ale tym razem wynik ma być listą filmów uporządkowanych według czasu trwania. W przypadku filmów o równej długości obowiązuje kolejność alfabetyczna. Oto nowa postać zapylania:
SELECT m FROM Filmy m
WHERE m.należyDo.nazwa = „Disney"
ORDER 3Y m.długość, m.tytuł
Pierwsze trzy wiersze są identyczne z podzapytaniem z przykładu 8.8. W czwartym wierszu określa się, że obiekty m utworzone w wyniku zapytania select-from-whcre mają być uporządkowane według wartości atrybutu m. długość (tzn. według długości filmu), a jeśli długości są równe, to w?edług wartości atrybutu m. tytuł (tzn. według tytułu filmu). Zapytanie tw-orzy listę obiektów klasy Film. Przez domniemanie przyjmuje się, że porządek ma być rosnący, ale można jawnie określić, czy ma on być rosnący, czy malejący, umieszczając odpow iednie słowo kluczowe: ASC lub desc na końcu klauzuli ORDF.R BY, tak samo jak to się robi w języku SQL.
□
Ćwiczenie 8.2.1. Korzystając ze schematu ODL utworzonego w ćwiczeniu 8.1.1 oraz rys. 8.2, należy zapisać w języku OQL następujące zapytania:
“a) Należy określić numery' wszystkich produktów typu PC, których cena wynosi poniżej 2000 $.
b) Należy określić numery wszystkich produktów typu PC z RAM co najmniej 32 megabajty.
*!c) Należy odnaleźć wszystkich producentów, którzy' wytwarzają co najmniej dwa różne modele drukarek laserowych.
d) Należy podać zbiór par (r, h) takich, żc pewien PC lub laptop ma r megabajtów RAM i h gigabajtów dysku twardego.
e) Utworzyć listę PC (obiektów, a nie numerów- modeli) w porządku rosnącym ze względu na szybkość procesora.
!f) Utworzyć listę numerów modeli laptopów /. co najmniej 16 megabajtami RAM w porządku malejącym ze względu na wielkość ekranu.
IĆwiczenie 8.2.2. Należy powtórzyć wszystkie punkty z ćwiczenia 8.2.1, każde zapylanie zapisując w postaci zawierającej podzapytanie.
Ćwiczenie 8.2.3. Korzystając ze schematu ODL utworzonego w ćwiczeniu 8.1.2 oraz rys. 8.3, należy zapisać w języku OQL następujące zapytania:
a) Należy określić nazwy tych klas, w których okręty mają co najmniej dziewięć dział.
b) Należy odszukać wszystkie okręty (obiekty, a nie nazwy), które mają co najmniej dziewięć dział.
c) Należy' wyszukać nazwy okrętów o wyporności poniżej 30 000 ton. Wynik należy przedstawić w postaci listy uporządkowanej według roku wodowania, a w przypadku powtórzeń alfabetycznie.
d) Należy określić pary okrętów- bliźniaczych (tzn. z tej samej klasy). Należy pamiętać o tym, Ze elementami par mają być obiekty, a nie nazwy okrętów.