Какова разница между операторами SQL WHERE и HAVING?

Ответ

Операторы WHERE и HAVING в SQL используются для фильтрации данных, но применяются на разных этапах выполнения запроса и имеют разные области действия.

  • WHERE: Фильтрует отдельные строки до того, как они будут сгруппированы оператором GROUP BY. Он применяется к исходным данным и не может использовать агрегатные функции (такие как COUNT, SUM, AVG, MAX, MIN). Использование WHERE на этом этапе более эффективно, так как уменьшает объем данных, которые затем будут группироваться.

  • HAVING: Фильтрует группы строк после того, как они были сформированы оператором GROUP BY. Он применяется к результатам агрегатных функций и может использовать их в своих условиях.

Пример:

-- Выбрать отделы, где средняя зарплата сотрудников, получающих более 50000, превышает 60000
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 50000 -- Фильтрация отдельных сотрудников до группировки
GROUP BY department
HAVING AVG(salary) > 60000; -- Фильтрация групп по агрегированному значению

Ключевые отличия:

  1. Этап применения: WHERE — до GROUP BY; HAVING — после GROUP BY.
  2. Объект фильтрации: WHERE — отдельные строки; HAVING — группы строк.
  3. Использование агрегатных функций: WHERE — нет; HAVING — да.
  4. Эффективность: WHERE более эффективен для первичной фильтрации, так как сокращает объем данных для дальнейшей обработки.

Ответ 18+ 🔞

А, слушай, про эту парочку — WHERE и HAVING! Ну, блядь, вечная путаница у всех новичков, а на деле всё просто, как три копейки, если разобраться.

Представь себе, что ты — начальник цеха, а данные — это твои работяги. Так вот, WHERE — это ты стоишь на входе в цех и отсеиваешь мудаков сразу. «Ты — без опыта? Нахуй отсюда. Ты — пьяный? Вон, блядь, иди проспись». Это фильтрация каждого отдельного человека до того, как они вообще зайдут и начнут работать.

А HAVING — это уже когда они поработали, сгруппировались в бригады, и ты смотришь на результат работы всей группы. «Окей, бригада №1 — вы сделали в среднем по 10 деталей на рыло? Мало, блядь, расформировать! Бригада №2 — у вас общий брак больше 5%? Пиздец, всем премию снять!». Это фильтрация уже по итогам, по сводным цифрам.

Технически, вот как это выглядит:

-- Найдём отделы, где средняя зарплата у тех, кто получает больше 50к, — выше 60к
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 50000 -- Отфильтровали всех нищебродов до группировки
GROUP BY department
HAVING AVG(salary) > 60000; -- А теперь отфильтровали сами отделы по средней зп

Короче, главные отличия, чтобы не ебал мозг:

  1. Когда применяется: WHEREДО группировки (GROUP BY), HAVINGПОСЛЕ. Это, блядь, основа основ!
  2. Кого фильтрует: WHEREстроки поодиночке, HAVINGцелые группы.
  3. Можно ли использовать COUNT, SUM и прочую агрегацию: В WHEREни хуя нельзя, он же работает с сырыми данными. В HAVINGможно и нужно, он как раз для сводок и придуман.
  4. Что эффективнее: Всегда старайся отсеять лишнее через WHERE пораньше. Зачем тащить в группировку те данные, которые всё равно потом выкинешь? Это как таскать воду в решете — ебаться много, а толку ноль.

Запомни так: сначала WHERE отбрасывает мусор, потом GROUP BY кучкует оставшееся, а HAVING уже решает, какие из этих кучек годные, а какие — на помойку. Всё, вопрос закрыт, можно идти пить чай.