HAVING в PostgreSQL

Статья основана на 23 видео из 30 тем курса SQL c 0 от Аристова Евгения. Ссылки на видео на платформах RUTUBE и VK видео.

В прошлой статье мы уже рассмотрели GROUP BY, но столкнулись с проблемой – внутри условия WHERE нельзя посчитать агрегатную функцию. Для этого используется HAVING.

HAVING

Синтаксис:

SELECT
    column1,
    aggregate_function (column2)
FROM
    table_name
GROUP BY
    column1
HAVING
    condition;

Создадим таблицу склад:

CREATE TABLE warehouse(
    id serial,
    name text,
    price decimal,
    kolvo int
);

Добавим в неё значения:

INSERT INTO warehouse (name, price,kolvo) VALUES
    ('apples', 100,20),
    ('bananas', 120,30),
    ('lemons', 300,40),
    ('pineapple', 52,500);

Создадим таблицу Продажи:

CREATE TABLE sales(
    id serial,
    fk_warehouse int,
    kolvo int,
    salesdate date DEFAULT now()
);

Добавим значения в Продажи:

INSERT INTO sales(fk_warehouse, kolvo,salesdate) VALUES 
    (1, 10,'20230915'), 
    (2, 5,'2023-09-14');
INSERT INTO sales(fk_warehouse, kolvo,salesdate) VALUES 
    (1, 10,'20230915'), 
    (2, 5,'2023-09-14');
INSERT INTO sales(fk_warehouse, kolvo,salesdate) VALUES 
    (3, 20,'20230911'), 
    (4, 50,'2023-09-12');

Напишем запрос для отбора таких строк, в которых было продано более 5 единиц товара за раз. Затем посчитаем сумму продаж этих товаров, сгруппировав по имени товара, далее отберем только суммы больше 2000:

SELECT w.name as n, sum(s.kolvow.price) AS summa 
FROM sales s 
JOIN warehouse w 
    ON s.fk_warehouse=w.id 
WHERE s.kolvo>5 
GROUP BY w.name 
HAVING sum(s.kolvow.price) > 2000
ORDER BY n;

WHERE составляет предварительную выборку, а HAVING делает выборку по агрегированным условиям.

Общая структура SELECT

Рассмотрим SELECT целиком.

Запросы в PostgreSQL: 1. Этапы выполнения.

Этапы выполнения запроса:

  • Лексический и синтаксический разбор, cемантический разбор
  • Трансформация (всё преобразуется в машинный код)
  • Планирование – > Дерево плана
  • Перебор планов
  • Управление порядком соединений -> Выбор лучшего плана
  • Общая схема вычисления оценки, в т.ч. кардинальности
  • Выполнение

Выполнение запросов в PostgreSQL | Статья | Сообщество Directum 

Разберем данный запрос:

Сначала выбираются все поля из раздела FROM. Далее просматривается, есть ли ещё какие-то поля в разделе JOIN, если они есть, то добираются нужные поля (PostgreSQL пытается делать это параллельно), далее накладываются фильтры для сокращения количества отобранных полей.

На втором этапе начинается группировка по условиям GROUP BY. После группировки применяется групповой фильтр HAVING. Получается сгруппированная и отфильтрованная выборка.

На третьем этапе применяются оконные функции, затем убираются дубликаты при необходимости (DISTINCT).

На последнем – четвертом – этапе применяется ORDER BY, LIMIT и OFFSET (паджинация).

Все этапы SELECT уже были разобраны в моих статьях:

Презентация к статье здесь.

24 из 30 тем будет скоро доступна. Если вы хотите быстрее получить доступ – присоединяйтесь к онлайн группе, ссылка доступна в описании курса.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

пятнадцать + пять =