Что делает GROUP BY и в чём его отличие от ORDER BY?

Оператор GROUP BY в SQL используется для агрегирования данных по определённым признакам (столбцам). Он группирует строки с одинаковыми значениями в указанных колонках, чтобы затем к каждой группе применить агрегатные функции, такие как SUM(), COUNT(), AVG(), MIN(), MAX() и другие.

В отличие от него, оператор ORDER BY используется для сортировки результатов запроса, но не агрегирует данные. Он определяет, в каком порядке строки будут возвращены — по возрастанию (ASC) или убыванию (DESC) значений в одном или нескольких столбцах.

Синтаксис GROUP BY

SELECT столбец_группировки, агрегатная_функция(другой_столбец)

FROM таблица

GROUP BY столбец_группировки;

Пример GROUP BY

SELECT Department, COUNT(\*) AS EmployeeCount
FROM Employees
GROUP BY Department;

Этот запрос считает количество сотрудников в каждом отделе.

Как работает GROUP BY

GROUP BY объединяет строки в группы, основываясь на значениях в одном или нескольких столбцах. Затем над каждой группой выполняется агрегация.

Пример:

Таблица Sales:

Product Region Amount
A West 100
--- --- ---
A West 200
--- --- ---
B East 300
--- --- ---
A East 150
--- --- ---
SELECT Product, SUM(Amount)
FROM Sales
GROUP BY Product;

Результат:

Product SUM(Amount)
A 450
--- ---
B 300
--- ---

Группировка по нескольким столбцам

SELECT Product, Region, SUM(Amount)
FROM Sales
GROUP BY Product, Region;

Результат будет сгруппирован по уникальным комбинациям Product и Region.

Агрегатные функции с GROUP BY

  • COUNT() — количество строк в группе

  • SUM() — сумма значений

  • AVG() — среднее значение

  • MIN() — минимальное значение

  • MAX() — максимальное значение

Ограничения GROUP BY

  1. Все столбцы, которые указаны в SELECT, должны быть либо:
    • частью GROUP BY, **либо
      **
    • входить в агрегатную функцию
SELECT Product, Region, SUM(Amount) -- корректно
FROM Sales
GROUP BY Product, Region;
\--  Ошибка:
SELECT Product, Region, SUM(Amount)
FROM Sales
GROUP BY Product; -- Region не агрегирован и не в GROUP BY  

WHERE и HAVING

  • WHERE используется до группировки — фильтрует строки.

  • HAVING используется после группировки — фильтрует агрегированные группы.

-- Сначала фильтруем данные

-- Потом группируем

-- Потом фильтруем группы

SELECT Department, COUNT(\*) AS EmpCount
FROM Employees
WHERE Active = 1
GROUP BY Department
HAVING COUNT(\*) > 10;

Синтаксис ORDER BY

SELECT столбцы
FROM таблица
ORDER BY столбец_или_выражение \[ASC|DESC\];

Можно использовать сортировку по:

  • числам

  • строкам

  • датам

  • алиасам столбцов

  • номеру столбца (например, ORDER BY 2)

Пример ORDER BY

SELECT Name, Salary
FROM Employees
ORDER BY Salary DESC;

Сортирует сотрудников по убыванию зарплаты.

Использование GROUP BY и ORDER BY вместе

SELECT Department, AVG(Salary) AS AvgSalary
FROM Employees
GROUP BY Department
ORDER BY AvgSalary DESC;

Сначала данные агрегируются по отделам, затем результат сортируется по среднему значению зарплаты в каждом отделе.

Отличие GROUP BY от ORDER BY

Характеристика GROUP BY ORDER BY
Цель Группировка строк Сортировка строк
--- --- ---
Используется с Агрегатными функциями (SUM, COUNT, и т. д.) Любыми столбцами или выражениями
--- --- ---
Изменяет структуру Да — результат содержит одну строку на группу Нет — структура данных не меняется
--- --- ---
Порядок вывода Не определяет порядок Определяет порядок строк в результате
--- --- ---
Применяется до/после Применяется до HAVING и ORDER BY Применяется после GROUP BY и HAVING
--- --- ---

Пример сравнения

GROUP BY:

SELECT Category, COUNT(\*) AS TotalProducts
FROM Products
GROUP BY Category;

→ Показывает, сколько товаров в каждой категории.

ORDER BY:

SELECT Name, Price
FROM Products
ORDER BY Price DESC;

→ Просто сортирует все товары по цене по убыванию.

Вместе:

SELECT Category, COUNT(\*) AS TotalProducts
FROM Products
GROUP BY Category
ORDER BY TotalProducts DESC;

→ Группирует по категориям и сортирует по количеству товаров в каждой из них.

Оператор GROUP BY используется для агрегирования и анализа данных по категориям, а ORDER BY — для управления порядком отображения результатов. Оба оператора часто используются совместно, но выполняют принципиально разные задачи: группировку и сортировку соответственно.