Чем GROUP BY отличается от ORDER BY в SQL?
Я новичок и путаю GROUP BY и ORDER BY — оба идут в конце запроса и оба «по столбцу». В чём разница между GROUP BY и ORDER BY? Когда нужен один, а когда другой?
2 ответа
Это совершенно разные вещи, несмотря на похожий синтаксис.
- ORDER BY — сортирует строки (меняет их порядок), но число строк не меняется. Все строки остаются, просто выстраиваются по возрастанию/убыванию.
- GROUP BY — схлопывает строки в группы по одинаковому значению, уменьшая их количество, чтобы посчитать агрегаты (COUNT, SUM, AVG) по каждой группе.
Сравните на примере таблицы заказов.
ORDER BY — все заказы, отсортированные по сумме:
SELECT customer_id, total
FROM orders
ORDER BY total DESC;
Строк столько же, сколько заказов.
GROUP BY — по одной строке на покупателя с числом его заказов:
SELECT customer_id, COUNT(*) AS cnt
FROM orders
GROUP BY customer_id;
Строк столько, сколько уникальных покупателей.
Их часто используют вместе: сгруппировать, а потом отсортировать группы:
SELECT customer_id, COUNT(*) AS cnt
FROM orders
GROUP BY customer_id
ORDER BY cnt DESC;
Порядок в запросе фиксирован: GROUP BY идёт раньше ORDER BY. Запомнить легко: GROUP BY — про «сколько в каждой группе», ORDER BY — про «в каком порядке показать».
Бытовая аналогия. ORDER BY — это расставить книги на полке по алфавиту: книг столько же, поменялся только порядок. GROUP BY — это разложить книги по жанрам и сказать, сколько книг в каждом жанре: вместо сотни книг получаете несколько строк-жанров с числами. Первое не теряет данные, второе — обобщает их.