← Назад к вопросам

В чем разница между командами WHERE и HAVING в SQL?

2.0 Middle🔥 251 комментариев
#SQL и базы данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

WHERE vs HAVING: различия в фильтрации данных

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

WHERE — фильтрация на уровне строк

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

Как работает:

  • Проверяет каждую строку таблицы
  • Отбирает только те строки, которые удовлетворяют условию
  • Работает до GROUP BY и агрегирующих функций
  • Может использовать только колонки из исходной таблицы
SELECT department, COUNT(*) as count
FROM employees
WHERE salary > 50000  -- Фильтрует строки ДО агрегирования
GROUP BY department;

В этом примере WHERE сначала отбирает только сотрудников с зарплатой больше 50000, а затем подсчитывает их по отделам.

HAVING — фильтрация на уровне групп

HAVING применяется после агрегирования и фильтрует группы на основе условий агрегирующих функций. Это вторая стадия фильтрации, работающая с результатами GROUP BY.

Как работает:

  • Проверяет каждую группу (результат GROUP BY)
  • Отбирает только те группы, которые удовлетворяют условию
  • Работает после GROUP BY и агрегирующих функций
  • Может использовать агрегирующие функции (COUNT, SUM, AVG и т.д.)
SELECT department, COUNT(*) as count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;  -- Фильтрует группы ПОСЛЕ агрегирования

Здесь HAVING отбирает только те отделы, в которых 5 и более сотрудников.

Сравнительная таблица

ПараметрWHEREHAVING
Когда применяетсяДО GROUP BYПОСЛЕ GROUP BY
Что фильтруетОтдельные строкиГруппы строк
Может использоватьКолонки таблицыАгрегирующие функции
Может использовать агрегирующие функцииНетДа
ПроизводительностьБыстрее (меньше обработано данных)Медленнее (агрегирование включено)

Практические примеры

Пример 1: Фильтрация сотрудников и их отделов

-- Найти отделы, где есть сотрудники с зарплатой > 60000,
-- и в отделе минимум 3 человека
SELECT 
    department,
    COUNT(*) as total_employees,
    AVG(salary) as avg_salary
FROM employees
WHERE salary > 60000         -- Сначала отбираем только высокооплачиваемых
GROUP BY department
HAVING COUNT(*) >= 3;        -- Потом отбираем отделы с 3+ такими людьми

Пример 2: Анализ продаж

-- Найти товары, которые продавались больше 100 раз
-- и сумма продаж каждого товара > $10,000
SELECT 
    product_id,
    COUNT(*) as sales_count,
    SUM(amount) as total_sales
FROM orders
WHERE order_date >= 2024-01-01  -- WHERE: только заказы с начала года
GROUP BY product_id
HAVING SUM(amount) > 10000;       -- HAVING: только товары с суммой > 10K

Порядок выполнения SQL-запроса

Важно помнить последовательность выполнения:

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

Оптимизация производительности

  • Используйте WHERE для максимально ранней фильтрации — это снижает объём данных, которые нужно обрабатывать
  • Используйте HAVING только для фильтрации групп после агрегирования
  • Если возможно, комбинируйте оба условия: WHERE для строк, HAVING для групп
В чем разница между командами WHERE и HAVING в SQL? | PrepBro