Предложение HAVING
в SQL указывает, что оператор SQL SELECT
должен возвращать только строки, агрегированные значения которых соответствуют указанным условиям .
HAVING
и WHERE
часто путают начинающих, но они служат разным целям. WHERE
учитывается на более раннем этапе выполнения запроса, фильтруя строки, прочитанные из таблиц. Если запрос содержит GROUP BY
, данные из таблиц группируются и агрегируются. После операции агрегирования HAVING
применяется фильтрация строк, не соответствующих указанным условиям. Следовательно, WHERE
применяется к данным, считываемым из таблиц, и HAVING
должен применяться только к агрегированным данным, которые неизвестны на начальном этапе запроса.
Чтобы просмотреть текущее состояние, сформированное GROUP BY
предложением, HAVING
оно используется. [ требуется разъяснение ]
Примеры
Чтобы вернуть список идентификаторов отделов, общий объем продаж которых превысил 1000 долларов США на 1 января 2000 г., а также сумму их продаж на этот день:
ВЫБОР DeptID , SUM ( SaleAmount ) FROM Sales WHERE SaleDate = '01-2000' - январь GROUP BY DeptID HAVING SUM ( SaleAmount ) > 1000
Обращаясь к таблице примеров в Join Например , следующий запрос возвращает список отделов , которые имеют более чем на 1 сотрудника:
ВЫБРАТЬ DepartmentName , COUNT ( * ) FROM Employee РЕГИСТРИРУЙТЕСЬ отдела ON Employee . DepartmentID = Отдел . DepartmentID ГРУППА ПО DepartmentName HAVING COUNT ( * ) > 1 ;
HAVING
удобно, но не обязательно. Код, эквивалентный приведенному выше примеру, но без использования HAVING
, может выглядеть так:
ВЫБОР * FROM ( SELECT , DepartmentName AS deptNam , COUNT ( * ) КАК empCnt ОТ Сотрудник AS EMP РЕГИСТРИРУЙТЕСЬ Отдел AS отдел ПО ОМУ . DepartmentID = отдел . DepartmentID GROUP BY deptNam ) КАК GRP ГДЕ GRP . empCnt > 1 ;