JavaRush /Курси /SQL SELF /Групування даних (GROUP BY): синтаксис і структура

Групування даних (GROUP BY): синтаксис і структура

SQL SELF
Рівень 8 , Лекція 0
Відкрита

Уяви, що ти працюєш з тисячами рядків даних — як знайти в них сенс? Тут на сцену виходить оператор GROUP BY — справжній диригент в оркестрі SQL. Він бере розрізнені дані й перетворює їх на чітку мелодію: рахує, групує, підбиває підсумки. Хочеш дізнатися, скільки замовлень зробив кожен клієнт, скільки студентів на кожному курсі або як розподіляються зарплати по відділах? Все це — робота GROUP BY. Сьогодні розберемося, як з ним подружитися і витискати максимум користі з твоїх таблиць.

Групування — це процес об'єднання рядків, які мають однакові значення в одному або декількох стовпцях, у логічні групи. Воно дозволяє застосовувати агрегатні функції окремо до кожної групи.

Уяви, що у тебе є таблиця співробітників, і ти хочеш дізнатися середню зарплату по кожному відділу. Один відділ — одна група. SQL використовує GROUP BY, щоб розділити таблицю співробітників на групи по відділах, а потім застосовує AVG() до кожної групи.

Синтаксис GROUP BY

Головне правило використання групування в SQL: якщо ти використовуєш GROUP BY, то кожен стовпець, який не є частиною агрегатної функції, має бути вказаний у GROUP BY.

Синтаксис:

SELECT стовпець1, 
       агрегатна_функція(стовпець2)
FROM таблиця
GROUP BY стовпець1;

Кроки роботи:

  1. Вкажи стовпець, по якому хочеш згрупувати дані, у GROUP BY.
  2. Використовуй агрегатні функції для обчислення значень у групах.
  3. Всі стовпці в 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

  1. Вимоги до стовпців у 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;

Але це вже згрупує дані на рівні конкретних студентів — не зовсім те, що нам було потрібно спочатку.

  1. Групування по декількох стовпцях

Ти можеш групувати дані не тільки по одному стовпцю, а й по декількох. Наприклад, додатково до факультетів хочемо групувати студентів по їх іменах. Просто додай другий стовпець у 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
  1. Групування з використанням декількох агрегатних функцій

Не обмежуй себе лише однією функцією! Наприклад, хочемо порахувати кількість студентів на факультеті і обчислити середній бал:

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, ось кілька підводних каменів, які можуть зустрітися на шляху:

  1. Вказані не всі стовпці в SELECT. Пам'ятай, кожен стовпець, який не є агрегатом, має бути вказаний у GROUP BY. Інакше SQL не зрозуміє, як його відображати.

  2. Групування по NULL. NULL значення вважаються окремою групою. Якщо у твоєму стовпці є NULL, SQL створить групу для NULL.

  3. Зайві групи. Якщо ти випадково додаси забагато стовпців у GROUP BY, можеш отримати занадто деталізовані результати, які складніше аналізувати.

Тепер ти знаєш, як ефективно групувати дані за допомогою GROUP BY. Це один з найпотужніших інструментів у SQL, який дозволяє легко працювати з агрегованими даними і створювати структуровані звіти. Далі ми продовжимо занурюватися в магію групування і дізнаємося, як налаштовувати додаткові фільтри за допомогою HAVING.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ