J 18 5. JEŻYK BAZ DANYCH SOL
Zauważmy, że w tym zapytaniu wcale nie ma klauzuli WHERE, a zatem słowo kluczowe WHERE nic występuje. Zapylanie dotyczy kolumny cenaSieci z relacji:
FilmDyr(nazwisko, adres, cert#, cenaSieci)
Wartości występujące w tej kolumnie (także duplikat}) są sumowane, a następnie suma jest dzielona przez liczbę krotek. Jeśli w relacji nie ma powtórzeń, to zgodnie z oczekiwaniami powstaje średnia cena sieci wszystkich producentów. Jednakże, jeśli pewne krotki powtarzają się n razy, to cena jednej sieci jest doliczana do sumy w iele razy, co może zaburzać wartość średniej.
□
PRZYKIAD 5.23 Zapytanie
SELECT COUNT(*)
FROM FilmDyr;
służ> do obliczenia liczby krotek w relacji FilmDyr. Jeśli założymy, że nazwisko jesl kluczem w tej relacji oraz że nic występują w niej powtórzenia, jest to równoznaczne z określeniem liczby prezesów, którzy w ystępują w bazie danych.
Podanie jako argumentu * jest charakterystyczne dla operatora COUNT, żaden inny agregat (operator agregowania) nie ma zastosowania do *. Wszystkie pozostałe bowiem tracą sens, jeśli nic poda się nazwy kolumny, na której wartościach mają działać.
Jeśli zamierzamy uniknąć zliczania powtarzających się krotek, to możemy zliczać tylko atrybut nazwisko i zastosować słowo kluczowe DISTINCT:
SELF.CT COUNT ( DISTINCT nazwisko)
FROM FilmDyr;
Jeżeli nazwisko nie jest kluczem (tzn. dw ie różne krotki dotyczą tego samego prezesa lub w bazie występuje dwóch prezesów- o takim samym nazwisku), to w wyniku powyższego zapytania takie nazw isko zostanie policzone tylko jeden raz.
□
Często zdarza się, że nic wystarcza proste zagregowanie całej kolumny, a trzeba rozważać krotki relacji wr grupach, które zależą od wartości z. innych kolumn. Na przykład potrzeba obliczyć, ile w sumie filmów, w czasie ich trwania w minutach, wyprodukow ały poszczególne studia. Ażeby to policzyć, trzeba krotki relacji Film pogrupować według studia producenta, a następnie w każdej grupie określić sumę składowych atrybutu długość. W wyniku ma powstać tabela, która przedstawia, ile minut taśmy wyprodukował}' poszczególne studia; może ona mieć na przykład następującą postać:
studio |
SUM(długość) |
Disney |
12345 |
MGM |
54321 |
. . . |
. . . |
W celu utworzenia takiej tabeli korzysta się z klauzuli GROUP BY, którą zapisuje się po klauzuli WHERE. Po słowie kluczowym GROUP by występuje lista atrybutów grupujących. W najprostszym przypadku w klauzuli FROM wy stępuje tylko jedna relacja i krotki tej relacji mają być grupowane według wartości atrybutów grupujących. Każdy z agregatów, który występuje wówczas w klauzuli SELECT, stosuje się do poszczególnych grup, a nie do całych kolumn, jak to występowało uprzednio.
PRZYKŁAD 5.24
Zapytanie powodujące obliczenie długości wszystkich filmów wyprodukowanych przez poszczególne studia, do którego dane pochodzą z relacji:
Fili?.(tytuł, rok, długość, czyKclor, nazwaStudia, pro-ducentC#)
można wyrazić w SQL w następujący sposób:
SELECT nazwaStudia, SUM(długość)
FROM Film
GROUP BY nazwaStudia;
Można założyć, że krotki w relacji Film są uporządkowane i wszystkie filmy ze studia Disneya znajdują się obok siebie, filmy wyprodukowane w MGM są obok siebie itd., tak jak przedstawiono to na rys. 5.9. Oblicza się sumy składowych atrybutu długość w poszczególnych grupach i dla każdej z nich drukuje się nazwę studia oraz wartość obliczonej sumy.
□
nazwa Studia | ||
Disney Disney Disney | ||
MGM MGM MGM | ||
O O O |
RYSUNEK 5.9
Relacja z podziałem na grupy