S. ZORIENTOWANE OBIEKTOWO JĘZYK! ZAPYTAŃ
Jeśli ma to sens, to można tworzyć wyrażenia zawierające wiele kropek. Jeśli na przykład mój Film oznacza obiekt typu Film, to wyrażenie mój-Film.należyDo oznacza obiekt typu Studio, do którego ten film należy, a z kolei wyrażenie mój Film. należyDo. nazwa oznacza tekst z nazwą tego studia.
W języku OQL można wyrażać zapytania podobnie jak w języku SQL, stosując składnię wyrażenia select-from-whcrc. Podajemy teraz przykład zapytania o rok produkcji filmu Przeminęło z wiatrem.
SELECT m.rok FROM Filmy m
WHERE m,tytuł = „Przeminęło z wiatrem";
Zauważmy, że poza podwójnym cudzysłowem przy stałej tekstowej to zapytanie jest takie jak w języku SQL. Nic jest tylko oczywiste, czy można oczekiwać, aby klauzula FROM w SQL:
FROM Filmy A3 m
była zapisana bez słowa kluczowego AS. Ale w języku OQL słowo kluczowe AS jest opcjonalne, tak jak w SQL. Wydaje sic, żc w OQL jest ono zupełnie zbędne, ponieważ tę frazę czyta się w sposób następujący: Fi Imy m oznacza, że m jest zmienną, która przyjmuje po kolei wartości obiektów z zasięgu Filmy; zasięg oznacza stan bieżący zbioru obiektów klasy Fi '.m.
Ogólna postać wyrażenia select-from-where w języku OQL składa się z następujących elementów.
1. Słowo kluczowa SELECT, po którym występuje lista wyrażeń.
2. Słowo kluczowe FROM, po którym występuje lista deklaracji zmiennych. Zmienną deklaruje się, podając:
a) Wyrażenie, którego wartość jest typu kolekcja, tzn. jest to zbiór, wielozbiór itd.
b) Opcjonalnie słowo kluczowe AS.
c) Nazwa zmiennej.
Najczęściej wyrażenie (a) stanowi zasięg pewnej klasy: np. Filmy w naszym przykładzie jest zasięgiem dla klasy Film. Zasięg w tym kontekście stanowi analogię relacji w klauzuli “ROM w języku SQL. Ale w języku OQI. można w deklaracji zmiennej użyć dowolnego wyrażenia oznaczającego kolekcję, np. może to być kolejne wyrażenie typu select-from-where. W języku SQI.2 nie ma bezpośredniej analogii tego przypadku, ale niektóre komercyjne systemy SQL dopuszczają występowanie podzapytań w klauzuli FROM.
3. Słowo kluczowe WHERE i wyrażenie logiczne. W tym wyrażeniu, podobnie jak w wyrażeniach w klauzuli SELECT, można jako operandów używać tylko stałych i zmiennych zadeklarowanych w klauzuli FROM. Operatory relacji są takie jak w języku SQL z tym, że do oznaczenia „nierów ne” stosuje się !=, a nie < >. Operatory logiczne są takie same jak w języku SQL: and, OR i not.
W wyniku podzapytania powstaje wielozbiór obiektów. Powstaje on przez rozpatrywanie wszystkich możliwych wartości zmiennych określonych w klauzuli FROM, w pętli zagnieżdżonej. Jeśli jakaś kombinacja wartości tych zmiennych spełnia wyrażenie warunkowe klauzuli WHERE, to obiekt opisany w klauzuli SELECT zostaje dołączony do wiclozbioru będącego wynikiem instrukcji select-from-where.
PRZYKŁAD 8.5
Poniżej przedstawiamy bardziej złożone zapytanie OQL, które obrazuje strukturę select-from-where.
SELECT s.nazwisko
FROM Filmy m, m.gwiazdy s
WHERE m.tytuł = „Casablanca"
Wynikiem tego zapytania mają być nazwiska gwiazd występujących w filmie Casablanca. Zwróćmy uwagę na kolejność wyrazów w klauzuli FROM. Najpierw określa się m jako dowolny obiekt klasy Film, stwierdzając, że wartość m ma być pobrana z zasięgu klasy Filmy. Następnie dla każdej wartości m oczekujemy, że s będzie obiektem klasy Gwiazda, należącym do zbioru m.gwiazdy, czyli do zbioru gwiazd filmu m. Czyli w pętli zagnieżdżonej rozpatruje się wszystkie pary (m, s), takie że m jest filmem, a s jest gwiazdą z tego filmu. Szkic przetwarzania tego wyrażenia można przedstawić w następujący sposób:
DLA każdego m należącego do Filmy WYKONUJ
DLA każdego s należącego do m.gwiazdy WYKONUJ JEŚLI m.tytuł = „Casablanca" TO
dołącz s.nazwisko do wynikowego wiclozbioru
Klauzula where zawęża nasze rozważania do tych par, w których wartość zmiennej m jest obiektem klasy Film o tytule Casablanca. Następnie w klauzuli SELECT powstaje w ielozbiór (który w tym przypadku akurat będzie po prostu zbiorem) zawierający wszystkie wartości atrybutu nazwisko obiektów' gwiazdy, które są wartościami s w tych parach (m, s> spełniają-