302 5. JĘZYK BA7. DANYCH SOL
Przy zachowaniu podanej konwencji nazywania atrybutów z warunku klauzule WHERE powstaje następujący warunek wy boru: Ai = A6 i A, < As. Atrybuty A\ i As tworzą listę rzutu.
A zatem całe zapytanie można w algebrze relacji zapisać w następujący sposób:
Ra\. yfs(P^<2 = At and A\ < As (fito (Au a2, A*. ^(Gwiazda) x At, At,
/ig)(Gwiazda)))
□
Często może pojawić się konieczność połączenia relacji przez zastosowanie operatorów algebry relacji: sumy, przecięcia lub różnicy. Jeśli w wyniku zapytań $QL powstają relacje o takich samych zbiorach atrybutów, to można do wyników tych zapytań stosować operatory, które odpowiadają teo-riomnogościowym operatorom algebry relacji. W języku SQL do oznaczenia tych operatorów używa się odpowiednio słów: UNION (dla u ), INTERSECT (dla n) i EXCEPT (dla -). Słowa, które oznaczają działania dwaiargumentowe, są umieszczane między zapytaniami, których wyniki mają być argumentami działań, a zapytania należy ujmować wr nawiasy okrągłe.
PRZYKŁAD 5.14
Przypuśćmy, że w wyniku zapytania mają zostać umieszczone nazwiska wszystkich gwiazd filmowych płci żeńskiej oraz ich adresy, jeśli te gwiazdy są również dyrektorami wytwórni filmowych, których wartość przekracza 10 000 000 $. Na rysunku 5.3 zostało zapisane zapytanie, w wyniku którego otrzyma się powyższe dane, jeśli użyjemy relacji o następujących schematach:
Gwiazda (nazwisko, adres, płeć, dataUrodzenia)
FilmDyr(nazwisko, adres, cert#, cenaSieci)
W wierszach od 1) do 3) zapisano zapylanie o nazwiska i adresy wszystkich gwiazd filmowych płci żeńskiej.
1) (SELECT na z. w i s ko, adres
2) FROM GwiazdaFilmowa
3) WHERE płeć = 'K')
4) INTERSECT
5) (SELECT nazwisko, adres
6) FROM FilmDyr
7) WHERE cenaSieci > 10000000);
RYSUNEK 5.3
Przecięcie zbioru gwiazd filmowych kobiet z bogatymi dyrektorami produkcji
Z kolei zapytanie przedstawione w wierszach od 5) do 7) służy do otrzymania zbioru nazwisk i adresów wszystkich „bogatych” dyrektorów wytwórni filmowych. którzyr posiadają sieci warte ponad 10 000 000 S. Ponieważ schematy relacji wynikowych w obu przypadkach są takie same, więc można wykonać działanie przecięcia, którego operator w idnieje w wierszu 4).
□
Czytelny zapis zapytań w języku SQL
Na ogół zapytania w języku SQL zapisuje się w ten sposób, że każde ważne słowo kluczowe, takie jak “ROM lub WHERE, rozpoczyna nowy wiersz. Dzięki temu struktura zapytania jest widoczna na pierwszy rzut oka. Czasami jednak, gdy zapytanie lub podzapytanic jest bardzo krótkie, wówczas zapisuje się je w jednym wierszu, jak zrobiono to w przykładzie 5.15. Również w tym przypadku zapis okazuje się czytelny.
PRZYKŁAD 5.15
Podobnie jak w poprzednim przy kładzie tworzymy różnicę dwóch zbiorów osób, które są relacjami otrzymanymi w wyniku dwóch zapytań. Poniższe zapytanie służy do określenia takiej relacji, której schemat tworzą dwa atrybuty osoby: nazwisko oraz adres, a do której należą te osoby, które są gwjazdami filmowymi, ale nic są dyrektorami wytwórni:
(SEŁF.CT nazwisko, adres FROM Gwiazda)
EXCEPT
(SELECT nazwisko, adres FROM FilmDyr);
W przedstawionych dwóch przykładach przypadkiem tak się zdarzyło, że w-obu relacjach występowały' takie same atrybuty. Jeśli jednak tak nie jest, a trzeba wykonać działanie na wspólnych atrybutach, to można skorzystać z przemianowania, podobnie jak to robiliśmy w przykładzie 5.3.
□
PRZYKŁAD 5.16
Załóżmy, że w wyniku zapytania ma powstać zbiór tytułów i lat produkcji tych filmów', które albo należą do relacji Film, albo do relacji GwiazdyW, czyli relacji o następujących schematach:
Filmttyruł, rok, długość, czyKclor, nazwaStudia, pro-ducer.tC#)
GwiazdyW(tytułFilmu, rckrilmu, nazwiskoGwiazdy)
W przypadku idealnym zbiory filmów w obu relacjach pokrywają się, ale w praktyce często zdarza się, że tak nic jest: na przykład film został zapisany w bazie, ale jego aktorów nie podano, albo na odwrót istnieje krotka w relacji