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

Как получился такой результат?

  1. Определяются все уникальные значения category_id. На наших данных это 3, 5, 6 и 7. Таким образом в результате запроса будет ровно 4 строки.
  2. Для вычисления значений агрегатных функций для каждого значения category_id выбираются соответствующие строки из результата запроса после выполнения соединений во FROM и применения ограничений WHERE. В нашем случае соединения и WHERE отсутствуют, поэтому выбираются данные из исходной таблицы product.

4.4 Отсутствие строк

4.6 Дополнительные столбцы в списке выборки с GROUP BY