Do zadań – funkcje agregujące i grupowanie danych.

Przypomnienie przed Zadaniami 3–6)

  1. WHERE vs HAVING
    WHERE filtruje pojedyncze wiersze przed grupowaniem.
    HAVING filtruje całe grupy już po GROUP BY i agregacjach.
    • Praktyka: warunki nieagregujące (np. konkretna kategoria/miasto) → WHERE; warunki na wynikach agregacji (np. średnia/suma/liczba) → HAVING.
  2. GROUP BY – co musi być w grupowaniu
    • Wszystkie kolumny niewyliczane agregacją powinny być w GROUP BY.
    • W MySQL zwykle warto trzymać się zasady „albo agregat, albo w GROUP BY” (nie polegaj na luźnej tolerancji).
  3. ORDER BY po aliasie
    • Po wyliczeniu agregatu nadaj alias i sortuj po nim, np. AVG(p.cena) AS srednia_cena … ORDER BY srednia_cena DESC. To czytelne i unika powtórzeń.
  4. DISTINCT i COUNT(DISTINCT …)
    DISTINCT usuwa duplikaty.
    COUNT(DISTINCT kolumna) liczy różne wartości w grupie (przyda się np. przy zliczaniu różnych produktów/kategorii na klienta).
  5. JOIN i filtrowanie dat
    • Do łączenia tabel używaj jawnych JOIN z warunkami ON.
    • Zakres dat: w naszym case wystarczy BETWEEN '2025-09-01' AND '2025-09-30' (daty są dzienne, więc zakres jest domknięty na obu końcach).
  6. Anti-join (rekordy „bez powiązań”)
    • Wzorzec: LEFT JOIN … WHERE prawa_strona.id IS NULL pokaże wiersze z lewej, które nie mają dopasowania (np. klienci bez zamówień). To praktyczny sposób na „brak danych” w relacji..
  7. Agregaty a NULL
    COUNT(kolumna) nie liczy NULL, COUNT(*) liczy wiersze.
    AVG, SUM, MAX, MIN pomijają NULL (nie trzeba ich ręcznie filtrować).

.