0Pricing
SQL Interview Prep · Lekcja

Agregaty bez GROUP BY

Jak zwykła funkcja agregująca przekształca całą tabelę w jeden wiersz

Agregaty bez GROUP BY to bezpłatna lekcja SQL Interview Prep na CoddyKit. To lekcja 4 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 Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.

Jedna funkcja agregująca, jeden wiersz

Rozmówcy często sprawdzają podstawową wiedzę pytaniem: „Co się dzieje, gdy używa się funkcji agregującej bez GROUP BY?”

Odpowiedź brzmi: cała tabela zostaje zredukowana do jednego wiersza. Funkcja agregująca traktuje wszystkie kwalifikujące się wiersze jako jedną dużą, niejawną grupę. Zrozumienie tego modelu „niejawnej grupy” wyjaśnia wiele kolejnych reguł, dlatego przyjrzyjmy się mu dokładnie.

Niejawna pojedyncza grupa

Gdy używają Państwo samodzielnej funkcji agregującej bez GROUP BY, SQL zachowuje się tak, jakby istniała jedna grupa zawierająca każdy wiersz. Wynik zawsze zawiera dokładnie jeden wiersz, niezależnie od liczby wierszy w tabeli — nawet gdy tabela jest pusta.

Dlatego SELECT COUNT(*) FROM employees zwraca jeden wiersz z jedną liczbą podsumowującą całą tabelę.

SELECT COUNT(*) AS total_employees
FROM employees;
-- always returns exactly one row

Kilka funkcji agregujących razem

W jednym SELECT można wymienić kilka funkcji agregujących. Wszystkie podsumowują tę samą niejawną grupę, dlatego nadal otrzymuje się dokładnie jeden wiersz z wieloma kolumnami.

Jest to standardowe zapytanie w rodzaju „pokaż mi statystyki podsumowujące”. Wszystkie cztery liczby opisują ten sam pełny zbiór wierszy.

SELECT
  COUNT(*)     AS num_rows,
  SUM(salary)  AS total_pay,
  AVG(salary)  AS avg_pay,
  MAX(salary)  AS top_pay
FROM employees;

Błąd mieszania

Oto najczęściej sprawdzana reguła. Nie można łączyć samodzielnej funkcji agregującej z kolumną nieobjętą agregacją w tym samym SELECT bez GROUP BY.

Dlaczego? Funkcja agregująca tworzy jeden wiersz, ale zwykła kolumna ma wiele wartości — którą z nich należałoby wyświetlić? Jest to niejednoznaczne, dlatego standardowy SQL zgłasza błąd.

-- ERROR: name is not aggregated and there is no GROUP BY
SELECT name, MAX(salary)
FROM employees;

Dlaczego jest to niejednoznaczne

Prześledźmy to na naszej tabeli. MAX(salary) redukuje wszystkie wiersze do jednej wartości. Natomiast name ma inną wartość w każdym wierszu. Pojedynczy wiersz podsumowania nie może zawierać pięciu nazw w jednej komórce.

Baza danych odmawia zgadywania. To ta sama zasada, która leży u podstaw reguły GROUP BY: każda wybrana kolumna musi być albo objęta agregacją, albo należeć do grupy. Bez GROUP BY dozwolone są wyłącznie funkcje agregujące.

Luźny wyjątek w MySQL

Warto wspomnieć o jednej różnicy między dialektami: starszy lub niestrictowy MySQL zezwalał na zapytanie mieszające te elementy i zwracał dowolną nazwę — niekoniecznie nazwę najlepiej zarabiającego pracownika.

Współczesny MySQL z włączonym ONLY_FULL_GROUP_BY (obecnie jest to ustawienie domyślne) odrzuca takie zapytanie, podobnie jak pozostałe bazy danych. Wspomnienie o tym pokazuje znajomość różnic między dialektami, ale takie mieszane zapytanie zawsze należy uznawać za niepoprawne.

Pobieranie wiersza odpowiadającego MAX

Jak zatem uzyskać nazwisko najlepiej opłacanego pracownika? Nie przez mieszanie kolumn. Należy użyć ORDER BY + LIMIT albo podzapytania porównującego wartość z funkcją agregującą.

Wersja z ORDER BY/LIMIT jest najprostsza. Wersja z podzapytaniem łatwo się uogólnia i zwraca wszystkich pracowników, którzy mają taką samą maksymalną wartość.

-- Subquery: returns everyone earning the max
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

Funkcje agregujące dla pustej tabeli

To przypadek brzegowy, który rozmówcy rekrutacyjni często przemycają w pytaniu: „Co samodzielna funkcja agregująca zwraca dla pustej tabeli?”

  • COUNT(*) zwraca 0 (jeden wiersz z wartością 0).
  • SUM, AVG, MIN i MAX zwracają NULL (jeden wiersz z wartością NULL).

Co najważniejsze, nadal otrzymuje się jeden wiersz, a nie zero wierszy. Gwarancja pojedynczego wiersza jest właśnie sednem funkcji agregującej bez GROUP BY.

SELECT COUNT(*) AS c, SUM(salary) AS s, MAX(salary) AS m
FROM employees
WHERE 1 = 0;
-- one row: c=0, s=NULL, m=NULL

Brak agregatów w WHERE

Kolejna reguła wynika z tego modelu: nie można umieścić funkcji agregującej w klauzuli WHERE, ponieważ WHERE filtruje poszczególne wiersze przed wykonaniem agregacji.

Aby filtrować na podstawie wyniku agregacji, należy użyć HAVING (w połączeniu z grupowaniem) albo umieścić funkcję agregującą w podzapytaniu. WHERE jest wykonywane zbyt wcześnie w kolejności realizacji zapytania, aby mogło odczytać wynik agregacji.

-- ERROR: aggregate not allowed in WHERE
-- SELECT * FROM employees WHERE salary > AVG(salary);

-- Correct: compare to the aggregate via subquery
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

Samodzielna agregacja a GROUP BY

Warto samodzielnie ująć to przeciwstawienie:

  • Bez GROUP BY: jedna niejawna grupa = cała tabela = dokładnie jeden wiersz wyniku.
  • Z GROUP BY col: jedna grupa dla każdej odrębnej wartości col = jeden wiersz na grupę.

Samodzielna funkcja agregująca jest po prostu odpowiednikiem GROUP BY z zerową liczbą kolumn grupowania. Mechanizm jest ten sam, tylko wszystkie wiersze trafiają do jednego dużego zbioru.

-- Whole table: one row
SELECT AVG(salary) FROM employees;

-- Per department: one row each
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

Jak to wyjaśnić

Jasna odpowiedź: „Funkcja agregująca bez GROUP BY traktuje cały zbiór wyników jako jedną niejawną grupę i zwraca dokładnie jeden wiersz podsumowania, nawet dla pustej tabeli. Nie można wybrać obok niej kolumny nieobjętej agregacją, ponieważ jej wartość byłaby niejednoznaczna. Aby uzyskać wiersz odpowiadający MAX lub MIN, użyłbym ORDER BY z LIMIT albo podzapytania porównującego wartość z funkcją agregującą”.

Szybkie sprawdzenie

Przewidź kształt wyniku.

Podsumowanie

Funkcje agregujące bez GROUP BY w skrócie:

  • Cała tabela staje się jedną niejawną grupą → dokładnie jeden wiersz wyniku.
  • Nie można łączyć samodzielnej funkcji agregującej z kolumną nieobjętą agregacją.
  • Pusta tabela: COUNT(*) = 0, pozostałe funkcje zwracają NULL, ale nadal jest jeden wiersz.
  • Funkcje agregujące nie mogą występować w WHERE; należy użyć podzapytania lub HAVING.
  • Aby uzyskać wiersz odpowiadający MIN/MAX, należy użyć ORDER BY + LIMIT albo podzapytania.

To kończy ćwiczenia rekrutacyjne dotyczące funkcji agregujących.

Często zadawane pytania

Czy lekcja „Agregaty bez GROUP BY” jest bezpłatna?

Tak — pełny tekst „Agregaty bez GROUP BY” 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 Interview Prep, przejdź na CoddyKit PRO. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Agregaty bez GROUP BY”?

Jak zwykła funkcja agregująca przekształca całą tabelę w jeden wiersz Ćwiczysz SQL Interview Prep 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 Interview Prep?

Nie wymagamy żadnego doświadczenia. SQL Interview Prep 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 4 z 4.

Ile czasu zajmuje lekcja „Agregaty bez GROUP BY”?

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 Interview Prep?

Tak. Każda lekcja SQL Interview Prep 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

  1. COUNT(*) a COUNT(column) i COUNT(DISTINCT)
  2. SUM i AVG z wartościami NULL
  3. MIN, MAX i agregowanie wartości nieliczbowych
  4. Agregaty bez GROUP BY
← Powrót do SQL Interview Prep