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
может использоваться с несколькими условиями и позволяет применять агрегатные функции для ограничения выборки после группировки.