GROUP BY — это ключевое слово в SQL, которое позволяет группировать строки таблицы по значениям определённого столбца или нескольких столбцов. В сочетании с агрегатными функциями (COUNT, SUM, AVG, MIN, MAX) оно позволяет выполнять расчёты и анализировать данные в разрезе определённых категорий, например, по отделам, возрастам, годам и т.д.
Синтаксис GROUP BY
Общий синтаксис команды с использованием GROUP BY:
SELECT столбец1, столбец2, ... , агрегатная_функция(столбецN)
FROM имя_таблицы
WHERE условие
GROUP BY столбец1, столбец2, ... ;
GROUP BY столбец1 — указывает столбец, по которому производится группировка. Каждое уникальное значение в этом столбце становится отдельной группой.
- Агрегатная функция (например,
SUM, COUNT) вычисляется по каждому уникальному значению в столбце.
Пример работы GROUP BY
Рассмотрим таблицу сотрудников employees:
Задача 1: Подсчитать количество сотрудников в каждом отделе
Мы хотим узнать, сколько сотрудников работает в каждом отделе. Для этого используем GROUP BY вместе с COUNT:
SELECT department, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department;
Результат:
| department |
num_employees |
| Sales |
2 |
| IT |
2 |
| Marketing |
1 |
Этот запрос сгруппировал сотрудников по их отделам, а затем подсчитал количество сотрудников в каждом отделе.
Задача 2: Средняя зарплата по каждому отделу
Используем AVG для расчета средней зарплаты в каждом отделе:
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
Результат:
| department |
avg_salary |
| Sales |
3250 |
| IT |
5100 |
| Marketing |
4500 |
Использование GROUP BY с несколькими столбцами
Можно сгруппировать данные по нескольким столбцам. Например, если нам нужно узнать среднюю зарплату для каждого отдела и возраста, можно добавить оба столбца в GROUP BY.
SELECT department, age, AVG(salary) AS avg_salary
FROM employees
GROUP BY department, age;
Этот запрос создаст группы по сочетанию значений в столбцах department и age, вычисляя среднюю зарплату в каждом сочетании.
Использование GROUP BY с HAVING
HAVING позволяет фильтровать группы после выполнения группировки. Это похоже на WHERE, но HAVING применяется к сгруппированным результатам.
Пример: Вывести отделы с количеством сотрудников больше одного
Для этого используем COUNT с GROUP BY и фильтруем группы с помощью HAVING:
SELECT department, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department
HAVING num_employees > 1;
Результат:
| department |
num_employees |
| Sales |
2 |
| IT |
2 |
Только отделы с количеством сотрудников больше одного прошли фильтр HAVING.
Итоги
GROUP BY позволяет разбить данные на группы по уникальным значениям в одном или нескольких столбцах.
- После группировки можно использовать агрегатные функции для расчётов по каждой группе.
HAVING применяется для фильтрации уже сгруппированных данных и работает аналогично WHERE, но с агрегатными функциями.
Примеры использования
Вот несколько задач, которые помогают освоить GROUP BY:
- Подсчитать общее количество сотрудников в каждом отделе.
- Найти максимальную зарплату для каждого отдела.
- Подсчитать количество сотрудников с возрастом старше 30 лет в каждом отделе.
- Найти минимальную зарплату среди сотрудников в каждом отделе, у которых email не указан.
GROUP BY — важный инструмент для работы с агрегированными данными и их анализом по категориям, таким как отдел, возраст или должность.