← Все вопросы

Чем WHERE отличается от HAVING в SQL?

Задан 8 месяцев назад1.3к просмотров3 ответа
19

Постоянно путаю. Вроде оба фильтруют строки. Когда писать WHERE, а когда HAVING? Объясните на простом примере с таблицей orders.

3 ответа

31
✓ Принятый ответ — помог автору

Коротко: WHERE фильтрует строки ДО группировки, HAVING — после, уже по агрегатам.

WHERE работает с обычными столбцами и не видит COUNT(), SUM() и т.п. Если нужно отфильтровать по результату агрегата — это HAVING.

SELECT user_id, COUNT(*) AS cnt
FROM orders
WHERE status = 'paid'      -- сначала отбросили неоплаченные строки
GROUP BY user_id
HAVING COUNT(*) >= 3;       -- потом оставили только тех, у кого 3+ заказа

Правило: условие по отдельной строке — WHERE; условие по группе/агрегату — HAVING.

Boris Britva а можно в HAVING писать обычный столбец? — можно, если он в GROUP BY, но смысла обычно нет · 8 месяцев назад
Вячеслав Леонтьев вот это «до и после группировки» наконец уложилось, спасибо 🙏 · 8 месяцев назад
8

WHERE — по строкам, HAVING — по группам.

-6

Они вообще взаимозаменяемые, пиши что хочешь.

Andrew France нет, это неверно: WHERE не умеет в агрегаты, COUNT(*) в нём не напишешь · 8 месяцев назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект