← К оглавлению занятия

💻 Примеры: HAVING в действии

⚡ Кратко

  • HAVING COUNT(*) > 2 — группы больше двух строк.
  • WHERE ... GROUP BY ... HAVING ... — комбинированная фильтрация.
  • Агрегаты в HAVINGCOUNT, 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.