0Pricing
SQL Academy · Урок

HAVING и WHERE

Различайте HAVING, который фильтрует группы, и WHERE, который фильтрует строки, и правильно применяйте их в одном запросе

«HAVING и WHERE» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Два этапа фильтрации

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

Пример WHERE

WHERE фильтрует исходные строки. Он не видит агрегатные значения:

-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;

Пример HAVING

HAVING фильтрует группы. Он может обращаться к агрегатным значениям:

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5;     -- only users with ≥ 5 orders

Объединение WHERE и HAVING

Оба условия могут присутствовать в одном запросе:

SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;

Не помещайте агрегатные функции в WHERE

Планировщик выполняет WHERE до группировки — агрегатные значения еще недоступны:

-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5         -- ERROR
GROUP BY user_id;

-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;

Переносите предикаты в WHERE, когда это возможно

WHERE фильтрует строки до группировки, поэтому в агрегацию попадает меньше строк. Используйте HAVING только для условий, которые нельзя выразить через WHERE.

-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);

-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;

Логический порядок выполнения

Концептуальный порядок:

  1. FROM — выбрать таблицы и выполнить соединение
  2. WHERE — отфильтровать строки
  3. GROUP BY — сформировать группы
  4. HAVING — отфильтровать группы
  5. SELECT — выбрать столбцы
  6. ORDER BY — отсортировать результат
  7. LIMIT — выбрать первые N строк

HAVING без GROUP BY

HAVING можно использовать без GROUP BY — вся таблица становится одной группой:

SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000;       -- prints only if total over 1M

Псевдонимы в HAVING

Некоторые базы данных позволяют обращаться в HAVING к псевдонимам из SELECT: PostgreSQL и MySQL это поддерживают, а стандартный SQL — нет. Для наибольшей переносимости повторите агрегатное выражение:

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5;       -- portable
-- HAVING order_count >= 5  -- works in PG / MySQL

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

Используйте HAVING для составных условий по агрегатным значениям:

SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;

Замечание о производительности

Фильтр по агрегатному значению в HAVING не может использовать индексы так же, как условие WHERE по столбцу. Перенесите в WHERE все условия, которые возможно.

Итоги

WHERE = фильтрация строк. HAVING = фильтрация групп.

  • Агрегатные функции используют только в HAVING, но никогда не в WHERE
  • Переносите предикаты в WHERE для ускорения запроса
  • Используйте оба условия, когда это необходимо

Быстрая проверка

Вам нужны пользователи, разместившие более 10 заказов. Какое условие это отфильтрует?

Часто задаваемые вопросы

Урок «HAVING и WHERE» бесплатный?

Да — полный текст урока «HAVING и WHERE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «HAVING и WHERE»?

Различайте HAVING, который фильтрует группы, и WHERE, который фильтрует строки, и правильно применяйте их в одном запросе Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «HAVING и WHERE»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. COUNT, SUM, AVG, MIN, MAX
  2. GROUP BY для одного и нескольких столбцов
  3. HAVING и WHERE
  4. Распространённые ошибки: NULL в агрегатах
← Назад к SQL Academy