HAVING — это оператор SQL, который позволяет фильтровать группы данных, созданные с помощью GROUP BY. Он выполняет ту же роль, что и WHERE, но с тем отличием, что WHERE фильтрует строки до их группировки, а HAVING — после.
Когда использовать HAVING
WHERE используется для фильтрации отдельных строк данных, до того как они сгруппированы. Он не может работать с агрегатными функциями (COUNT, SUM, AVG, и т.д.), потому что на этапе WHERE данных ещё не сгруппированы.
HAVING применяется после группировки, чтобы ограничить результативные группы на основе условий, в том числе с использованием агрегатных функций.
Синтаксис HAVING
SELECT столбец1, агрегатная_функция(столбец2) FROM таблица GROUP BY столбец1 HAVING условие;
Пример использования HAVING
Рассмотрим таблицу сотрудников employees:
Задача: Найти отделы с количеством сотрудников больше одного
Чтобы определить, в каких отделах работает более одного сотрудника, мы можем использовать HAVING:
SELECT department, COUNT(employee_id) AS num_employees FROM employees GROUP BY department HAVING num_employees > 1;
Результат:
| department |
num_employees |
| Sales |
2 |
| IT |
2 |
В данном примере запрос:
- Группирует сотрудников по отделам.
- Вычисляет количество сотрудников в каждом отделе.
- Затем фильтрует только те группы (отделы), где количество сотрудников больше одного.
Использование HAVING с агрегатными функциями
HAVING позволяет использовать условия, основанные на результатах агрегатных функций.
Пример 2: Отделы со средней зарплатой более 4000
Чтобы узнать, в каких отделах средняя зарплата сотрудников больше 4000, можно написать следующий запрос:
SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING avg_salary > 4000;
Результат:
| department |
avg_salary |
| IT |
5100 |
| Marketing |
4500 |
Здесь HAVING использует AVG(salary), чтобы оставить только те отделы, где средняя зарплата превышает 4000.
Использование HAVING с несколькими условиями
HAVING может использовать несколько условий, соединенных с помощью AND или OR, как и WHERE.
Пример 3: Найти отделы с более чем одним сотрудником и средней зарплатой более 4000
SELECT department, COUNT(employee_id) AS num_employees, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING num_employees > 1 AND avg_salary > 4000;
Результат:
| department |
num_employees |
avg_salary |
| IT |
2 |
5100 |
В этом запросе HAVING фильтрует группы, оставляя только те, где:
- Количество сотрудников больше одного.
- Средняя зарплата превышает 4000.
Различие между WHERE и HAVING
WHERE — фильтрация строк перед группировкой, можно использовать для фильтрации по значениям столбцов.
HAVING — фильтрация после группировки, применяется для агрегатных значений и групп.
Выводы
HAVING используется для фильтрации данных на уровне групп.
- Он особенно полезен для создания отчётов и анализа данных на основе сгруппированных значений.
HAVING может использоваться с несколькими условиями и позволяет применять агрегатные функции для ограничения выборки после группировки.