English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете, как фильтровать результаты GROUP BY.
HAVING子句通常与GROUP BY子句一起使用,以指定组或集合的过滤条件。HAVING子句只能与SELECT语句一起使用。
为了容易理解这一点,让我们来看看下面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 | +---------+------------------+ | |
Таблица: employees | Таблица: departments |
Теперь не только ищем имена сотрудников и их отделов, но и имена отделов без сотрудников.
Для небольших таблиц можно просто применить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 ähnelt dem WHERE-преположению, aber es gilt nur für целые группы, аWHEREпредложение применяется только к отдельным строкам.