Агрегатные функции и GROUP BY: считаем заказы и выручку — и разбираем вопрос собеседований про WHERE vs HAVING.
Иногда нужны не сами строки, а итог по ним: сколько, сумма, среднее. Это агрегатные функции:
| Функция | Что делает |
|---|---|
COUNT(*) | число строк |
SUM(x) | сумма |
AVG(x) | среднее |
MIN(x) / MAX(x) | минимум / максимум |
SELECT COUNT(*) FROM products; -- сколько товаров
SELECT AVG(price) FROM products; -- средняя ценаРезультат — одна строка с итогом, а не список товаров.
Можно считать несколько агрегатов сразу и давать колонкам имена через AS:
SELECT COUNT(*) AS total, MIN(price) AS cheapest FROM products;AS задаёт имя колонки в результате — так твой API отдаст аккуратный JSON вида { total: 6, cheapest: 300 }, а не { "COUNT(*)": 6 }. 😉
В проекте «Заметки» ты считал заметки через notes.length в JS. Пока их десять — норм. А если миллион — тащить все строки из БД ради длины безумие: COUNT(*) посчитает прямо в базе и вернёт одно число.
Одним запросом посчитай по products: число товаров products_count, среднюю цену avg_price и максимальную цену max_price.