Статья Автор: Деникина Н.В., Деникин А.В.

HAVING для фильтрации групп

HAVING — это оператор SQL, который позволяет фильтровать группы данных, созданные с помощью GROUP BY. Он выполняет ту же роль, что и WHERE, но с тем отличием, что WHERE фильтрует строки до их группировки, а HAVING — после.

Когда использовать HAVING

  • WHERE используется для фильтрации отдельных строк данных, до того как они сгруппированы. Он не может работать с агрегатными функциями (COUNT, SUM, AVG, и т.д.), потому что на этапе WHERE данных ещё не сгруппированы.
  • HAVING применяется после группировки, чтобы ограничить результативные группы на основе условий, в том числе с использованием агрегатных функций.

Синтаксис HAVING

SELECT столбец1, агрегатная_функция(столбец2) FROM таблица GROUP BY столбец1 HAVING условие; 

Пример использования HAVING

Рассмотрим таблицу сотрудников employees:

employee_id name department age salary email
1 Alice Sales 28 3500 [email protected]
2 Bob IT 32 5000 [email protected]
3 Charlie Marketing 45 4500 NULL
4 Diana Sales 25 3000 [email protected]
5 Ethan IT 41 5200 [email protected]

Задача: Найти отделы с количеством сотрудников больше одного

Чтобы определить, в каких отделах работает более одного сотрудника, мы можем использовать HAVING:

SELECT department, COUNT(employee_id) AS num_employees FROM employees GROUP BY department HAVING num_employees > 1; 

Результат:

department num_employees
Sales 2
IT 2

В данном примере запрос:

  1. Группирует сотрудников по отделам.
  2. Вычисляет количество сотрудников в каждом отделе.
  3. Затем фильтрует только те группы (отделы), где количество сотрудников больше одного.

Использование HAVING с агрегатными функциями

HAVING позволяет использовать условия, основанные на результатах агрегатных функций.

Пример 2: Отделы со средней зарплатой более 4000

Чтобы узнать, в каких отделах средняя зарплата сотрудников больше 4000, можно написать следующий запрос:

SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING avg_salary > 4000; 

Результат:

department avg_salary
IT 5100
Marketing 4500

Здесь HAVING использует AVG(salary), чтобы оставить только те отделы, где средняя зарплата превышает 4000.

Использование HAVING с несколькими условиями

HAVING может использовать несколько условий, соединенных с помощью AND или OR, как и WHERE.

Пример 3: Найти отделы с более чем одним сотрудником и средней зарплатой более 4000

SELECT department, COUNT(employee_id) AS num_employees, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING num_employees > 1 AND avg_salary > 4000; 

Результат:

department num_employees avg_salary
IT 2 5100

В этом запросе HAVING фильтрует группы, оставляя только те, где:

  1. Количество сотрудников больше одного.
  2. Средняя зарплата превышает 4000.

Различие между WHERE и HAVING

  • WHERE — фильтрация строк перед группировкой, можно использовать для фильтрации по значениям столбцов.
  • HAVING — фильтрация после группировки, применяется для агрегатных значений и групп.

Выводы

  • HAVING используется для фильтрации данных на уровне групп.
  • Он особенно полезен для создания отчётов и анализа данных на основе сгруппированных значений.
  • HAVING может использоваться с несколькими условиями и позволяет применять агрегатные функции для ограничения выборки после группировки.
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать