Группировка и агрегаты — сердце аналитического SQL. Именно здесь запрос перестаёт быть простой выборкой строк и превращается в инструмент сводки: «сколько», «в среднем», «максимум по категории». Аналитику важно чётко разделять три вещи, которые новички постоянно путают: агрегатные функции, группировку GROUP BY и фильтрацию групп HAVING. Ниже разберём эти конструкции, а также смежные темы — категории команд SQL и сортировку результатов, — чтобы картина была целостной. Базовый контекст см. в 07.01 Базы данных и SQL на уровне аналитика.
1. Агрегатные функции и GROUP BY
Агрегатные функции сворачивают множество строк в одно значение. К ним относятся SUM, COUNT, AVG, MAX, MIN.
Оператор GROUP BY применяется, когда нужно агрегировать данные по определённым столбцам. Он группирует строки с одинаковыми значениями в указанных столбцах и позволяет применять к каждой группе агрегатные функции.
Пример: общая сумма продаж по каждому продавцу.
SELECT продавец, SUM(сумма_продажи)
FROM продажи
GROUP BY продавец;Логика проста: строки с одинаковым значением продавец собираются в одну группу, и SUM считается уже внутри каждой группы, а не по всей таблице.
2. HAVING: фильтрация групп
Оператор HAVING служит для фильтрации результатов, полученных после применения GROUP BY. Он позволяет задавать условия на агрегатные функции — то, что невозможно сделать в WHERE, поскольку WHERE фильтрует данные до группировки.
Пример: только те продавцы, у которых сумма продаж превышает 1000.
SELECT продавец, SUM(сумма_продажи)
FROM продажи
GROUP BY продавец
HAVING SUM(сумма_продажи) > 1000;3. WHERE, GROUP BY и HAVING: порядок применения
Ключевое различие удобно зафиксировать таблицей.
| Оператор | Назначение | Момент применения |
|---|---|---|
WHERE | Фильтрация строк | До группировки |
GROUP BY | Группировка данных | До агрегации |
HAVING | Фильтрация групп | После группировки |
Итак, GROUP BY отвечает за группировку данных, HAVING — за фильтрацию уже сформированных групп, а WHERE фильтрует данные до группировки. Практическое следствие: условие на агрегат (SUM(...) > 1000) в WHERE написать нельзя — только в HAVING.
4. Смежные темы: категории команд и сортировка
4.1. DDL и DML
Команды SQL принято делить по назначению. Две ключевые категории — DDL (Data Definition Language, язык определения данных) и DML (Data Manipulation Language, язык манипулирования данными). Первая отвечает за структуру базы данных, вторая — за работу с самими данными.
DDL — язык определения данных. Управляет структурой объектов базы данных:
- CREATE — создание новых объектов: таблиц, баз данных, индексов и других.
- ALTER — изменение структуры уже существующих объектов, например таблиц.
- DROP — удаление объектов из базы данных (таблиц, баз данных и т. д.).
- TRUNCATE — удаление всех записей из таблицы без удаления самой таблицы; восстановить данные после этого нельзя.
- COMMENT — добавление комментариев к объектам базы данных.
- RENAME — переименование объектов базы данных.
DML — язык манипулирования данными. Работает с содержимым таблиц:
- SELECT — выборка данных из базы данных.
- INSERT — добавление новых записей в таблицу.
- UPDATE — изменение существующих записей.
- DELETE — удаление записей из таблицы.
Таким образом, DDL-команды управляют структурой базы данных, а DML-команды — данными внутри неё. Понимание этого разделения помогает осознанно выбирать инструменты при проектировании схемы и при повседневной работе с записями.
4.2. Сортировка: ORDER BY
Для сортировки результатов запроса в стандартном SQL существует единственный оператор — ORDER BY. Конструкции SORT BY в стандартном SQL не существует.
ORDER BY применяется для сортировки результатов запроса по указанным столбцам. Можно указать порядок сортировки:
- ASC — по возрастанию;
- DESC — по убыванию.
Пример:
SELECT * FROM employees ORDER BY last_name ASC;Этот запрос вернёт список сотрудников, отсортированный по фамилии в алфавитном порядке.
5. Итог
- Агрегатные функции (
SUM,COUNT,AVG,MAX,MIN) сворачивают строки в одно значение. GROUP BYзадаёт, по каким столбцам формируются группы.WHEREфильтрует строки до группировки,HAVING— группы после неё.- DDL управляет структурой, DML — данными.
- Для сортировки используется
ORDER BYсASCилиDESC;SORT BYв стандартном SQL нет.