← Назад к вопросам

В чем разница между GROUP BY и ORDER BY?

2.0 Middle🔥 221 комментариев
#Базы данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основное назначение: принципиальное различие

Основное и ключевое различие между GROUP BY и ORDER BY заключается в их фундаментальном предназначении в языке SQL.

  • GROUP BY — это агрегирующая (или группирующая) клауза. Её главная задача — объединять (группировать) строки таблицы, имеющие одинаковые значения в указанных столбцах, в одну логическую запись, чтобы затем выполнить над каждой такой группой агрегатные вычисления (сумму, среднее, количество и т.д.).
  • ORDER BY — это сортировочная (или упорядочивающая) клауза. Её единственная цель — определить порядок, в котором строки результирующего набора данных будут представлены пользователю или внешней системе (по возрастанию или убыванию).

Проще говоря: GROUP BY изменяет структуру результата, сводя множество строк в группы, а ORDER BY изменяет только порядок уже существующих строк в результате, не меняя их количество или состав (за исключением случаев с DISTINCT ON в некоторых СУБД).


GROUP BY: Агрегация и группировка данных

Клауза GROUP BY используется совместно с агрегатными функциями, такими как COUNT(), SUM(), AVG(), MAX(), MIN().

Принцип работы:

  1. Исходные данные разбиваются на группы на основе одинаковых значений в столбцах, перечисленных после GROUP BY.
  2. Каждая группа "схлопывается" в одну итоговую строку в результирующем наборе.
  3. В SELECT можно указывать только столбцы из GROUP BY и/или результаты агрегатных функций, применённых ко всем строкам внутри каждой группы.

Пример на Go (используем абстракцию запроса): Представим, что у нас есть структура Sale и мы хотим сгруппировать продажи по менеджерам.

// Допустим, у нас есть слайс продаж
type Sale struct {
    ID        int
    Manager   string
    Product   string
    Amount    float64
}

sales := []Sale{
    {1, "Иван", "Ноутбук", 1000},
    {2, "Мария", "Телефон", 500},
    {3, "Иван", "Монитор", 300},
    {4, "Мария", "Ноутбук", 1000},
    {5, "Алексей", "Клавиатура", 50},
}
-- SQL-запрос с GROUP BY
SELECT
    Manager,           -- Столбец группировки
    COUNT(*) as SalesCount, -- Агрегат: количество продаж в группе
    SUM(Amount) as TotalSum -- Агрегат: общая сумма по группе
FROM sales
GROUP BY Manager;

Результат запроса:

ManagerSalesCountTotalSum
Иван21300
Мария21500
Алексей150

Обратите внимание: из 5 исходных строк мы получили 3 итоговые (по количеству уникальных менеджеров). Данные агрегированы.


ORDER BY: Сортировка результирующего набора

Клауза ORDER BY не выполняет агрегацию. Она лишь сортирует строки, которые уже выбраны запросом (в том числе и сгруппированные GROUP BY).

Ключевые особенности:

  • Сортировать можно по одному или нескольким столбцам.
  • Для каждого столбца можно указать направление: ASC (по возрастанию, по умолчанию) или DESC (по убыванию).
  • ORDER BY всегда выполняется после GROUP BY и агрегации, а также после SELECT.
  • Не влияет на количество строк (если не используется LIMIT/OFFSET на основе сортировки).

Продолжим пример. Отсортируем результат группировки:

-- Сначала группируем (GROUP BY), затем сортируем (ORDER BY)
SELECT
    Manager,
    COUNT(*) as SalesCount,
    SUM(Amount) as TotalSum
FROM sales
GROUP BY Manager
ORDER BY TotalSum DESC; -- Сортировка по итоговой сумме от большей к меньшей

Результат запроса:

ManagerSalesCountTotalSum
Мария21500
Иван21300
Алексей150

Теперь строки упорядочены по убыванию общей суммы (TotalSum DESC). Данные сначала сгруппированы, а затем отсортированы.


Сравнение в таблице

КритерийGROUP BYORDER BY
Основная функцияАгрегация и группировка строкСортировка строк результата
Влияние на количество строкМеняет (уменьшает, группируя)Не меняет (если нет LIMIT)
Использование с агрегатными функциямиОбязательно (явно или неявно)Не обязательно
Порядок выполнения в запросеВыполняется после WHERE, но до SELECT (на логическом уровне)Выполняется последней, после всех других операций выборки и агрегации
Что можно указывать в SELECTТолько столбцы группировки и агрегатные функцииЛюбые столбцы из результирующего набора
Типичное использованиеПолучение сводок, отчётов, статистики (сумма по отделам, средний балл по группам)Упорядочивание любых данных для удобства просмотра (сортировка товаров по цене, дате)

Важное замечание: Взаимодействие и порядок выполнения

В одном запросе GROUP BY и ORDER BY часто используются вместе. При этом критически важен логический порядок выполнения:

  1. FROM / JOIN - выбор таблиц.
  2. WHERE - фильтрация строк.
  3. GROUP BY - группировка отфильтрованных строк.
  4. Агрегатные функции (SUM, COUNT и т.д.) вычисляются здесь.
  5. HAVING - фильтрация уже сгруппированных данных (работает с результатами агрегации).
  6. SELECT - формирование окончательных столбцов результата.
  7. ORDER BY - финальная сортировка того, что получено в SELECT.
  8. LIMIT / OFFSET - ограничение вывода.

Таким образом, ORDER BY может сортировать как результаты обычной выборки, так и результаты, полученные после агрегации с помощью GROUP BY. Это делает её универсальным инструментом для упорядочивания любых данных на последнем этапе формирования ответа на запрос.