Ответ
Оператор HAVING используется для фильтрации результатов агрегации, сгруппированных оператором GROUP BY. В отличие от WHERE, который фильтрует строки до группировки, HAVING применяется после неё и может использовать агрегатные функции.
Пример: Выбрать отделы с более чем 5 сотрудниками.
SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;
Ключевые отличия от WHERE:
- Порядок выполнения:
WHERE→GROUP BY→HAVING. - Контекст:
HAVINGработает с агрегированными значениями (результатамиCOUNT,SUM,AVG), аWHERE— с отдельными строками таблицы. - Совместное использование: Их можно комбинировать в одном запросе.
Пример с WHERE и HAVING: Найти среднюю зарплату по отделам для сотрудников, нанятых после 2020 года, где средняя зарплата превышает 50 000.
SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING AVG(salary) > 50000; Ответ 18+ 🔞
А, ну ты смотри, опять про эту вашу SQL-магию. HAVING, блядь. Ну слушай, сейчас объясню, как есть, без этих ваших заумных учебников.
Представь себе, ты начальник цеха. У тебя там рабочие, отделы, всё как у людей. WHERE — это ты стоишь на проходной и отсеиваешь мудаков, которые на работу опоздали или без каски. То есть, фильтруешь каждого по отдельности, до того, как они по цехам разойдутся.
А вот HAVING — это уже другая, блядь, история. Рабочие разошлись по своим конурам, ты их сгруппировал по отделам (GROUP BY), посчитал, кто сколько булок за смену сделал. И вот ты смотришь на сводку: «Цех №1 — 1000 булок, Цех №2 — 5 булок». И тут ты такой: «А Цех №2 нахуй не нужен, который 5 булок сделал». Вот это фильтрация после группировки — это и есть HAVING. Он смотрит не на отдельных работяг, а на итоги по всему отделу.
Короче, пример: Найти отделы, где работяг больше пяти, а то мало ли, один сидит и кофе хлебает.
SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;
Видишь? COUNT(*) — это агрегатная функция, результат группировки. WHERE с ней работать не может, он на этапе проходной. А HAVING — запросто, он уже начальник, сводки читает.
А теперь главное, блядь, отличие, чтоб в голове осело:
- Порядок, ёпта! Сначала
WHEREотсеивает строки (каждого лентяя по отдельности), потомGROUP BYкучкует, а уж потомHAVINGрешает, какие кучки оставить, а какие нахуй послать. - Контекст — всё!
HAVINGможет трогать только то, что получилось послеGROUP BY— средние зарплаты (AVG), суммы (SUM), количество (COUNT).WHEREже щупает конкретные поля в исходных данных: зарплату конкретного Васи, дату приёма конкретной Маши. - Их можно вместе! Это не взаимоисключающие параграфы. Сначала отфильтруй старых болванов, потом сгруппируй, а потом отсеки те отделы, что мало зарабатывают.
Вот, смотри, реальная задача: Найти отделы, где средняя зарплата у тех, кого взяли после 2020 года, больше 50 тыщ. То есть, сначала отсекаем старую гвардию (WHERE), потом смотрим, что в среднем по палате (GROUP BY), а потом говорим: «Нет, отдел маркетинга, где в среднем 30к — иди нахуй» (HAVING).
SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING AVG(salary) > 50000;
Вот и вся философия. WHERE — это проходная, HAVING — это планерка начальства, где решают, какой отдел закрывать. Понял теперь, или тебе ещё раз, медленнее, с бубном?