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

HAVING

После выполнения группировки можно исключать строки из результата выполнения запроса. Для этого в SQL есть предложение HAVING, предназначение которого аналогично предложению WHERE, только работает с группами строк.

Так как HAVING работает с группами строк, то в условиях отсечения используют агрегатные функции вместо значений столбцов (можно использовать выражения из GROUP BY, но проще и эффективней это сделать в WHERE).

Например найдем категории товаров, в которых только один товар. Все товары:

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

Посчитаем количество товаров в каждой категории:

SELECT category_id,
       count(*)
  FROM product
 GROUP BY category_id
 ORDER BY category_id
category_idcount
32
52
63
71

Оставим категории, в которых только один продукт:

SELECT category_id,
       count(*)
  FROM product
 GROUP BY category_id
HAVING count(*) = 1
 ORDER BY category_id
category_idcount
71

Стоит отметить, что использованные в HAVING агрегатные функции нет необходимости использовать в списке выборки. Например, выведем только идентификатор категории товаров:

SELECT category_id
  FROM product
 GROUP BY category_id
HAVING count(*) = 1
 ORDER BY category_id
category_id
7
    ПредыдущаяСледующая