🐛 Типичные ошибки: 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.