Використовуючи SQL, ви, ймовірно, використовували WHERE для фільтрації рядків. Але що робити, якщо вам потрібно фільтрувати групи даних замість окремих рядків? Ось де вступає в гру оператор HAVING!
Давайте розглянемо це просто і зрозуміло.
Що таке HAVING в SQL?
Оператор HAVING фільтрує згруповані дані після операції GROUP BY. В той час як WHERE працює з окремими рядками до групування, HAVING фільтрує групи після агрегації.
Основний приклад:
SELECT department, COUNT(*) AS employeecount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;_
✅ Це залишає лише департаменти з більш ніж 5 працівниками.
Ключові випадки використання HAVING
1. Фільтрування груп за допомогою агрегатних функцій
Припустимо, у нас є таблиця замовлень і ми хочемо знайти клієнтів, які витратили більше $500 в сумі:
SELECT customerid, SUM(orderamount) AS totalspent
FROM orders
GROUP BY customerid
HAVING SUM(order_amount) > 500;
✅ Залишає лише клієнтів, у яких загальна сума замовлень перевищує $500.
2. Виключення груп, що містять певні значення
А тепер, що якщо ви хочете ігнорувати групи, що містять певне значення?
Приклад: Виключити продукти з скасованими замовленнями
SELECT productid, COUNT(*) AS totalorders
FROM orders
GROUP BY product_id
HAVING SUM(CASE WHEN status = 'Cancelled' THEN 1 ELSE 0 END) = 0;
✅ Залишає лише продукти, які ніколи не були скасовані.
Приклад: Ігнорувати клієнтів з неуспішними платежами
SELECT customerid
FROM orders
GROUP BY customerid
HAVING MAX(payment_status) != 'Failed';
✅ Виключає клієнтів, у яких був хоча б один неуспішний платіж.
3. Фільтрування груп за кількома умовами
Також можна комбінувати умови за допомогою AND і OR.
Приклад: Залишити лише категорії з більше ніж 10 продуктами та середньою ціною вище $100
SELECT category, COUNT() AS productcount, AVG(price) AS avgprice
FROM products
GROUP BY category
HAVING COUNT() > 10 AND AVG(price) > 100;
✅ Залишає лише категорії з хоча б 10 продуктами І середньою ціною більше $100.
4. Ігнорування груп, що містять дублікати значень
Якщо ви хочете фільтрувати за кількістю унікальних значень у стовпці, використовуйте COUNT(DISTINCT column_name).
Приклад: Знайти користувачів, які здійснили більше одного типу транзакцій
SELECT userid
FROM transactions
GROUP BY userid
HAVING COUNT(DISTINCT transaction_type) > 1;
✅ Залишає лише користувачів, які виконали кілька типів транзакцій.
WHERE vs. HAVING: Коли використовувати що?
✅ Золоте правило: використовуйте WHERE для окремих рядків і HAVING для згрупованих даних.
Приклад комбінування WHERE і HAVING
SELECT department, COUNT() AS employees
FROM employees
WHERE salary > 50000 -- Фільтрує до агрегації
GROUP BY department
HAVING COUNT() > 5; -- Фільтрує після агрегації
✅ Спочатку фільтрує низькі зарплати, а потім залишає лише великі департаменти.
Where vs Having usage
Заключні думки
Оператор HAVING є потужним при роботі з згрупованими даними. Ось що ми покрили:
✔ Фільтруйте групи за агрегатними значеннями (SUM(), COUNT(), тощо)
✔ Виключайте групи, що містять певні значення (наприклад, ігнорування скасованих замовлень)
✔ Використовуйте кілька умов з AND і OR
✔ Фільтруйте за унікальними значеннями з COUNT(DISTINCT column)
✔ Знайте, коли використовувати HAVING і WHERE
Тепер ви знаєте, як використовувати HAVING як професіонал! Спробуйте ці запити у своїй базі даних і побачте, як це працює.
Бажаєте вивчити більш складні техніки SQL? Дайте знати в коментарях! 🚀
Перекладено з: Mastering ‘Having’ Clause in SQL: Filtering Groups Smart Way