Ответ
Оператор HAVING используется в SQL для фильтрации результатов после выполнения агрегации, заданной оператором GROUP BY. В то время как WHERE фильтрует строки до группировки и агрегации.
Ключевое отличие:
WHEREприменяется к отдельным строкам и не может содержать агрегатные функции (SUM, AVG, COUNT).HAVINGприменяется к группам строк и обязательно используется с агрегатными функциями или для фильтрации по сгруппированным столбцам.
Пример SQL-запроса:
-- Найти отделы, где средняя зарплата превышает 50000
SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2020-01-01' -- Фильтрация ДО группировки
GROUP BY department
HAVING AVG(salary) > 50000; -- Фильтрация ПОСЛЕ группировки
Пример использования в Java (JDBC):
String sql = """
SELECT department, COUNT(*) as emp_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 10
""";
try (PreparedStatement stmt = connection.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
System.out.printf("Dept: %s, Employees: %d%n",
rs.getString("department"),
rs.getInt("emp_count"));
}
}
Практическое правило: используй WHERE для фильтрации исходных данных, а HAVING — для наложения условий на итоговые результаты группировки.