482
S ZORIENTOWANE OBIEKTOWO JĘZYKI ZAPYTAŃ
T
cych klauzulę WHERE. Te nazwiska są nazwiskami gwiazd w zbiorze mc. gwiazdy, gdzie mc oznacza obiekt reprezentujący film Casablanca.
□
Od strony technicznej zapytania, takie jak w przykładzie 8.5, tworzą w wyniku wielozbiory, a nie zbiory. Czyli w języku OQL powtórzono z języka SQL, że przez domniemanie z wyniku nie usuwa się powtórzeń, chyba że nastąpi jawne polecenie ich eliminowania. I tak samo jak w języku SQL polecenie eliminowania powtórzeń polega na umieszczeniu słowa kluczowego DISTINCT w' klauzuli SELECT.
PRZYKŁAD 8.6
Zapytajmy teraz o nazwiska gwiazd występujących w filmach Disneya. Poniższe zapytanie wypełnia to zadanie i eliminuje powtarzające się nazwiska, gdy ta sama gwiazda występuje w kilku filmach Disneya.
SELECT DISTINCT s.nazwisko
FROM Filmy m, m.gwiazdy s
WHERE m.należyDo.nazwa = „Disney"
Sposób wykonania tego zapytania jest podobny do opisanego w przykładzie 8.5. Podobnie jak tam, w dwóch zagnieżdżonych pętlach rozważa się wszystkie pary' złożone z filmu i gwiazdy z tego filmu. Teraz jednak warunkiem dla pary (m, s) jest to, że Disney jest nazwą studia, którego obiektem Studio jest m.należyDo.
□
Wyrażenie lub wyrażenia występujące w klauzuli SELECT nie muszą być zmiennymi prostymi. Mogą to być dowolne wyrażenia, także takie, które powstają w' wyniku stosowania konstruktorów typu. Na przykład można użyć konstruktora typu Struct do kilku wyrażeń, a następnie zastosować zapytanie select-from-whcrc, które tworzy zbiór lub wielozbiór struktur.
PRZYKŁAD 8.7
Chcemy teraz otrzymać zbiór par gwiazd mieszkających pod tym samym adresem. Można to uzyskać w wyniku następującego zapytania:
SELECT DISTINCT STRUCT (gwiazdal: sl, gwiazda2: s2) FROM Gwiazdy sl. Gwiazdy s2
WHERE si.adr = s2.adr AND sl.nazwisko < s2.nazwisko
Zatem będziemy rozważać wszystkie pary gwiazd sl i s2. W klauzuli WHERE sprawdza się warunek, że mają one ten sam adres. Poza tym sprawdza się warunek, że nazwisko pierwszej gwiazdy poprzedza nazwisko drugiej gwiazdy w porządku alfabetycznym, dzięki czemu unikamy tworzenia par złożonych z powtórzonego nazwiska gwiazdy oraz eliminuje się powtórzenia tej samej pary zapisanej w odwrotnym porządku.
Każda para, która spełnia oba warunki, tworzy strukturę. Typem tej struktur)'jest rekord o dw;óch polach, nazwanych gwiazda! i gwiazdaż. Oba pola są typu Gwiazda, ponieważ taki jest typ zmiennych sl i s2, których wartości są także wartościami pól. Formalnie typ tej struktury wygląda następująco:
Struct N {awiazdal: Gwiazda, gwiazda2: Gwiazda)
gdzie N jest dowolną nazwą. W wyniku zapytania powstaje zbiór struktur typu A', tzn.:
Set<Struct N{ gwiazdal: Gwiazda, gwiazda2: Gwiazda}>
Zauważmy, że typ wyniku zapytania może występować w programie OQL, ale nie można takiego typu używać jako typu atrybutu lub związku w deklaracjach ODL.
□
Niekiedy można uzy skać taki sam efekt jak w przykładzie 8.7, nie definiując jawnie typu struktury, a umieszczając po prostu listę składowych i nazw pól po słowie kluczowym SELECT. A więc pierwszy wiersz z przykładu 8.7 można zapisać jako:
SELECT ęwiszdal: sl, gwiazdaż: s2
Wyrażenie select-from-whcrc może wystąpić w każdym kontekście, który jest odpowiedni do użycia kolekcji (czyli np. zbioru). Jedyną niespodzianką może być umieszczenie podzapytania w klauzuli “ROM, gdzie kolekcję stanowiącą zakres zmiennej można tworzyć dynamicznie przez użycie wyrażenia selcct-fTom-whcre. Taką możliwość, czyli korzystanie z wyrażeń definiujących tabele w kontekstach właściwych dla nazw tabeli, zawiera także standard SQL3 i jest ona dostępna już w niektórych komercyjnych systemach SQL.
PRZYKŁAD 8.8
Powtórzmy zadanie z przykładu 8.6, w którym trzeba było określić zbiór gwiazd występujących w filmach produkcji Disneya. Najpierw tworzymy zapytanie o filmy produkowane przez Disneya: