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
— важный инструмент для работы с агрегированными данными и их анализом по категориям, таким как отдел, возраст или должность.