После выполнения группировки можно исключать строки из результата выполнения запроса. Для этого в SQL
есть предложение HAVING
, предназначение которого аналогично предложению WHERE
, только работает с группами строк.
Так как HAVING
работает с группами строк, то в условиях отсечения используют агрегатные функции вместо значений столбцов (можно использовать выражения из GROUP BY
, но проще и эффективней это сделать в WHERE
).
Например найдем категории товаров, в которых только один товар. Все товары:
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 |
Посчитаем количество товаров в каждой категории:
SELECT category_id,
count(*)
FROM product
GROUP BY category_id
ORDER BY category_id
category_id | count |
---|---|
3 | 2 |
5 | 2 |
6 | 3 |
7 | 1 |
Оставим категории, в которых только один продукт:
SELECT category_id,
count(*)
FROM product
GROUP BY category_id
HAVING count(*) = 1
ORDER BY category_id
category_id | count |
---|---|
7 | 1 |
Стоит отметить, что использованные в HAVING
агрегатные функции нет необходимости использовать в списке выборки. Например, выведем только идентификатор категории товаров:
SELECT category_id
FROM product
GROUP BY category_id
HAVING count(*) = 1
ORDER BY category_id
category_id |
---|
7 |