Значение агрегатной функции можно вычислять не по всем строкам, полученным после соединения таблиц и применения условий 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.