Группировка и агрегаты — сердце аналитического 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 нет.