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

«В чем разница между GROUP BY и ORDER BY в SQL?» — вопрос из категории Базы данных и SQL, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

ORDER BY — СОРТИРОВКА

  • Назначение: Упорядочивает (сортирует) строки результата запроса по одному или нескольким столбцам в возрастающем (ASC) или убывающем (DESC) порядке.
  • Результат: Количество строк в результате не меняется. Меняется только их порядок.
  • Использование с агрегатными функциями: Может применяться к результатам агрегации.
-- Сортировка сотрудников по зарплате (от высокой к низкой)
SELECT name, salary FROM employees ORDER BY salary DESC;

-- Сортировка по нескольким полям: сначала по отделу, потом по зарплате
SELECT department, name, salary FROM employees ORDER BY department ASC, salary DESC;

GROUP BY — ГРУППИРОВКА

  • Назначение: Объединяет строки, имеющие одинаковые значения в указанных столбцах, в одну сводную строку (группу). Используется вместе с агрегатными функциями (COUNT(), SUM(), AVG(), MAX(), MIN()).
  • Результат: Количество строк уменьшается (до одной строки на каждую уникальную комбинацию значений в GROUP BY).
  • Фильтрация групп: Для фильтрации групп (а не отдельных строк) используется HAVING (аналог WHERE для групп).
-- Подсчет количества сотрудников в каждом отделе
SELECT department, COUNT(*) as employee_count FROM employees GROUP BY department;

-- Нахождение средней зарплаты по отделам, где она больше 50000
SELECT department, AVG(salary) as avg_salary 
FROM employees 
GROUP BY department 
HAVING AVG(salary) > 50000;

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

-- Количество сотрудников по отделам, отсортированное по убыванию количества
SELECT department, COUNT(*) as emp_count 
FROM employees 
GROUP BY department 
ORDER BY emp_count DESC;