← К оглавлению занятия

🐛 Типичные ошибки: HAVING

⚡ Топ-3 ошибки

  • Агрегат в WHERE вместо HAVING.
  • HAVING без GROUP BY там, где нужна группировка.
  • Использование алиаса столбца в HAVING в строгих СУБД.

Ошибка 1. Агрегат в WHERE

Неправильно:

SELECT supplier_ids, COUNT(id)
FROM products
WHERE COUNT(id) > 2  -- Ошибка!
GROUP BY supplier_ids;

Почему ошибка: на момент выполнения WHERE группы ещё не сформированы, поэтому агрегатные функции там недоступны.

Правильно:

SELECT supplier_ids, COUNT(id)
FROM products
GROUP BY supplier_ids
HAVING COUNT(id) > 2;

Ошибка 2. HAVING без GROUP BY

Сомнительно:

SELECT COUNT(*) FROM orders HAVING COUNT(*) > 10;

Запрос синтаксически корректен, но группировка неявная: вся таблица — одна группа. Такой подход редко нужен и сбивает с толку. Явно добавляйте GROUP BY, если работаете с группами.

Ошибка 3. Алиас в HAVING

Работает в MySQL, но не везде:

SELECT category_id, COUNT(*) AS cnt
FROM products
GROUP BY category_id
HAVING cnt > 2;  -- Может не сработать в PostgreSQL / SQL Server

Переносимый вариант:

SELECT category_id, COUNT(*) AS cnt
FROM products
GROUP BY category_id
HAVING COUNT(*) > 2;

Ошибка 4. Забыть условие в WHERE

Использование HAVING для фильтрации строк вместо WHERE заставляет СУБД группировать лишние данные:

-- Медленнее: группируем все строки
SELECT category_id, COUNT(*)
FROM products
GROUP BY category_id
HAVING category_id != 0;

-- Быстрее: отсекаем строки до группировки
SELECT category_id, COUNT(*)
FROM products
WHERE category_id != 0
GROUP BY category_id;

Ошибка 5. Столбец в SELECT вне GROUP BY

SELECT category_id, product_name, COUNT(*)
FROM products
GROUP BY category_id;  -- Ошибка в строгом режиме

Все неагрегированные столбцы в SELECT должны быть в GROUP BY.