From b52fa039323d0677f44bacd8bcc726b53cb88e53 Mon Sep 17 00:00:00 2001 From: mnoskov Date: Tue, 10 Mar 2026 10:25:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=90=D0=B3=D1=80=D0=B5=D0=B3=D0=B0=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=B8=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Базовый_SQL/DQL_basic_SQL_practice.sql | 0 .../DDL_create_first_tables.sql | 0 .../DML_first_inserts_in_tables.sql | 0 .../Фильтрация/DQL_filtration_practice.sql | 0 .../{JOIN => 2. JOIN}/DQL_join_practice.sql | 0 .../DQL_union_practice.sql | 0 .../DQL_aggregations&groupings_practice.sql | 130 ++++++++++++++++++ 7 files changed, 130 insertions(+) rename mnoskov/postgresql/{Основы => 1. Основы}/Базовый_SQL/DQL_basic_SQL_practice.sql (100%) rename mnoskov/postgresql/{Основы => 1. Основы}/Создание_и_изменение_таблиц_и_данных/DDL_create_first_tables.sql (100%) rename mnoskov/postgresql/{Основы => 1. Основы}/Создание_и_изменение_таблиц_и_данных/DML_first_inserts_in_tables.sql (100%) rename mnoskov/postgresql/{Основы => 1. Основы}/Фильтрация/DQL_filtration_practice.sql (100%) rename mnoskov/postgresql/{JOIN => 2. JOIN}/DQL_join_practice.sql (100%) rename mnoskov/postgresql/{UNION => 3. UNION}/DQL_union_practice.sql (100%) create mode 100644 mnoskov/postgresql/4. Агрегации и группировки/DQL_aggregations&groupings_practice.sql diff --git a/mnoskov/postgresql/Основы/Базовый_SQL/DQL_basic_SQL_practice.sql b/mnoskov/postgresql/1. Основы/Базовый_SQL/DQL_basic_SQL_practice.sql similarity index 100% rename from mnoskov/postgresql/Основы/Базовый_SQL/DQL_basic_SQL_practice.sql rename to mnoskov/postgresql/1. Основы/Базовый_SQL/DQL_basic_SQL_practice.sql diff --git a/mnoskov/postgresql/Основы/Создание_и_изменение_таблиц_и_данных/DDL_create_first_tables.sql b/mnoskov/postgresql/1. Основы/Создание_и_изменение_таблиц_и_данных/DDL_create_first_tables.sql similarity index 100% rename from mnoskov/postgresql/Основы/Создание_и_изменение_таблиц_и_данных/DDL_create_first_tables.sql rename to mnoskov/postgresql/1. Основы/Создание_и_изменение_таблиц_и_данных/DDL_create_first_tables.sql diff --git a/mnoskov/postgresql/Основы/Создание_и_изменение_таблиц_и_данных/DML_first_inserts_in_tables.sql b/mnoskov/postgresql/1. Основы/Создание_и_изменение_таблиц_и_данных/DML_first_inserts_in_tables.sql similarity index 100% rename from mnoskov/postgresql/Основы/Создание_и_изменение_таблиц_и_данных/DML_first_inserts_in_tables.sql rename to mnoskov/postgresql/1. Основы/Создание_и_изменение_таблиц_и_данных/DML_first_inserts_in_tables.sql diff --git a/mnoskov/postgresql/Основы/Фильтрация/DQL_filtration_practice.sql b/mnoskov/postgresql/1. Основы/Фильтрация/DQL_filtration_practice.sql similarity index 100% rename from mnoskov/postgresql/Основы/Фильтрация/DQL_filtration_practice.sql rename to mnoskov/postgresql/1. Основы/Фильтрация/DQL_filtration_practice.sql diff --git a/mnoskov/postgresql/JOIN/DQL_join_practice.sql b/mnoskov/postgresql/2. JOIN/DQL_join_practice.sql similarity index 100% rename from mnoskov/postgresql/JOIN/DQL_join_practice.sql rename to mnoskov/postgresql/2. JOIN/DQL_join_practice.sql diff --git a/mnoskov/postgresql/UNION/DQL_union_practice.sql b/mnoskov/postgresql/3. UNION/DQL_union_practice.sql similarity index 100% rename from mnoskov/postgresql/UNION/DQL_union_practice.sql rename to mnoskov/postgresql/3. UNION/DQL_union_practice.sql diff --git a/mnoskov/postgresql/4. Агрегации и группировки/DQL_aggregations&groupings_practice.sql b/mnoskov/postgresql/4. Агрегации и группировки/DQL_aggregations&groupings_practice.sql new file mode 100644 index 0000000..28ee152 --- /dev/null +++ b/mnoskov/postgresql/4. Агрегации и группировки/DQL_aggregations&groupings_practice.sql @@ -0,0 +1,130 @@ +-- Задание 1 +SELECT + category, + count(*) products_count +FROM + mnoskov.products +GROUP BY + category +ORDER BY + products_count; +-- Если убрать order by, то статистика будет в случайном разрбосанном виде, а не по возрастанию +-- Увеличится products_count на одно значение + + +-- Задание 2 +SELECT + order_id, + sum(quantity) AS total_quantity, + sum(quantity * price_at_purchase) AS order_revenue +FROM + mnoskov.order_items +GROUP BY + order_id +ORDER BY + order_revenue DESC; +-- Если убрать GROUP BY, то будет ошибка +-- Нельзя просто добавить в SELECT ещё одну колонку (например, product_id) без добавления её в GROUP BY или агрегат, потому что вылезет ошибка. Ну и колонка должна быть либо сгруппирована либо в агрегате, она не может существовать сама по себе в запросе с grouup by + + +-- Задание 3 +SELECT + p.category, + sum(oi.quantity * oi.price_at_purchase) AS category_revenue +FROM + mnoskov.order_items oi +JOIN + mnoskov.products p ON oi.product_id = p.id +GROUP BY + p.category +ORDER BY + category_revenue DESC; +-- Группировка по p.category - потому что мы хотим узнать сумму прибли по каждой категории +-- Если добавить p.name - будет ошибка потому что p.name тоже нужно будет заносить в GROUP BY + + +-- Задание 4 +SELECT + oi.order_id, + sum(oi.quantity * oi.price_at_purchase) AS order_revenue +FROM + mnoskov.orders o +JOIN + mnoskov.order_items oi ON o.id = oi.order_id +WHERE + o.status = 'paid' +GROUP BY + oi.order_id +ORDER BY + order_revenue DESC; +-- В задаче-2 были все заказы, а тут только оплаченные +-- Я бы смотрел толлько на paid, чтобы понять прибыль которая уже есть + + +-- Задание 5 +SELECT + p.category, + sum(oi.quantity * oi.price_at_purchase) AS category_revenue +FROM + mnoskov.order_items oi +JOIN + mnoskov.products p ON oi.product_id = p.id +GROUP BY + p.category +HAVING + sum(oi.quantity * oi.price_at_purchase) > 1000 +ORDER BY + category_revenue DESC; +-- Если добавить это условие в WHERE, то терминал будет ругаться мол агрегаты недопустимы в WHERE +-- Обычно условие(прим: WHERE price > 1000) отличается от агрегированного условия(прим: HAVING SUM(...) > 1000) тем, что в первом случае ничего считать не нужно, значение уже есть, а во втором нужно сначала чтобы функция все посчитала. Ну и HAVING запускается уже после группировки + + +-- Задание 6 +SELECT + country, + count(*) AS active_user_count +FROM + mnoskov.users +WHERE + is_active = true +GROUP BY + country +HAVING + count(*) >= 2 +ORDER BY + active_user_count DESC; +-- is_active = true логичнее писать в HAVING, потому что is_active - не агрегат +-- Если нет страны где больше двух активных юзеров, то ничего не выведется + + +-- Задание 7 +SELECT + p.name AS product_name, + sum(oi.quantity) AS total_quantity_sold +FROM + mnoskov.order_items oi +JOIN + mnoskov.products p ON oi.product_id = p.id +GROUP BY + p.name +ORDER BY + total_quantity_sold DESC +LIMIT 3; +-- total_quantity_sold - количество проданного товара, а product_revenue - выручка каждого товара +-- Бизнес сморит на количество, может быть когда товара очень много и нужно понять какой % уже продан, и когда нужно найти популярные или непопулярные товары + + +-- Задание 8 +SELECT + order_id, + sum(quantity * price_at_purchase) AS order_revenue +FROM + mnoskov.order_items +GROUP BY + order_id +HAVING + sum(quantity * price_at_purchase) < 10000 +ORDER BY + order_revenue; +-- Не понял вопрос: Какие реальные причины могут быть у очень маленьких заказов (1–2 гипотезы)? +-- Проще увидеть глазами отфильтрованные микро-заказы \ No newline at end of file