492 8. ZORIENTOWANE OBIEKTOWO JĘZYKI ZAPYTAŃ
lect-from-whcre; przedstawiono ją na rys. 8.9. W wierszach od 3) do 9) szuka się zbioru wszystkich filmów, w których występuje Harrison Ford, a w wierszach od 5) do 7) szuka się wszystkich filmów', które nie były produkowane w studio Disneya. Operator F.XCEPT w wderszu 4) służy' do obliczenia różnicy tych dwóch zbiorów.
□
1) (SELECT DISTINCT m
2) FROM Filmy m, m.gwiazda s
3) WHERE s.nazwisko = „Harrison Ford")
4) EXCEPT
5} (SELECT D1STINCT m
6} FROM Filmy m
7) WHERE m.nalcżyDo.nazwa = „Disney")
RYSUNEK 8 9
Zapytanie, w którym korzysta się z różnicy dwóch zbiorów
Należy zwrócić uwagę na słowo kluczowe DISTINCT w wierszach 1) i 5) na rys. 8.9. Jego użycie powoduje, że wyniki obu zapytań są zbiorami; gdyby słowo DISTINCT nie występowało, to wynik byłby wielozbiorem. W języku OQL operatory UNION, INTERSECTTON i EXCEPT działają zarówno na wielozbiorach, jak i na zbiorach. Gdy oba argumenty' są zbiorami, to wr wyniku też powstaje zbiór.
Jednakże, jeśli oba argumenty są wielozbiorami, albo tylko jeden z nich jest wielozbiorem, a drugi jest zbiorem, to operator jest używany w znaczeniu wielozbiorów. Przypomnijmy tu, że w wielozbiorze ta sama wartość może występow-ać dowolnie w iele razy, była o tym mowa w p. 4.6.2. Zasady działania na wielozbiorach są następujące. Załóżmy, że B\ oraz B2 są dwoma wielozbiorami, a x jest elementem, który występuje n\ razy w /?, oraz n2 razy w B2. Oba, zarów no m, jak i n2 mogą być zerem.
• W B\V B2 x występuje «i+ n2 razy.
• W Z?i n B2 x występuje min(«i, n2) razy.
• W B\-B2 x występuje
1. Jeśli <■ n2, to 0 razy.
2. Jeśli /i\ > n2, toni- n2 razy.
W naszym konkretnym zapytaniu z ry s. 8.9 film może wystąpić w wyniku podzapytania tylko jeden raz albo wcale, a więc wynik nie zależy od użycia słowa DISTINCT. Jednakże ty p wyniku jest inny. Gdy korzysta się z D7-STINCT, to typem wyniku jest set<Film>, jeśli opuścimy DISTINCT w jednym albo w obu miejscach, to wynik jest typem Bag<Fi irr.>.
Ćwiczenie 8.3.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 zapylania:
*a) Wyszukać wszystkich producentów, którzy wytwarzają zarówno PC, jak i drukarki.
*b) Wyszukać tych producentów komputerów PC, którzy wytwarzają PC z co najwyżej 2 gigabajtami dysku twardego.
c) Wyszukać tych producentów PC, którzy nie wytwarzają laptopów.
*d) Znaleźć średnią szybkość PC.
*e) Dla każdej szybkości CD podać średnią wielkość pamięci RAM w PC.
!f) Wyszukać tych producentów, którzy wytwarzają jakieś produkty' z co najmniej 16 MB RAM, a także produkty-, które kosztują co najmniej 1000 S.
!!g) Dla każdego producenta, który' wytwarza PC ze średnią szybkością co najmniej 150, należy odszukać największą oferowaną przez nich w PC wielkość RAM.
Ćwiczenie 8.3.2. Korzystając zc schematu ODL utworzonego w ćwiczeniu 8.1.2 oraz rys. 8.3, należy zapisać w języku OQL następujące zapytania:
a) Wyszukać te klasy okrętów, w których wszystkie okręty były wodowane przed rokiem 1919.
b) Określić największą wyporność w każdej klasie.
!c)Dla każdego kalibru działa określić rok wodowania pierwszego wodowanego okrętu z takim działem.
*! !d) Dla każdej klasy okrętów, w której chociaż jeden okręt był wodowany przed rokiem 1919, określić, ile okrętów w tej klasie zatonęło podczas bitew.
!e) Określić średnią liczbę okrętów w klasie.
!ł) Znaleźć średnią wyporność okrętu
!!g) Wyszukać te bitwy (obiekty, a nie nazwy), w których uczestniczy'! chociażby jeden okręt brytyjski, a w której zatonęły' co najmniej dwa okręty.
Ćwiczenie 8.3.3. W przykładzie 8.11 wspominaliśmy, że w wyniku zapytania OQL z rys. 8.6 mogą zostać umieszczone takie gwiazdy, które wcale nie występowały' w żadnymi filmie, a zatem „technicznie” występowały „tylko w filmach Disneya”. Należy tak zapisać zapytanie, aby w wyniku były umieszczane tylko te gwiazdy, które występowały już w filmach, ale były to tylko filmy Disneya.
W bieżącym rozdziale dowiemy się. w jaki sposób język OQL łączy się z językiem podstawowym, przy czym w naszym przypadku funkcje języka podstawowego będzie pełnił język C++, pomimo że w pewnych systemach te same funkcje pełnią inne języki programowania.