WHERE та HAVING є важливими складовими SQL, які використовуються для фільтрації даних на різних етапах виконання запитів. Розуміння різниці між ними є ключовим для написання ефективних та точних SQL запитів. Нижче надано детальне пояснення обох клауз, з прикладами, ключовими відмінностями та поширеними помилками.
1. Огляд клауз WHERE та HAVING
WHERE Clause:
Клаузу WHERE використовують для фільтрації рядків до того, як буде виконано групування чи агрегація. Вона застосовує умови безпосередньо до окремих рядків таблиці.HAVING Clause:
Клаузу HAVING використовують для фільтрації результатів після того, як була застосована клаузуGROUP BY
. Вона працює з агрегованими даними, такими як суми, середні значення або кількості.
2. WHERE Clause
Мета
WHERE клаузу використовують для визначення умов, яким повинні відповідати окремі рядки, щоб бути включеними до результату.
Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE condition;
Приклад 1: Просте фільтрування:
Фільтруємо працівників із зарплатою більшою за 50,000
SELECT emp_id, first_name, salary
FROM employees
WHERE salary > 50000;
Приклад 2: Кілька умов за допомогою AND/OR
Фільтруємо працівників, старших за 30 років та з зарплатою більше 50,000
SELECT emp_id, first_name, age, salary
FROM employees
WHERE age > 30 AND salary > 50000;
Ключові примітки до WHERE Clause
- У WHERE клаузі не можна використовувати агрегатні функції, такі як
SUM
,AVG
абоCOUNT
. - Вона працює на рівні рядків, фільтруючи сирі дані до будь-якого групування чи агрегації.
3. HAVING Clause
Мета
HAVING клаузу використовують для фільтрації агрегованих даних після застосування клаузи GROUP BY
.
Синтаксис
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
Приклад 1: Фільтрування агрегованих даних
Знайдемо департаменти, де середня зарплата більша за 60,000
SELECT department_name, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_name
HAVING AVG(salary) > 60000;
Приклад 2: Комбінування агрегатів з HAVING
Знайдемо департаменти, де загальна зарплата перевищує 150,000
SELECT department_name, SUM(salary) AS total_salary
FROM employees
GROUP BY department_name
HAVING SUM(salary) > 150000;
Ключові примітки до HAVING Clause
- HAVING клаузу необхідно використовувати з агрегованими даними.
- Агрегатні функції, такі як
SUM
,AVG
,COUNT
і інші, можна використовувати лише в HAVING клаузі, а не в WHERE. - Вона працює на рівні груп, фільтруючи дані після їх групування.
4. Ключові відмінності між WHERE та HAVING
5. Комбінування WHERE та HAVING
У багатьох запитах можна використовувати обидві клаузи WHERE та HAVING разом для фільтрації даних на різних етапах.
Приклад: Комбінування WHERE та HAVING
Знайдемо департаменти, де:
- Працівники, що заробляють менше 40,000, виключені.
- Загальна зарплата для решти працівників перевищує 150,000.
SELECT department_name, SUM(salary) AS total_salary
FROM employees
WHERE salary > 40000
GROUP BY department_name
HAVING SUM(salary) > 150000;
Пояснення:
- Клаузу
WHERE
використовують для виключення окремих рядків, де зарплата ≤ 40,000. - Клаузу
GROUP BY
використовують для групування решти рядків за департаментом. - Клаузу
HAVING
використовують для фільтрації департаментів, де загальна зарплата ≤ 150,000.
6. Поширені помилки, яких варто уникати
1. Використання агрегатних функцій у WHERE Clause
Агрегатні функції, такі як SUM
або AVG
, не можна використовувати в WHERE клаузі. Це викличе помилку:
SELECT department_name
FROM employees
WHERE SUM(salary) > 150000; -- Невірно
Замість цього використовуйте клаузу HAVING:
SELECT department_name, SUM(salary) AS total_salary
FROM employees
GROUP BY department_name
HAVING SUM(salary) > 150000;
Використання HAVING без GROUP BY
Хоча HAVING може працювати без GROUP BY, це рідко має сенс:
SELECT sum(salary)
FROM employees
HAVING sum(salary) > 50000; -- Технічно коректно, але не рекомендується
```
7. Найкращі практики
- Використовуйте WHERE для фільтрації сирих даних до групування чи агрегації.
- Використовуйте HAVING для фільтрації агрегованих результатів або згрупованих даних.
- Завжди комбінуйте WHERE та HAVING для складних запитів, щоб оптимізувати продуктивність.
- Перевіряйте умови в WHERE та HAVING, щоб уникнути небажаних результатів.
8. Резюме
- Клаузу WHERE використовують для фільтрації рядків до групування чи агрегації, працюючи з сирими даними.
- Клаузу HAVING використовують для фільтрації згрупованих або агрегованих даних після застосування клаузи GROUP BY.
- Комбінуйте WHERE та HAVING для складніших запитів, що включають фільтрацію на рівні рядків та груп.
- Уникайте поширених помилок, таких як використання агрегатних функцій у WHERE або неправильне використання HAVING без групування.
Перекладено з: Understanding WHERE and HAVING Clauses in SQL