Оволодіння оператором ‘Having’ в SQL: Розумне фільтрування груп

Використовуючи 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 customer
id
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 customer
id
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 user
id
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; -- Фільтрує після агрегації

✅ Спочатку фільтрує низькі зарплати, а потім залишає лише великі департаменти.

pic

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

Leave a Reply

Your email address will not be published. Required fields are marked *