Ответ
Основное различие заключается в этапе выполнения запроса, на котором применяется фильтрация.
- WHERE — фильтрует отдельные строки до группировки (оператор
GROUP BY). Он работает с данными на уровне записей таблицы. - HAVING — фильтрует после группировки. Он работает с агрегированными результатами, такими как
COUNT(),SUM(),AVG().
Практический пример для тестировщика: При проверке отчетов или анализе данных часто нужно убедиться, что группировка и фильтрация работают корректно.
-- WHERE: Исключаем тестовые заказы (status = 'test') перед подсчетом суммы по клиентам.
SELECT customer_id, SUM(amount)
FROM orders
WHERE status != 'test'
GROUP BY customer_id;
-- HAVING: Находим клиентов, у которых общая сумма заказов превышает лимит для проверки бизнес-правила.
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 10000;
-- Комбинирование: Сначала фильтруем строки, затем группируем, затем фильтруем группы.
SELECT customer_id, COUNT(*) as order_count
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) > 5;
Ключевое правило для запоминания: WHERE не может содержать агрегатные функции, а HAVING — может. Оба могут использоваться в одном запросе для точной фильтрации данных.
Видео-ответы
▶
СОБЕСЕДОВНИЕ SENIOR AQA PYTHON | ВИЛКА 350к
▶
Как нужно проходить собеседование по Python, чтобы получить оффер!
▶
Моковое собеседование на Middle Golang разработчика | Solvery & Uproger
▶
Golang живое собеседование Middle Go разработчика!
▶
глупое собеседование на фулстек разработчика
▶
Открытое собеседование PHP Middle
▶
Собеседование на позицию Backend Developer Python + Django Middle #2
▶
Проверяем знания перед реальными собеседованиями | Техническое собеседование Java Kotlin | Jetbulb
▶
Собеседование Java Junior | Никита В. vs. Максим Добрынин | Jetbulb
▶
СОБЕСЕДОВАНИЕ по PHP: к каким ВОПРОСАМ готовиться?
▶
Junior Data Scientist | Собеседование | karpov.courses
▶
Публичное собеседование: PHP-программист [Хекслет]