Оператор HAVING в SQL используется, когда нужно отфильтровать данные на основе агрегатных функций, таких как MIN() и MAX(), SUM() и AVG() и COUNT().
1 2 3 4 |
SELECT COUNT(customer_id), country FROM Customers GROUP BY country HAVING COUNT(customer_id) > 1; |
Здесь мы подсчитываем количество клиентов (customer_id), группируя их по странам (country), а затем возвращаем результат, если на страну имеется больше 1 клиента.
Примечание: Оператор HAVING
добавили из-за того, что оператор WHERE
не поддерживает агрегатные функции. Кроме того, перед оператором HAVING необходимо использовать GROUP BY.
HAVING против WHERE в SQL
Оператор HAVING | Оператор WHERE |
Проверяет условие для группы строк. | Проверяет условие для каждой строки отдельно. |
Используется с агрегатными функциями. | Нельзя использовать с агрегатными функциями. |
Выполняется после оператора GROUP BY. | Выполняется перед оператором GROUP BY. |
Давайте рассмотрим пример. Если мы хотим выбрать все заказы, сумма (amount) которых меньше 500, мы можем сделать следующее:
1 2 3 |
SELECT customer_id, amount FROM Orders WHERE amount < 500; |
Теперь, если нам нужно подсчитать сумму всех заказов по каждому клиенту (customer_id):
1 2 3 |
SELECT customer_id, SUM(amount) AS total FROM Orders GROUP BY customer_id; |
Мы получаем сгрупированные данные.
Готово! Но если теперь нам нужно выбрать строки, в которых сумма заказов меньше 500 на каждого клиента, мы можем использовать оператор HAVING
следующим образом:
1 2 3 4 |
SELECT customer_id, SUM(amount) AS total FROM Orders GROUP BY customer_id HAVING SUM(amount) < 500; |
Результат: