HAVING в SQL
Выражение HAVING
обычно используется вместе с GROUP BY
, чтобы задать условие фильтрации для группы.
Давайте рассмотрим следующие таблицы employees
и departments
:
Таблица employees |
Таблица departments |
+--------+--------------+------------+---------+ | emp_id | emp_name | hire_date | dept_id | +--------+--------------+------------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 4 | | 2 | Tony Montana | 2002-07-15 | 1 | | 3 | Sarah Connor | 2005-10-18 | 5 | | 4 | Rick Deckard | 2007-01-03 | 3 | | 5 | Martin Blank | 2008-06-24 | NULL | +--------+--------------+------------+---------+ |
+---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ |
Допустим, теперь, вместо того, чтобы найти только имена сотрудников и их отделы (это мы делали в прошлой статье), вы хотите узнать названия тех отделов, в которых нет сотрудников.
Для небольших таблиц можно использовать LEFT JOIN
и проверить каждый отдел «вручную». Но если в таблице больше тысячи сотрудников, то в такой ситуации лучше использовать выражение HAVING
вместе с GROUP BY
, например, так:
SELECT t1.dept_name, count(t2.emp_id) AS total_employees
FROM departments AS t1 LEFT JOIN employees AS t2
ON t1.dept_id = t2.dept_id
GROUP BY t1.dept_name
HAVING total_employees = 0;
Если вы выполните приведенный выше запрос, вы получите следующий результат:
+------------------+-----------------+ | dept_name | total_employees | +------------------+-----------------+ | Customer Service | 0 | +------------------+-----------------+
Примечание. Выражение
HAVING
— это какWHERE
, но применяется только к группам в целом, а не к отдельным строкам.
Примечание. В запросе
SELECT
могут содержаться и выражениеWHERE
, и выражениеHAVING
. В этом случае выражениеWHERE
должно стоять передGROUP BY
, а выражениеHAVING
— после него, но передORDER BY
.