INF.03 · Bazy danych i SQL
Sklep komputerowy, część 4: funkcje agregujące i GROUP BY
Właściciel sklepu rzadko prosi: „pokaż mi wszystkie produkty”. Częściej pyta: „ile mamy produktów w każdej kategorii”, „jaka jest średnia cena u każdego producenta” albo „ile warta jest zawartość magazynu”. Na takie pytania odpowiadają funkcje agregujące i grupowanie.
- około 40 minut
- COUNT · SUM · AVG · MIN · MAX
- GROUP BY · HAVING
Po tej lekcji: odpowiesz jednym zapytaniem na pytania o liczbę, sumę i średnią w grupach, a warunki na wynik grupowania zapiszesz w HAVING.
1 · Sytuacja
Pytania właściciela
Pracujesz na bazie z danymi z części 2. Zacznij od zwykłego SELECT * FROM Produkty;, żeby przypomnieć sobie dane. Potem dopisz GROUP BY do kolumny, po której grupujesz, i dopiero wtedy funkcję agregującą w SELECT. Warunek na wynik agregacji to HAVING, a nie WHERE.
Dla jednej grupy policz wynik ręcznie na kartce i porównaj z zapytaniem. To najpewniejszy sposób, żeby się sprawdzić.
2 · Do wykonania
Zadania do wykonania
-
Ile produktów jest w każdej kategorii? Pokaż nazwę kategorii i liczbę (alias
liczba_produktow).Liczby w wyniku mają się sumować do 15.Oczekiwany wynik5 wierszy -
Jaka jest średnia cena produktów każdego producenta? Pokaż nazwę producenta i średnią zaokrągloną do dwóch miejsc.Oczekiwany wynik5 wierszy
-
Jaki jest najdroższy i najtańszy produkt w sklepie? Pokaż dwie wartości: największą i najmniejszą cenę.Oczekiwany wynik1 wierszpierwszy wiersz: 5399.00 · 219.00
-
Które kategorie mają średnią cenę produktu powyżej 1000 zł? Użyj
HAVING.Oczekiwany wynik3 wiersze -
Jaka jest łączna wartość magazynu (cena razy ilość, zsumowane)?Oczekiwany wynik1 wierszpierwszy wiersz: 170063.00
-
Ilu klientów ma adres e-mail w domenie gmail.com?Oczekiwany wynik1 wierszpierwszy wiersz: 4
-
Ile produktów ma każdy producent? Posortuj od największej liczby (przy remisie po nazwie producenta).Oczekiwany wynik5 wierszypierwszy wiersz: Samsung · 6
3 · Sprawdź się
Czy Twoje wyniki się zgadzają?
To szybka kontrola, a nie ocena. Liczba wierszy jest pierwszym sygnałem, że warunek albo złączenie działa tak, jak trzeba.
4 · Zanim się pomylisz
Cztery pomyłki w agregacjach
Rozwiń każdą z nich.
Zwykła kolumna poza GROUP BY
SELECT k.nazwa, p.nazwa, COUNT(*)
FROM Produkty p JOIN Kategorie k ON p.id_kategorii = k.id_kategorii
GROUP BY k.nazwa;Błąd only_full_group_by: kolumna p.nazwa nie opisuje całej grupy, bo w kategorii są trzy różne produkty.
SELECT k.nazwa, COUNT(*) AS liczba_produktow
FROM ... GROUP BY k.nazwa;Zwykła kolumna w SELECT musi być w GROUP BY.
Funkcja agregująca w WHERE
SELECT k.nazwa FROM ...
WHERE AVG(p.cena) > 1000
GROUP BY k.nazwa;Błąd Invalid use of group function. W chwili działania WHERE grup jeszcze nie ma.
GROUP BY k.nazwa
HAVING AVG(p.cena) > 1000;Warunek na wynik agregacji piszesz w HAVING.
HAVING COUNT(*) > 3 przy trzech produktach w każdej kategorii
GROUP BY id_kategorii
HAVING COUNT(*) > 3;Pusty wynik, bo w każdej kategorii jest dokładnie 3 produkty. To poprawny wynik, tylko inny niż się spodziewałeś.
HAVING COUNT(*) >= 3;Sprawdź granicę: „więcej niż 3” a „co najmniej 3”.
COUNT(kolumna) zamiast COUNT(*)
SELECT COUNT(telefon) FROM Klienci;Wynik pomija klientów bez telefonu (NULL). Gdy chcesz policzyć klientów, dostajesz za mało.
SELECT COUNT(*) FROM Klienci;COUNT(*) liczy wiersze, a COUNT(kolumna) tylko wartości niepuste.
5 · Sprawdź sam siebie
Zanim oddasz pracę
Ta lista odpowiada temu, co sprawdza komisja egzaminacyjna: poprawną bazę, poprawne wyniki i dokumentację.
Podsumowanie
Co warto zapamiętać
- Funkcje agregujące liczą w grupach, a
GROUP BYtworzy te grupy. WHEREodrzuca wiersze przed grupowaniem,HAVINGodrzuca grupy po policzeniu.- Sumy z grup powinny dawać wynik całkowity.
COUNT(*)liczy wiersze, aCOUNT(kolumna)pomija NULL.
Dalej na swoim koncie
Rozgrzewki, quiz i zadania są w biurku ucznia.
Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.
Zaloguj się →