Агрегатные функции

GROUP BY

Значение агрегатной функции можно вычислять не по всем строкам, полученным после соединения таблиц и применения условий 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_idproduct_idname
31Пылесос S6
32Холодильник A2
512Nikon D750
511Lord Nikon 95
65Xbox
63Nintendo
64PlayStation
76Наушники S3

Выполним группировку по category_id и выведем количество записей в каждой категории:

SELECT category_id,
       count(*) AS count_products
  FROM product
 GROUP BY category_id
category_idcount_products
32
52
63
71

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

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