Wyobraź sobie, że masz do czynienia z tysiącami wierszy danych — jak się w tym połapać? Tu na scenę wchodzi operator GROUP BY — prawdziwy dyrygent w orkiestrze SQL. Bierze rozrzucone dane i zamienia je w konkretną melodię: liczy, grupuje, podsumowuje. Chcesz wiedzieć, ile zamówień złożył każdy klient, ilu studentów jest na każdym kursie albo jak rozkładają się pensje w działach? To wszystko ogarnia GROUP BY. Dziś ogarniemy, jak się z nim zaprzyjaźnić i wyciągnąć maksimum z twoich tabel.
Grupowanie to proces łączenia wierszy, które mają takie same wartości w jednej lub kilku kolumnach, w logiczne grupy. Dzięki temu możesz używać funkcji agregujących osobno dla każdej grupy.
Wyobraź sobie, że masz tabelę pracowników i chcesz poznać średnią pensję w każdym dziale. Jeden dział — jedna grupa. SQL używa GROUP BY, żeby podzielić tabelę pracowników na grupy według działów, a potem stosuje AVG() do każdej grupy.
Składnia GROUP BY
Najważniejsza zasada grupowania w SQL: jeśli używasz GROUP BY, każda kolumna, która nie jest częścią funkcji agregującej, musi być wymieniona w GROUP BY.
Składnia:
SELECT kolumna1,
funkcja_agregująca(kolumna2)
FROM tabela
GROUP BY kolumna1;
Kroki działania:
- Wskaż kolumnę, według której chcesz grupować dane, w
GROUP BY. - Użyj funkcji agregujących, żeby policzyć wartości w grupach.
- Wszystkie kolumny w
SELECT, które nie są w funkcjach agregujących, muszą być wymienione wGROUP BY. Tak, SQL jest tu surowy i jeśli zapomnisz, przypomni ci o tym błędem.
Przykład: Grupowanie studentów według wydziałów
Załóżmy, że mamy tabelę students, która przechowuje dane o studentach:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Teraz chcemy poznać średnią ocenę (GPA) na każdym wydziale. Do tego napiszemy zapytanie z GROUP BY:
SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Wynik:
| faculty | avg_gpa |
|---|---|
| ComputerSci | 3.9 |
| Math | 3.7 |
| Physics | 3.7 |
SQL najpierw podzielił dane na grupy według wartości w kolumnie faculty, a potem zastosował funkcję AVG() do każdej grupy.
Niuanse pracy z GROUP BY
- Wymagania dotyczące kolumn w
SELECT
SQL wymaga, żeby wszystkie kolumny, które podajesz w SELECT, ale nie używasz ich w funkcjach agregujących (np. SUM(), COUNT()), były wymienione w GROUP BY. To dlatego, że bez grupowania SQL nie wie, jakie wartości wyświetlić.
Spróbuj wykonać takie zapytanie i dostaniesz błąd:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;
Błąd: kolumna name nie została podana w GROUP BY. Żeby to naprawić, dodaj name do GROUP BY:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;
Ale to już pogrupuje dane na poziomie konkretnych studentów — nie do końca o to nam chodziło.
- Grupowanie po kilku kolumnach
Możesz grupować dane nie tylko po jednej kolumnie, ale i po kilku. Na przykład, oprócz wydziałów chcemy grupować studentów także po imieniu. Po prostu dodaj drugą kolumnę do GROUP BY:
SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;
Początkowa tabela:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Wynik:
| faculty | name | avg_gpa |
|---|---|---|
| ComputerSci | Alex Lin | 3.8 |
| ComputerSci | Anna Song | 4.0 |
| Math | Maria Chi | 3.5 |
| Math | Otto Art | 3.9 |
| Physics | Liam Park | 3.7 |
- Grupowanie z użyciem kilku funkcji agregujących
Nie ograniczaj się do jednej funkcji! Na przykład chcemy policzyć ilu studentów jest na wydziale i wyliczyć średnią ocenę:
SELECT faculty,
COUNT(*) AS student_count,
AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Początkowa tabela:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Wynik:
| faculty | student_count | avg_gpa |
|---|---|---|
| ComputerSci | 2 | 3.9 |
| Math | 2 | 3.7 |
| Physics | 1 | 3.7 |
Niuanse grupowania w SQL: co można, a czego nie można wybierać
Pisanie zapytań z grupowaniem jest proste, ale pewnie połowa twoich zapytań nie zadziała od razu. Grupowanie działa trochę inaczej, niż się wydaje na pierwszy rzut oka.
Jeśli masz w zapytaniu SQL GROUP BY, to myśl o wszystkich kolumnach wyniku jak o wyrażeniach wyliczanych. Kolumny w SELECT mogą być tylko dwóch typów:
- wyliczane przez funkcje agregujące na podstawie kolumn grupy.
- branie z GROUP BY — po nich musi być grupowanie.
Jeśli robisz zapytanie GROUP BY po tabeli studentów, to w wyniku nie możesz mieć konkretnych studentów! Możesz mieć średni wzrost, średnią wagę, średnią ocenę. Taki kod nie zadziała:
SELECT faculty, name
FROM students
GROUP BY faculty;
Spróbujmy ogarnąć dlaczego.
Operator GROUP BY faculty podzieli studentów z tabeli students na grupy z takim samym faculty w każdej grupie. Ponieważ wszyscy studenci w grupie mają taki sam faculty, można powiedzieć, że atrybut faculty należy do grupy studentów. Ale name u wszystkich studentów jest inne. Więc grupa nie ma jednego name.
Operator GROUP BY faculty, gender podzieli studentów z tabeli students na grupy z takim samym faculty i gender w każdej grupie. Więc wszyscy studenci w grupie mają takie same faculty i gender. Można więc powiedzieć, że grupa studentów ma atrybuty faculty i gender. Ale nadal nie ma jednego name dla grupy.
Tak można pisać:
SELECT faculty, gender
FROM students
GROUP BY faculty, gender;
Można nawet tak:
SELECT
faculty,
gender,
AVG(age) as group_avg_age, -- Wartość liczona na podstawie age w grupie studentów
MAX(high) as group_high -- Wartość liczona na podstawie high w grupie studentów
FROM students
GROUP BY faculty, gender;
Ale po prostu użyć age i high w SELECT w tym przypadku nie można.
Typowe błędy przy użyciu GROUP BY
Kiedy zaczniesz pisać zapytania z GROUP BY, oto kilka pułapek, na które możesz się natknąć:
Nie wszystkie kolumny są podane w
SELECT. Pamiętaj, każda kolumna, która nie jest agregatem, musi być wGROUP BY. Inaczej SQL nie wie, jak ją wyświetlić.Grupowanie po
NULL. WartościNULLsą traktowane jako osobna grupa. Jeśli w twojej kolumnie jestNULL, SQL zrobi dla niego osobną grupę.Zbyt szczegółowe grupy. Jeśli przypadkiem dodasz za dużo kolumn do
GROUP BY, możesz dostać zbyt szczegółowe wyniki, które trudniej analizować.
Teraz już wiesz, jak skutecznie grupować dane za pomocą GROUP BY. To jeden z najmocniejszych narzędzi w SQL, które pozwala łatwo pracować z danymi zagregowanymi i tworzyć uporządkowane raporty. Dalej będziemy jeszcze głębiej wchodzić w magię grupowania i dowiemy się, jak ustawiać dodatkowe filtry za pomocą HAVING.
GO TO FULL VERSION