Условие PostgreSQL HAVING

Читать первым в Telegram

Данная статья относится к циклу статей, посвященных PostgreSQL. В предыдущей статье мы говорили об условии PostgreSQL GROUP BY. Теперь же мы углубимся в изучение условия HAVING, при помощи которого мы будем исключать группы строк, которые не удовлетворяют указанному условию.

Введение в условие PostgreSQL HAVING

Зачастую мы используем условие HAVING совместно с условием GROUP BY, чтобы отфильтровать строки, которые не удовлетворяют указанному условию.

Следующий запрос отображает синтаксис вызова условия HAVING:

SELECT
    column_1,
    aggregate_function (column_2)
FROM
    tbl_name
GROUP BY
    column_1
HAVING
    condition;

Предложение HAVING устанавливает условие для групп, состоящих из строк, созданных предложением GROUP BY после его [предложения] применения, тогда как предложение WHERE устанавливает условие для отдельных строк перед применением условия GROUP BY. В этом и состоит главное отличие условия HAVING от условия WHERE.

В PostgreSQL вы можете использовать условие HAVING без условия GROUP BY. В таком случае, условие HAVING обратит запрос в одну группу. К тому же, список SELECT и условие HAVING могут ссылаться только на столбцы из агрегатных функций. Данный тип запроса возвращает одну строку, если условие в предложении HAVING принимает значение true, или нулевую строку, если оно равно false.

Примеры использования условия PostgreSQL HAVING

Воспользуемся таблицей payment из примера базы данных.

Пример использования условия PostgreSQL HAVING с агрегатной функцией SUM()

Следующий запрос получает общую сумму платежей каждого клиента при помощи условия GROUP BY:

SELECT
    customer_id,
    SUM (amount)
FROM
    payment
GROUP BY
    customer_id;

Вы можете применить условие HAVING, чтобы выбрать только клиентов, потративших сумму превышающую 200, как показано в запросе ниже:

SELECT
    customer_id,
    SUM (amount)
FROM
    payment
GROUP BY
    customer_id
HAVING
    SUM (amount) > 200;

Пример использования условия PostgreSQL HAVING с агрегатной функцией COUNT()

Обратите внимание на таблицу customer.

Следующий запрос возвращает количество покупателей в каждом магазине:

SELECT
    store_id,
    COUNT (customer_id)
FROM
    customer
GROUP BY
    store_id

Вы можете использовать условие HAVING, чтобы выбрать магазин с клиентской базой превышающей 300 покупателей:

SELECT
    store_id,
    COUNT (customer_id)
FROM
    customer
GROUP BY
    store_id
HAVING
    COUNT (customer_id) > 300;

На этом мы заканчиваем изучение группировки данных и переходим к выполнению операций над множествами. Изучение этой главы мы начнём с оператора PostgreSQL UNION, необходимого для объединения наборов результатов нескольких запросов в один.

Источник: PostgreSQL Tutorial from Scratch

Поддержать проект

Социальные сети проекта:

Подпишись, чтобы ничего не пропустить!