Значение агрегатной функции можно вычислять не по всем строкам, полученным после соединения таблиц и применения условий WHERE
, а по группе строк. Примером такой задачи может служить поиск минимальной стоимости для каждого товара по всем магазинам.
Для выполнения группировки строк необходимо добавить предложение GROUP BY
после предложений FROM
и WHERE
. Синтаксис:
GROUP BY выражение1, выражение2...
Если в запросе использована конструкция GROUP BY
, то в результат запроса попадет ровно одна строка на каждый уникальный набор значений выражений. В списке выборки SELECT
можно использовать выражения из GROUP BY
и агрегатные функции, которые вычислят значения по строкам, попавшим в группу.
Рассмотрим пример. Определим количество товаров в каждой категории. Для начала посмотрим на данные таблицы товаров:
SELECT category_id, product_id, name
FROM product
ORDER BY category_id
category_id | product_id | name |
---|---|---|
3 | 1 | Пылесос S6 |
3 | 2 | Холодильник A2 |
5 | 12 | Nikon D750 |
5 | 11 | Lord Nikon 95 |
6 | 5 | Xbox |
6 | 3 | Nintendo |
6 | 4 | PlayStation |
7 | 6 | Наушники S3 |
Выполним группировку по category_id
и выведем количество записей в каждой категории:
SELECT category_id,
count(*) AS count_products
FROM product
GROUP BY category_id
category_id | count_products |
---|---|
3 | 2 |
5 | 2 |
6 | 3 |
7 | 1 |
Как получился такой результат?
- Определяются все уникальные значения
category_id
. На наших данных это 3, 5, 6 и 7. Таким образом в результате запроса будет ровно 4 строки. - Для вычисления значений агрегатных функций для каждого значения
category_id
выбираются соответствующие строки из результата запроса после выполнения соединений воFROM
и применения ограниченийWHERE
. В нашем случае соединения иWHERE
отсутствуют, поэтому выбираются данные из исходной таблицыproduct
.