Розуміння клауз WHERE та HAVING у SQL

WHERE та HAVING є важливими складовими SQL, які використовуються для фільтрації даних на різних етапах виконання запитів. Розуміння різниці між ними є ключовим для написання ефективних та точних SQL запитів. Нижче надано детальне пояснення обох клауз, з прикладами, ключовими відмінностями та поширеними помилками.

pic

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

pic

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

Leave a Reply

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