Для чего в SQL используется оператор HAVING и чем он отличается от WHERE?

«Для чего в SQL используется оператор HAVING и чем он отличается от WHERE?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор 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 — для наложения условий на итоговые результаты группировки.