TGViewer
SQL Ready | Базы Данных SQL Ready | Базы Данных @sql_ready · 17.5K subscribers
Post #1726 3.07K
WHERE vs HAVING — фильтрация строк и фильтрация групп!

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

Представим таблицу заказов:
orders(id, customer_id, amount)


Нужно выбрать заказы дороже 100.

Корректный и очевидный вариант:
SELECT *
FROM orders
WHERE amount > 100;


WHERE применяется до агрегации и фильтрует отдельные строки исходной таблицы.

Теперь другая задача: найти клиентов, у которых сумма всех заказов больше 1000.

Интуитивная, но неверная попытка:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
WHERE SUM(amount) > 1000
GROUP BY customer_id;


Этот запрос некорректен: агрегатные функции не могут использоваться в WHERE, потому что на момент применения WHERE агрегатов ещё не существует.

Правильный вариант — HAVING:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;


HAVING применяется после GROUP BY и фильтрует уже сформированные группы.

Важно понимать разницу по этапам: WHERE — фильтрует строки до группировки; GROUP BY — формирует группы; HAVING — фильтрует группы; SELECT — формирует итоговый результат.

Частая оптимизационная ошибка — переносить условия из WHERE в HAVING без необходимости:
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id
HAVING amount > 100;


Такой запрос либо не выполнится, либо будет логически неверным: amount — это поле строки, а HAVING работает с группой.

Корректный и оптимальный вариант — комбинировать:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
WHERE amount > 100
GROUP BY customer_id
HAVING SUM(amount) > 1000;


Здесь: WHERE отсекает мелкие заказы до агрегации (меньше данных); HAVING проверяет условие на уровне группы.

🔥 Используй WHERE для фильтрации строк и HAVING — только для условий на агрегаты и группы. Это влияет не только на корректность, но и на производительность запроса

➡️ SQL Ready | #практика
  • 🔥 21
  • 👍 16
  • ❤ 12
  • 🤝 1
More from @sql_ready
  1. Oct 7, 2026📂 Шпаргалка по паттернам распределённых систем! Например, Replication повышает доступност…
  2. Oct 6, 2026Проверяйте связи с учётом периода! В PostgreSQL 18 связь может учитывать ещё и период его…
  3. Oct 6, 2026⚡️5 фундаментальных курсов по ИБ по цене одного Это предложение для тех, кто готов войти в…
  4. Oct 6, 2026👍 Устройство PostgreSQL — подробная документация на русском языке! Материалы посвящены не…
  5. Oct 5, 2026COUNT(*) в PostgreSQL: MVCC, visibility map и стоимость выполнения! В PostgreSQL точный CO…
  6. Oct 5, 2026Как оплачивать зарубежные сервисы в 2026 году? Можно бегать между посредниками и бояться б…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →