Что делает 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
- Все столбцы, которые указаны в SELECT, должны быть либо:
- частью GROUP BY, **либо
** - входить в агрегатную функцию
- частью 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 — для управления порядком отображения результатов. Оба оператора часто используются совместно, но выполняют принципиально разные задачи: группировку и сортировку соответственно.