Уяви, що ти працюєш з тисячами рядків даних — як знайти в них сенс? Тут на сцену виходить оператор GROUP BY — справжній диригент в оркестрі SQL. Він бере розрізнені дані й перетворює їх на чітку мелодію: рахує, групує, підбиває підсумки. Хочеш дізнатися, скільки замовлень зробив кожен клієнт, скільки студентів на кожному курсі або як розподіляються зарплати по відділах? Все це — робота GROUP BY. Сьогодні розберемося, як з ним подружитися і витискати максимум користі з твоїх таблиць.
Групування — це процес об'єднання рядків, які мають однакові значення в одному або декількох стовпцях, у логічні групи. Воно дозволяє застосовувати агрегатні функції окремо до кожної групи.
Уяви, що у тебе є таблиця співробітників, і ти хочеш дізнатися середню зарплату по кожному відділу. Один відділ — одна група. SQL використовує GROUP BY, щоб розділити таблицю співробітників на групи по відділах, а потім застосовує AVG() до кожної групи.
Синтаксис GROUP BY
Головне правило використання групування в SQL: якщо ти використовуєш GROUP BY, то кожен стовпець, який не є частиною агрегатної функції, має бути вказаний у GROUP BY.
Синтаксис:
SELECT стовпець1,
агрегатна_функція(стовпець2)
FROM таблиця
GROUP BY стовпець1;
Кроки роботи:
- Вкажи стовпець, по якому хочеш згрупувати дані, у
GROUP BY. - Використовуй агрегатні функції для обчислення значень у групах.
- Всі стовпці в
SELECT, але не входять в агрегатні функції, мають бути перелічені вGROUP BY. Так, SQL суворий у цьому плані, і якщо забудеш — він нагадає тобі про це помилкою.
Приклад: Групування студентів по факультетах
Припустимо, у нас є таблиця students, яка зберігає дані про студентів:
| 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 |
Тепер ми хочемо дізнатися середній бал (GPA) по кожному факультету. Для цього напишемо запит з GROUP BY:
SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Результат:
| faculty | avg_gpa |
|---|---|
| ComputerSci | 3.9 |
| Math | 3.7 |
| Physics | 3.7 |
SQL спочатку розділив дані на групи по значенню стовпця faculty, а потім застосував функцію AVG() до кожної групи.
Особливості роботи з GROUP BY
- Вимоги до стовпців у
SELECT
SQL вимагає, щоб всі стовпці, які ти вказуєш у SELECT, але не використовуєш в агрегатних функціях (наприклад, SUM(), COUNT()), були згадані у GROUP BY. Це пов'язано з тим, що без групування SQL не може зрозуміти, які значення виводити.
Спробуй виконати наступний запит і отримаєш помилку:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;
Помилка: стовпець name не вказаний у GROUP BY. Щоб виправити це, додай name у GROUP BY:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;
Але це вже згрупує дані на рівні конкретних студентів — не зовсім те, що нам було потрібно спочатку.
- Групування по декількох стовпцях
Ти можеш групувати дані не тільки по одному стовпцю, а й по декількох. Наприклад, додатково до факультетів хочемо групувати студентів по їх іменах. Просто додай другий стовпець у GROUP BY:
SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;
Початкова таблиця:
| 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 |
Результат:
| 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 |
- Групування з використанням декількох агрегатних функцій
Не обмежуй себе лише однією функцією! Наприклад, хочемо порахувати кількість студентів на факультеті і обчислити середній бал:
SELECT faculty,
COUNT(*) AS student_count,
AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Початкова таблиця:
| 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 |
Результат:
| faculty | student_count | avg_gpa |
|---|---|---|
| ComputerSci | 2 | 3.9 |
| Math | 2 | 3.7 |
| Physics | 1 | 3.7 |
Особливості групування в SQL: що можна і що не можна вибирати
Запити з групуванням писати легко, але скоріше за все половина твоїх запитів працювати не буде. Групування відбувається трохи не так, як ми звикли робити у себе в голові.
Якщо у тебе в SQL-запиті є GROUP BY, то думай про всі колонки результату як про обчислювані вирази. Колонки в SELECT можуть бути тільки двох типів:
- обчислюються агрегатними функціями на основі колонок групи.
- беруться з GROUP BY — по них має бути групування.
Якщо ти виконуєш GROUP-BY-запит по таблиці студентів, то в результуючій таблиці у тебе не може бути конкретних студентів! У тебе може бути середній зріст, середня вага, середній бал. Такий код працювати не буде:
SELECT faculty, name
FROM students
GROUP BY faculty;
Давай спробуємо розібратися чому.
Оператор GROUP BY faculty розіб'є студентів таблиці students на групи з однаковим faculty у кожної групи. Оскільки у всіх студентів групи однаковий faculty, то можна сказати, що атрибут faculty є у групи студентів. Але name у всіх студентів різні. Тому атрибута name у групи немає.
Оператор GROUP BY faculty, gender розіб'є студентів таблиці students на групи з однаковим faculty і gender у кожної групи. Тому у всіх студентів кожної групи будуть однакові faculty і gender. Тому можна сказати, що у самої групи студентів є атрибути faculty і gender. Але єдиного name у групи все одно немає.
Так писати можна:
SELECT faculty, gender
FROM students
GROUP BY faculty, gender;
Можна навіть так:
SELECT
faculty,
gender,
AVG(age) as group_avg_age, -- Значення обчислюється на основі age значень групи студентів
MAX(high) as group_high -- Значення обчислюється на основі high значень групи студентів
FROM students
GROUP BY faculty, gender;
Але просто використовувати age і high в SELECT у нашому випадку не можна.
Типові помилки при використанні GROUP BY
Коли ти почнеш писати запити з GROUP BY, ось кілька підводних каменів, які можуть зустрітися на шляху:
Вказані не всі стовпці в
SELECT. Пам'ятай, кожен стовпець, який не є агрегатом, має бути вказаний уGROUP BY. Інакше SQL не зрозуміє, як його відображати.Групування по
NULL.NULLзначення вважаються окремою групою. Якщо у твоєму стовпці єNULL, SQL створить групу дляNULL.Зайві групи. Якщо ти випадково додаси забагато стовпців у
GROUP BY, можеш отримати занадто деталізовані результати, які складніше аналізувати.
Тепер ти знаєш, як ефективно групувати дані за допомогою GROUP BY. Це один з найпотужніших інструментів у SQL, який дозволяє легко працювати з агрегованими даними і створювати структуровані звіти. Далі ми продовжимо занурюватися в магію групування і дізнаємося, як налаштовувати додаткові фільтри за допомогою HAVING.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ