Agregacje (funkcje agregujące) Grupowanie danych

Transkrypt

Agregacje (funkcje agregujące) Grupowanie danych
Bazy danych (2)
Agregacje (funkcje agregujące)
Słowa kluczowe:
COUNT, SUM, MAX, MIN, AVG
Agregacje to funkcje działające na grupach danych. Można powiedzieć (niezbyt ściśle), że zwracają one pewną
wypadkową pojedynczą wartość z kilku rekordów, np. liczbę rekordów, średnią obliczoną z wartości w jakiejś
kolumnie itp.
Przykładowo:
SELECT COUNT(*) FROM Zwierzeta; -- zwraca liczbę wszystkich rekordów w tabeli Zwierzeta
SELECT AVG(wiek) FROM Zwierzeta; -- zwraca średnią wieku wszystkich zwierząt
Korzystając z agregacji możemy oczywiście stosować w zapytaniach warunek WHERE.
1. Wypisz maksymalny wiek zwierzaka z tabeli Zwierzeta.
2. Wypisz minimalny wiek zwierzaka. Kolumnę te nazwij „najmłodszy zwierzak”.
3. Wypisz średnią wieku wszystkich żółwi (w tabeli Gatunki sprawdź najpierw identyfikator gatunku).
4. Sprawdź iloma zwierzętami opiekuje się Barski (wcześniej sprawdź jego identyfikator w tabeli Opiekunowie).
5. Podaj średnią wieku wszystkich zwierząt korzystając z funkcji SUM i COUNT.
Grupowanie danych
Słowa kluczowe:
GROUP BY, HAVING
Funkcje agregujące przedstawione powyżej zwracają jedną wartość dla wszystkich rekordów. Klauzula GROUP BY
pozwala pogrupować rekordy w rozdzielne grupy, dzięki czemu możliwe będzie zastosowanie funkcji agregujących
dla każdej z tych grup oddzielnie. Przykładowo, możemy sprawdzić liczbę zwierząt, którymi opiekuje się każdy
z opiekunów:
SELECT id_opiekuna, COUNT(*) FROM Zwierzeta GROUP BY id_opiekuna;
W powyższym zapytaniu grupujemy po kolumnie id_opiekuna. Powoduje to, że wszystkie zwierzaki zostaną
podzielone na rozdzielne grupy według opiekunów, którzy nimi się opiekują. W osobnej grupie znajdą się
podopieczni opiekuna o identyfikatorze 1, w osobnej podopieczni opiekuna o identyfikatorze 2 itd. Następnie
funkcja COUNT obliczy ilość rekordów znajdujących się w każdej z tych grup. W rezultacie wynik zapytania będzie
składał się z tylu wierszu, ile jest tych grup (tzn. różnych opiekunów, a dokładniej identyfikatorów opiekunów).
GROUP BY występuje po klauzuli WHERE:
SELECT id_opiekuna,
id_opiekuna;
COUNT(*)
FROM
Zwierzeta
WHERE
wiek>=10
GROUP
BY
-- liczone będą tylko te zwierzaki, które mają więcej niż 10 lat
Klauzula HAVING jest warunkiem dla grup, występuje tylko w połączeniu z GROUP BY. Stosujemy ją tylko wtedy,
gdy chcemy nałożyć warunek na całą grupę, np. chcemy wyświetlić tylko tych opiekunów, którzy opiekują się
więcej niż trzema zwierzakami:
SELECT id_opiekuna,
COUNT(*)>3;
COUNT(*)
FROM
Zwierzeta
GROUP
BY
id_opiekuna
HAVING
Zapamiętaj! WHERE nakłada warunek na pojedyncze rekordy, zanim wejdą do grupy. HAVING nakłada warunek na
całe grupy:
SELECT id_opiekuna, COUNT(*) FROM Zwierzeta WHERE wiek>=10
GROUP BY id_opiekuna HAVING COUNT(*)>2;
-- powyższe zapytanie wyświetli tylko liczbę zwierzaków opiekunów, którzy mają pod swoją pieczą więcej niż
2 zwierzaki starsze niż 10 lat
Bazy danych (2)
Uwaga! Jeśli w zapytaniu występuje klauzula grupująca, to po słowie SELECT mogą znajdować się tylko te kolumny, po
których następuje grupowanie, wszystkie pozostałe kolumny muszą znaleźć się wewnątrz funkcji agregujących.
6. Dla każdego opiekuna (identyfikatora opiekuna) wypisz średni wiek zwierząt, znajdujących się pod jego opieką.
7. Dla każdego opiekuna wypisz minimalny i maksymalny wiek zwierząt będących pod jego opieką
8. Dla każdego rodzaju zwierząt wypisz liczbę gatunków, które znajdują się w ZOO (zastanów się najpierw z której tabeli
skorzystać, a następnie po której kolumnie wykonać grupowanie).
9. Dla każdej gatunku podaj liczbę zwierząt. Ogranicz wynik tylko do gatunków występujących w liczbie większej niż 1.
10. Dla każdego gatunku podaj liczbę zwierząt starszych niż 5 lat.
Złączenia wewnętrzne
Słowa kluczowe:
(INNER) JOIN
Złączenia pozwalają na łączenie danych z kilku tabel w jedną. Nareszcie możemy zobaczyć nazwiska opiekunów
każdego zwierzaka, a nie tylko ich identyfikatory:
SELECT imie, nazwisko FROM Zwierzeta JOIN Opiekunowie
ON id_opiekuna = Opiekunowie.id;
Zanim jednak połączymy tabele, musimy zorientować się, w jaki sposób możemy je połączyć. Łączymy tylko te
tabele, które możemy ze sobą połączyć! A możemy je połączyć wtedy, gdy w jednej tabeli znajduje się kolumna
z wartościami z innej tabeli. W powyższym przykładzie w tabeli Zwierzeta jest kolumna o nazwie id_opiekuna.
Znajdują się w niej wartości, które pochodzą z kolumny id z tabeli Opiekunowie. Dlatego w zapytaniu znajduje się
ten fragment:
(…) FROM Zwierzeta JOIN Opiekunowie ON id_opiekuna = Opiekunowie.id;
Mówi on o tym, które tabele ze sobą łączymy (Zwierzeta i Opiekunowie) oraz w jaki sposób mają być połączone
rekordy z tych tabel. Fragment ON id_opiekuna = Opiekunowie.id mówi mniej więcej coś takiego: „każdego
zwierzaka połącz z odpowiednim rekordem z tabeli Opiekunowie, ale w taki sposób, żeby zgadzały się wartości
w kolumnach id_opiekuna i id z tabeli Opiekunowie” (ponieważ w tabeli Zwierzeta też znajduje się kolumna id,
więc w zapytaniu trzeba wyraźnie zaznaczyć o które id chodzi – Opiekunowie.id oznacza „kolumna id z tabeli
Opiekunowie”).
W 99% przypadków dwie tabele będzie można połączyć tylko w jeden sposób. A więc wiedząc w jaki sposób łączą
się dwie tabele, wszystkie zapytania dotyczące tych tabel będą wyglądały podobnie, np.:
SELECT imie FROM Zwierzeta JOIN Opiekunowie ON id_opiekuna = Opiekunowie.id
WHERE nazwisko LIKE „Barski”;
-- wypisuje imiona zwierzaków opiekuna o nazwisku Barski
SELECT nazwisko, COUNT(*) FROM Zwierzeta JOIN Opiekunowie
ON id_opiekuna = Opiekunowie.id GROUP BY nazwisko;
-- wypisuje nazwiska opiekunów oraz liczbę zwierząt, którymi się opiekują (porównaj z pierwszym przykładowym
zapytaniem z części dot. grupowania danych)
11. Wypisz imiona wszystkich zwierząt oraz nazwy ich gatunków (połącz tabele Zwierzeta i Gatunki).
12. Wypisz nazwy gatunków wszystkich zwierząt, których imię zaczyna się na literę ‘N’.
13. Wypisz nazwiska wszystkich opiekunów oraz średni wiek zwierząt będących pod opieka każdego z nich.
14. Wypisz gatunki wszystkich zwierząt oraz nazwy ich rodzajów (zastanów się najpierw, które tabele połączyć i w jaki
sposób).
15. Wypisz nazwy rodzajów wszystkich zwierząt oraz liczbę różnych gatunków z każdego rodzaju (połącz te same tabele co
wcześniej i zastosuj odpowiednią klauzulę grupującą).
Bazy danych (2)
W domu
1.1. Wyświetl liczbę wszystkich rekordów z tabeli Osoby.
1.2. Wyświetl maksymalny rok otwarcia pubu.
1.3. Wyświetl sumę ceny hurtowej wszystkich piw z browaru o identyfikatorze 2.
1.4. Wyświetl średni wiek (aktualny rok - rok otwarcia) wszystkich pubów otwartych po 2000 roku.
1.5. Wypisz maksymalną, minimalną i średnią cenę piwa oraz ilość piw.
1.6. Ile piw jest droższych od 2zł?
1.7. Wyświetl liczbę wszystkich kobiet z tabeli Osoby.
1.8. Wyświetl średni wiek wszystkich mężczyzn, którzy posiadają ulubioną markę piwa.
1.9. Dla każdego browaru wypisz średnią cenę produkowanego piwa.
1.10.
Dla każdego browaru wypisz ilość produkowanych marek piwa.
1.11.
Ile każdy z browarów produkuje marek piwa tańszych niż 2zł?
1.12.
Wypisz Browary, które produkują co najmniej 7 marek piwa.
1.13.
Wyświetl identyfikatory wszystkich ulubionych piw oraz liczbę osób, które uważają to piwo za najlepsze.
1.14.
Dla każdego imienia z tabeli Osoby wypisz średni wiek ich posiadaczy.
1.15.
Wypisz imię i nazwisko piwoszy, którzy posiadają ulubione piwo, oraz nazwy ich ulubionych piw.
1.16.
Wypisz nazwy piw i odpowiadające im nazwy browarów.
1.17.
Wypisz nazwy browarów i liczbę piw należących do każdego z nich.
1.18.
Wypisz osoby, których ulubionym piwem jest Tyskie.
1.19.
Wypisz największą cenę hurtową piwa, które należy do ulubionych piw.
1.20.
Przerobić tutoriale 3 i 4 ze strony sqlzoo.net.