HAVING a WHERE
Rozróżniaj HAVING (filtruje grupy) od WHERE (filtruje wiersze) i stosuj oba poprawnie w tym samym zapytaniu.
HAVING a WHERE to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Dwa etapy filtrowania
WHERE filtruje pojedyncze wiersze PRZED grupowaniem. HAVING filtruje grupy PO agregacji. Wyglądają podobnie, ale działają na różnych etapach.
Przykład WHERE
WHERE filtruje surowe wiersze. Nie może odwoływać się do funkcji agregujących:
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;Przykład HAVING
HAVING filtruje grupy. Może odwoływać się do funkcji agregujących:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersŁączenie WHERE i HAVING
Obie klauzule mogą wystąpić w tym samym zapytaniu:
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;Nie umieszczaj funkcji agregujących w WHERE
Planer wykonuje WHERE przed grupowaniem — funkcje agregujące nie są jeszcze dostępne:
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;Przenoś predykaty do WHERE, gdy to możliwe
WHERE filtruje przed grupowaniem, więc do agregacji trafia mniej wierszy. HAVING należy stosować tylko dla warunków, których nie można wyrazić w WHERE.
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;Logiczny porządek wykonywania
Porządek pojęciowy:
FROM— wybór tabel i ich łączenieWHERE— filtrowanie wierszyGROUP BY— tworzenie grupHAVING— filtrowanie grupSELECT— wybór kolumnORDER BY— sortowanieLIMIT— wybór pierwszych N wyników
HAVING bez GROUP BY
Można używać HAVING bez GROUP BY — cała tabela staje się jedną grupą:
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1MAliasy w HAVING
Niektóre bazy danych pozwalają, aby HAVING odwoływało się do aliasów z SELECT; PostgreSQL na to pozwala, MySQL również, ale standardowy SQL nie. Najbardziej przenośne rozwiązanie to powtórzenie funkcji agregującej:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQLHAVING z wieloma funkcjami agregującymi
HAVING służy do złożonych warunków dotyczących funkcji agregujących:
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;Uwaga dotycząca wydajności
Filtr agregacji w HAVING nie może korzystać z indeksów tak jak WHERE filtrujące według kolumny. Należy przenieść do WHERE wszystko, co można.
Podsumowanie
WHERE = filtrowanie wierszy. HAVING = filtrowanie grup.
- Funkcje agregujące stosuje się tylko w HAVING, nigdy w WHERE
- Predykaty należy przenosić do WHERE, aby zwiększyć wydajność
- W razie potrzeby należy używać obu klauzul
Szybkie sprawdzenie
Chcą Państwo znaleźć użytkowników, którzy złożyli więcej niż 10 zamówień. Która klauzula to filtruje?
Często zadawane pytania
Czy lekcja „HAVING a WHERE” jest bezpłatna?
Tak — pełny tekst „HAVING a WHERE” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „HAVING a WHERE”?
Rozróżniaj HAVING (filtruje grupy) od WHERE (filtruje wiersze) i stosuj oba poprawnie w tym samym zapytaniu. Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „HAVING a WHERE”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY dla jednej i wielu kolumn
- HAVING a WHERE
- Typowe pułapki: wartości NULL w agregatach