J u 5. JIJ7.YK BAZ DANYCH SOL
nek zapisany w klauzuli WHfclRE decyduje o tym, czy krotkę rozpatrywaną w zewnętrznym zapytaniu należy dołączyć do wyniku, czy nic.
Warunek z wiersza 3) jest spełniony wówczas, gdy został w bazie umieszczony pewien film o takim samym tytule jak stary, film, ale którego rok produkcji jest późniejszy niż rok produkcji zapisany w krotce będącej bieżącą wartością zmiennej Stary. Warunek nie jest spełniony tylko wtedy, kiedy rok produkcji w krotce stary jest ostatnim rokiem produkcji filmu o danym tytule. A zatem zapytanie zapisane w w ierszach od 1) do 3) generuje tytuł o jeden raz mniej, niż jest on zapisany w relacji film. Czyli film, którego tytuł pojaw ia się dwa razy, zostanie dołączony do wyniku jeden raz, a film, którego tytuł jest zapisany trzy razy, w wyniku wystąpi dwa razy itd\
□
Przy tworzeniu zapytań skorelowanych warto pamiętać o regułach zakresu obowiązywania nazw. W zasadzie nazwa atrybutu, która występuje wr podzapytaniu powinna pochodzić ze schematu relacji, która została umieszczona w klauzuli FROM w tym podzapytaniu pod nazwą pewnej zmiennej kratkowej. Jeśli tak nie jest, to sprawdza się podzapytanic bezpośrednio nadrzędne, potem następne itd. Na przykład na rys. 5.8 rok wymieniony w wierszu 4) rok oraz tytuł w wierszu 6) odnoszą się do krotek pobieranych z kopii relacji Film, która jest zdefiniowana w wierszu 5), to jest tej kopii relacji Film, której dotyczy zapytanie zapisane w wierszach od 4) do 6).
Możemy jednak zmienić znaczenie nazwy atrybutu, jeśli poprzedzimy ją nazwą relacji oraz kropką. Dlatego właśnie wprowadziliśmy synonim Sta rydla relacji Film wf zapytaniu zewnętrznym, a do atrybutu tytuł odwoływaliśmy się w wierszu 6) poprzez stary.tytuł. Zauważmy, że gdyby w wierszach 2) i 5) występowały różne relacje, nie trzeba by było wprowadzać alia-sów. W podzapytaniu można by wówczas korzystać bezpośrednio z nazw atrybutów relacji, które byłyby wymienione w wierszu 2).
Ćwiczenie 5.3.1. Posługując się następującym schematem bazy danych z ćwic/.e-nia4.1.1:
Produkt (producent, model, typ)
PC(model, szybkość, ram, hd, cd, cena)
Laptop(model, szybkość, ram, hd, ekran, cena)
Drukarka(model, kolor, typ, cena)
' W tym przykładzie po raz pierwszy można zaobserwować istotną różnicę między relacjami w algebrze relacji a relacjami w SQL. Wszystkie bowiem relacje w SQL mogą zawierać powtórzenia, tzn. relacje w SQL są wielozbiorami, a nic zbiorami. Powtórzenia mogą się pojawiać podczas przetwarzania zapytań SQL w wiciu sytuacjach. To zagadnienie zostanie szerzej omówione w podrozdziale 5.4.
należy zapisać w języku SQL zapytania zdefiniowane poniżej. W każdym zapytaniu powinno wystąpić co najmniej jedno podzapytanie i trzeba przedstawić co najmniej dwie wersje odpowiedzi (korzystając z różnych zestawów' operatorów SXISTS, IN, ALI. oraz ANY).
*a) Wyszukać wszystkich producentów PC o częstotliwości zegara co najmniej 160.
b) Wyszukać drukarki o najwyższej cenie.
!c) Wyszukać laptopy o częstotliwości zegara mniejszej niż częstotliwość zegara w którymkolwiek PC.
!d) Podać numery modeli produktów' (PC, laptopów i drukarek) z najwyższymi cenami.
!e) Znaleźć producenta najtańszej drukarki kolorowej.
!!f) Znaleźć producenta dnikarki oraz PC z najszybszym procesorem spośród tych wszystkich PC, które mają najmniej RAM.
Ćwiczenie 5.3.2. Posługując się następującym schematem bazy danych z ćwiczenia 4.1.3:
Klasy (klasa, typ, kraj, liczbaDział, działo, wyporność) Okręt (nazwa, klasa, wodowanie)
Bitwa (nazwa, data)
Rezultat (okręt, bitwa, wynik)
nalety zapisać w języku SQL zapytania zdefiniowane poniżej. W każdym zapytaniu powinno wystąpić co najmniej jedno podzapytanie i trzeba przedstawić co najmniej dwie wrersje odpowiedzi (korzystając z różnych zestawów' operatorów' ex:sts, IN, A.1L oraz ANY).
a) Wyszukać te kraje, których okręty mają najwięcej dział.
*!b) Wyszukać klasy tych okrętów, w których co najmniej jeden został zatopiony w czasie bitwy.
c) Wyszukać nazwy tych okrętów', które mają działa 16-calowe.
d) Wyszukać bitwy, w których uczestniczyły okręty z klasy Kongo.
!!c) Podać nazwy tych okrętów, które mają najwięcej dział danego kalibru.
JĆwiczenie 5.3.3. Należy zapisać zapytanie z rys. 5.8 w postaci nie zawierającej podzapytań.
JĆwiczenie 5.3.4. Rozważmy wyrażenie algebry relacji 7r/(R, txi R2 cx ... x R„), gdzie na liście L występują pewne atrybuty z relacji R:. Należy wykazać, że wyrażenie o takiej postaci można zapisać w' SQL, korzystając tylko z mechanizmu podzapytań. Mówiąc dokładniej: należy zapisać równoważne wyrażenie w' SQL, w którym w' żadnej klauzuli WHERE nie występuje więcej niż jedna zmienna krotkow'a.
JĆwiczenie 5.3.5. Poniższe zapytania należy zapisać, nie stosując operatorów różnicy ani przecięcia:
*a) Zapytanie definiujące przecięcie z rys. 5.3.
b) Zapytanie definiujące różnicę z przykładu 5.15.