💻 Примеры: HAVING в действии
⚡ Кратко
HAVING COUNT(*) > 2— группы больше двух строк.WHERE ... GROUP BY ... HAVING ...— комбинированная фильтрация.- Агрегаты в
HAVING—COUNT,SUM,AVG,MIN,MAX.
Пример 1. Поставщики с более чем двумя продуктами
SELECT supplier_ids, COUNT(id) AS product_count
FROM products
GROUP BY supplier_ids
HAVING COUNT(id) > 2
ORDER BY product_count DESC;
Группируем продукты по поставщику и оставляем только тех, у кого больше двух товаров.
Пример 2. Несколько условий в HAVING
SELECT standard_cost, list_price, COUNT(product_name) AS product_count
FROM products
GROUP BY standard_cost, list_price
HAVING COUNT(product_name) > 1
ORDER BY product_count DESC, standard_cost;
Находим пары «себестоимость—цена продажи», которые встречаются более одного раза.
Пример 3. WHERE + HAVING
SELECT standard_cost, COUNT(product_name) AS product_count
FROM products
WHERE LOWER(quantity_per_unit) LIKE '%oz%'
GROUP BY standard_cost
HAVING COUNT(product_name) > 2
ORDER BY product_count DESC;
Сначала отбираем продукты с упаковкой в унциях, затем группируем по себестоимости и оставляем группы с более чем двумя продуктами.
Пример 4. Средняя оценка по курсам
SELECT course_id, AVG(score) AS avg_score, COUNT(*) AS attempts
FROM exam_results
GROUP BY course_id
HAVING AVG(score) >= 70 AND COUNT(*) >= 10
ORDER BY avg_score DESC;
Выбираем курсы, где средний балл не ниже 70 и есть хотя бы 10 попыток сдачи.
Пример 5. Диапазон цен в группе
SELECT category_id,
MIN(list_price) AS min_price,
MAX(list_price) AS max_price,
MAX(list_price) - MIN(list_price) AS price_range
FROM products
GROUP BY category_id
HAVING price_range > 100
ORDER BY price_range DESC;
Находим категории с разбросом цен более 100. Обратите внимание: в некоторых СУБД нельзя использовать алиас price_range в HAVING, тогда повторяем выражение: HAVING MAX(list_price) - MIN(list_price) > 100.