From d00110c7ae5afe08915f7aff8be0d6fc7b943ee5 Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 11 Feb 2026 18:54:44 +0100 Subject: [PATCH 1/4] ddl, dml tasks done --- pmikhailov/postgresql/.project | 11 +++++ pmikhailov/postgresql/DDL-DML.sql | 80 +++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 pmikhailov/postgresql/.project create mode 100644 pmikhailov/postgresql/DDL-DML.sql diff --git a/pmikhailov/postgresql/.project b/pmikhailov/postgresql/.project new file mode 100644 index 0000000..92f941b --- /dev/null +++ b/pmikhailov/postgresql/.project @@ -0,0 +1,11 @@ + + + postgresql + + + + + + + + diff --git a/pmikhailov/postgresql/DDL-DML.sql b/pmikhailov/postgresql/DDL-DML.sql new file mode 100644 index 0000000..afeb254 --- /dev/null +++ b/pmikhailov/postgresql/DDL-DML.sql @@ -0,0 +1,80 @@ +CREATE TABLE users ( + id int PRIMARY KEY, -- NOT NULL + "name" varchar(100) NOT NULL, + age int, + email varchar(100), + country varchar(2), + is_active boolean, + created_at timestamptz NOT NULL +); + +CREATE TABLE products ( + id int PRIMARY KEY, + "name" varchar(100) NOT NULL, + category varchar(50), + price decimal(10,2) NOT NULL, + in_stock BOOLEAN -- или int, потому что или на складе или не на складе +); + +CREATE TABLE orders ( + id int PRIMARY KEY, + user_id int, + order_date timestamptz NOT NULL, + status varchar(20) +); + +CREATE TABLE order_items ( + order_id int, + product_id int, + quantity int NOT NULL, + price_at_purchase decimal(10,2) NOT NULL, + PRIMARY KEY (order_id, product_id) +); + +INSERT INTO pmikhailov.users +(id, "name", age, email, country, is_active, created_at) VALUES +(1, 'Alice', 25, 'alice@example.com', 'US', TRUE, '2024-01-10 10:00:00'), +(2, 'Bob', 30, 'bob@example.com', 'UK', TRUE, '2024-02-05 09:30:00'), +(3, 'Carol', 27, 'carol@example.com', 'US', FALSE, '2024-03-01 15:20:00'), +(4, 'Diana', 22, 'diana@gmail.com', 'US', TRUE, '2024-01-12 08:15:00'), +(5, 'Evan', 35, 'evan@example.com', 'UK', TRUE, '2024-01-18 19:40:00'), +(6, 'Farida', 29, 'farida@example.com', 'KZ', TRUE, '2024-02-20 11:05:00'), +(7, 'George', 31, 'george+test@example.com', 'US', TRUE, '2024-03-05 16:45:00'), +(8, 'Helen', 24, NULL, 'UK', FALSE, '2024-03-06 08:20:00'), +(9, 'Ivan', 26, 'ivan@example.com', 'RU', TRUE, '2024-01-11 14:30:00'), +(10, 'Julia', 28, 'julia@example.com', 'US', TRUE, '2024-03-07 18:05:00'); + + +INSERT INTO pmikhailov.products +(id, "name", category, price, in_stock) VALUES +(1, 'iPhone 15', 'Электроника', 80000, TRUE), +(2, 'Kindle', 'Электроника', 15000, TRUE), +(3, 'Кроссовки Nike', 'Одежда', 9000, TRUE), +(4, 'Кроссовки NoName', 'Одежда', 3000, FALSE), +(5, 'Наушники Pro', 'Электроника', 12000, TRUE), +(6, 'Фитнес-браслет', 'Гаджеты', 6000, TRUE), +(7, 'Подарочная карта', 'Сервисы', 1000, TRUE); + +INSERT INTO pmikhailov.orders +(id, user_id, order_date, status) VALUES +(1, 1, '2025-01-10 12:00:00', 'paid'), +(2, 3, '2025-01-12 09:30:00', 'cancelled'), +(3, 1, '2025-01-15 18:20:00', 'paid'), +(4, 2, '2025-01-20 11:05:00', 'created'), +(5, 4, '2025-02-01 17:45:00', 'paid'), +(6, 5, '2025-02-10 10:10:00', 'refunded'), +(7, 7, '2025-03-01 09:00:00', 'paid'), +(8, 9, '2025-03-05 19:30:00', 'paid'); + +INSERT INTO pmikhailov.order_items +(order_id, product_id, quantity, price_at_purchase) VALUES +(1, 1, 1, 78000), +(1, 3, 2, 8500), +(2, 2, 1, 14000), +(3, 5, 1, 11000), +(3, 7, 1, 1000), +(4, 2, 1, 15000), +(5, 6, 1, 6000), +(6, 1, 1, 82000), +(7, 3, 1, 9000), +(8, 4, 2, 2800); From 35283077b6fad1f1f5981cb32b9a9da33d151e9f Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 11 Feb 2026 23:57:08 +0100 Subject: [PATCH 2/4] base sql done --- .../postgresql/{DDL-DML.sql => base_sql.sql} | 112 +++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) rename pmikhailov/postgresql/{DDL-DML.sql => base_sql.sql} (61%) diff --git a/pmikhailov/postgresql/DDL-DML.sql b/pmikhailov/postgresql/base_sql.sql similarity index 61% rename from pmikhailov/postgresql/DDL-DML.sql rename to pmikhailov/postgresql/base_sql.sql index afeb254..743a24a 100644 --- a/pmikhailov/postgresql/DDL-DML.sql +++ b/pmikhailov/postgresql/base_sql.sql @@ -1,6 +1,6 @@ CREATE TABLE users ( id int PRIMARY KEY, -- NOT NULL - "name" varchar(100) NOT NULL, + name varchar(100) NOT NULL, age int, email varchar(100), country varchar(2), @@ -10,7 +10,7 @@ CREATE TABLE users ( CREATE TABLE products ( id int PRIMARY KEY, - "name" varchar(100) NOT NULL, + name varchar(100) NOT NULL, category varchar(50), price decimal(10,2) NOT NULL, in_stock BOOLEAN -- или int, потому что или на складе или не на складе @@ -78,3 +78,111 @@ INSERT INTO pmikhailov.order_items (6, 1, 1, 82000), (7, 3, 1, 9000), (8, 4, 2, 2800); + +SELECT id, name, country, created_at, email +FROM users +ORDER BY created_at DESC, name ASC; + +SELECT id, name, country +FROM users +WHERE country = 'US' +ORDER BY name ASC; + +SELECT id, name, country +FROM users +WHERE country = 'UK' +ORDER BY name ASC; + +SELECT id, name, email +FROM users u +WHERE email IS NOT NULL +ORDER BY name ASC; + +SELECT DISTINCT lower(email) +FROM users u +WHERE email IS NOT null; + +SELECT id, name, created_at +FROM users +WHERE created_at >= '2024-02-05 09:30:00.000 +0100' +ORDER BY created_at DESC +LIMIT 2 OFFSET 1; + + +/* Задача 1 */ + +SELECT + name, + category, + price, + price * 1.3 AS price_with_markup, + price * 1.5 AS price_with_vat +FROM + products p +WHERE + in_stock IS TRUE + AND price BETWEEN 100 AND 1300; + + +/* Задача 2 */ + +SELECT + name, + price, + price * 0.85 AS price_with_discount +FROM + products p +WHERE + (price <= 100) OR (price >= 1000); + + +/* Задача 3 */ + +SELECT + id, + name, + category, + price +FROM + products p +WHERE + category IN ('tablet', 'smartphone', 'mouse') + AND price >= 100; + + +/* Задача 4 */ + +SELECT + name, + category, + price +FROM + products p +WHERE name NOT ILIKE '%iPhone%'; + + +/* Задача 5 */ + +SELECT + name, + category, + price +FROM + products p +WHERE + name NOT ILIKE '%pro%' +ORDER BY + price DESC; + +SELECT + name, + category, + price +FROM + products p +WHERE + name NOT ILIKE '%mx%'; +ORDER BY + price DESC; + + From 1cf0709bbcbd8ba2e00f5620a23443e0bf9f797f Mon Sep 17 00:00:00 2001 From: pavel Date: Thu, 12 Feb 2026 21:48:35 +0100 Subject: [PATCH 3/4] join tasks done --- pmikhailov/postgresql/base_sql.sql | 188 ----------------------------- pmikhailov/postgresql/joins.sql | 158 ++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 188 deletions(-) delete mode 100644 pmikhailov/postgresql/base_sql.sql create mode 100644 pmikhailov/postgresql/joins.sql diff --git a/pmikhailov/postgresql/base_sql.sql b/pmikhailov/postgresql/base_sql.sql deleted file mode 100644 index 743a24a..0000000 --- a/pmikhailov/postgresql/base_sql.sql +++ /dev/null @@ -1,188 +0,0 @@ -CREATE TABLE users ( - id int PRIMARY KEY, -- NOT NULL - name varchar(100) NOT NULL, - age int, - email varchar(100), - country varchar(2), - is_active boolean, - created_at timestamptz NOT NULL -); - -CREATE TABLE products ( - id int PRIMARY KEY, - name varchar(100) NOT NULL, - category varchar(50), - price decimal(10,2) NOT NULL, - in_stock BOOLEAN -- или int, потому что или на складе или не на складе -); - -CREATE TABLE orders ( - id int PRIMARY KEY, - user_id int, - order_date timestamptz NOT NULL, - status varchar(20) -); - -CREATE TABLE order_items ( - order_id int, - product_id int, - quantity int NOT NULL, - price_at_purchase decimal(10,2) NOT NULL, - PRIMARY KEY (order_id, product_id) -); - -INSERT INTO pmikhailov.users -(id, "name", age, email, country, is_active, created_at) VALUES -(1, 'Alice', 25, 'alice@example.com', 'US', TRUE, '2024-01-10 10:00:00'), -(2, 'Bob', 30, 'bob@example.com', 'UK', TRUE, '2024-02-05 09:30:00'), -(3, 'Carol', 27, 'carol@example.com', 'US', FALSE, '2024-03-01 15:20:00'), -(4, 'Diana', 22, 'diana@gmail.com', 'US', TRUE, '2024-01-12 08:15:00'), -(5, 'Evan', 35, 'evan@example.com', 'UK', TRUE, '2024-01-18 19:40:00'), -(6, 'Farida', 29, 'farida@example.com', 'KZ', TRUE, '2024-02-20 11:05:00'), -(7, 'George', 31, 'george+test@example.com', 'US', TRUE, '2024-03-05 16:45:00'), -(8, 'Helen', 24, NULL, 'UK', FALSE, '2024-03-06 08:20:00'), -(9, 'Ivan', 26, 'ivan@example.com', 'RU', TRUE, '2024-01-11 14:30:00'), -(10, 'Julia', 28, 'julia@example.com', 'US', TRUE, '2024-03-07 18:05:00'); - - -INSERT INTO pmikhailov.products -(id, "name", category, price, in_stock) VALUES -(1, 'iPhone 15', 'Электроника', 80000, TRUE), -(2, 'Kindle', 'Электроника', 15000, TRUE), -(3, 'Кроссовки Nike', 'Одежда', 9000, TRUE), -(4, 'Кроссовки NoName', 'Одежда', 3000, FALSE), -(5, 'Наушники Pro', 'Электроника', 12000, TRUE), -(6, 'Фитнес-браслет', 'Гаджеты', 6000, TRUE), -(7, 'Подарочная карта', 'Сервисы', 1000, TRUE); - -INSERT INTO pmikhailov.orders -(id, user_id, order_date, status) VALUES -(1, 1, '2025-01-10 12:00:00', 'paid'), -(2, 3, '2025-01-12 09:30:00', 'cancelled'), -(3, 1, '2025-01-15 18:20:00', 'paid'), -(4, 2, '2025-01-20 11:05:00', 'created'), -(5, 4, '2025-02-01 17:45:00', 'paid'), -(6, 5, '2025-02-10 10:10:00', 'refunded'), -(7, 7, '2025-03-01 09:00:00', 'paid'), -(8, 9, '2025-03-05 19:30:00', 'paid'); - -INSERT INTO pmikhailov.order_items -(order_id, product_id, quantity, price_at_purchase) VALUES -(1, 1, 1, 78000), -(1, 3, 2, 8500), -(2, 2, 1, 14000), -(3, 5, 1, 11000), -(3, 7, 1, 1000), -(4, 2, 1, 15000), -(5, 6, 1, 6000), -(6, 1, 1, 82000), -(7, 3, 1, 9000), -(8, 4, 2, 2800); - -SELECT id, name, country, created_at, email -FROM users -ORDER BY created_at DESC, name ASC; - -SELECT id, name, country -FROM users -WHERE country = 'US' -ORDER BY name ASC; - -SELECT id, name, country -FROM users -WHERE country = 'UK' -ORDER BY name ASC; - -SELECT id, name, email -FROM users u -WHERE email IS NOT NULL -ORDER BY name ASC; - -SELECT DISTINCT lower(email) -FROM users u -WHERE email IS NOT null; - -SELECT id, name, created_at -FROM users -WHERE created_at >= '2024-02-05 09:30:00.000 +0100' -ORDER BY created_at DESC -LIMIT 2 OFFSET 1; - - -/* Задача 1 */ - -SELECT - name, - category, - price, - price * 1.3 AS price_with_markup, - price * 1.5 AS price_with_vat -FROM - products p -WHERE - in_stock IS TRUE - AND price BETWEEN 100 AND 1300; - - -/* Задача 2 */ - -SELECT - name, - price, - price * 0.85 AS price_with_discount -FROM - products p -WHERE - (price <= 100) OR (price >= 1000); - - -/* Задача 3 */ - -SELECT - id, - name, - category, - price -FROM - products p -WHERE - category IN ('tablet', 'smartphone', 'mouse') - AND price >= 100; - - -/* Задача 4 */ - -SELECT - name, - category, - price -FROM - products p -WHERE name NOT ILIKE '%iPhone%'; - - -/* Задача 5 */ - -SELECT - name, - category, - price -FROM - products p -WHERE - name NOT ILIKE '%pro%' -ORDER BY - price DESC; - -SELECT - name, - category, - price -FROM - products p -WHERE - name NOT ILIKE '%mx%'; -ORDER BY - price DESC; - - diff --git a/pmikhailov/postgresql/joins.sql b/pmikhailov/postgresql/joins.sql new file mode 100644 index 0000000..7a90e1b --- /dev/null +++ b/pmikhailov/postgresql/joins.sql @@ -0,0 +1,158 @@ +/* Задача 1 + * Джойним в таком порядке т.к. не каждый юзер делал заказ + * + судя по порядку колонок мы хотим анализировать заказы + * (по сути выглядит так же как INNER) + * Но в обратном порядке можем увидеть кто не делал заказ + * и добавить их в условную рассылку + */ +SELECT + o.id AS order_id, + o.order_date, + status, + u."name" AS user_name, + country +FROM + orders o +LEFT JOIN + users u ON o.user_id = u.id + + +/* Задача 2 */ + +SELECT + order_id, + p."name" AS product_name, + quantity, + price_at_purchase +FROM + order_items oi +LEFT JOIN + products p ON oi.product_id = p.id -- AND oi.order_id = 1 из правой таблицы будут NULL там, где оба условия не выполнены +WHERE order_id = 1 -- в задании другой номер - 101, надо исправить в Notion, данные на п.4 уже другие + + +/* Задача 3 */ + +SELECT + order_id, + u."name" AS user_name, + p."name" AS product_name, + quantity, + price_at_purchase +FROM + orders o +LEFT JOIN + order_items oi ON o.id = oi.order_id +INNER JOIN + users u ON o.id = u.id +INNER JOIN + products p ON oi.product_id = p.id; + + +/* Задача 4 */ + +SELECT + u."name" AS user_name, + o.id AS order_id, + status +FROM + users u +LEFT JOIN + orders o ON u.id = o.user_id + + +/* Задача 5 */ + +SELECT + o.user_id, + u."name" AS user_name +FROM + users u +LEFT JOIN + orders o ON u.id = o.id +WHERE o.user_id IS NOT NULL + + +/* Задача 6 */ + +SELECT + o.id AS order_id, + u.name AS user_name, + p.name AS product_name, + quantity +FROM + orders o +LEFT JOIN + order_items oi ON o.id = oi.order_id +INNER JOIN + products p ON oi.product_id = p.id +INNER JOIN + users u ON o.user_id = u.id +WHERE p."name" ILIKE '%Mi Band 7%'; + + +/* Задача 7 */ + +SELECT + p.name AS product_name, + order_id, + quantity +FROM + products p +FULL JOIN + order_items oi ON p.id = oi.product_id +ORDER BY product_name; + + +/* Задача 8 */ + +SELECT + o.id, + u."name" AS user_name, + p."name" AS product_name, + quantity, + price_at_purchase +FROM + orders o +LEFT JOIN + order_items oi ON o.id = oi.order_id +INNER JOIN + users u ON o.user_id = u.id +LEFT JOIN + products p ON oi.product_id = p.id +WHERE + o.status = 'paid'; + + +/* Задача 9 */ + +SELECT + o.id AS order_id, + o.order_date, + p."name" AS product_name, + quantity, + price_at_purchase +FROM + orders o +LEFT JOIN + order_items oi ON o.id = oi.order_id +INNER JOIN + products p ON oi.product_id = p.id +INNER JOIN + users u ON o.user_id = u.id +WHERE u."name" ILIKE '%alice%'; + + +/* Задача 10 +* Задача противоречит изначальным органичениям NOT NULL +*/ + +SELECT + o.id AS order_id, + user_id, + status +FROM + orders o +FULL JOIN + order_items oi ON oi.order_id = o.id +WHERE product_id IS NULL AND o.status = 'created'; \ No newline at end of file From 866fb95d2ee4b65ac01aaf380406108c27190ccb Mon Sep 17 00:00:00 2001 From: pavel Date: Wed, 22 Apr 2026 16:18:49 +0200 Subject: [PATCH 4/4] fix(sql): joins - resolved the comments --- pmikhailov/postgresql/joins.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pmikhailov/postgresql/joins.sql b/pmikhailov/postgresql/joins.sql index 7a90e1b..e83b069 100644 --- a/pmikhailov/postgresql/joins.sql +++ b/pmikhailov/postgresql/joins.sql @@ -44,7 +44,7 @@ FROM LEFT JOIN order_items oi ON o.id = oi.order_id INNER JOIN - users u ON o.id = u.id + users u ON o.user_id = u.id INNER JOIN products p ON oi.product_id = p.id; @@ -69,7 +69,7 @@ SELECT FROM users u LEFT JOIN - orders o ON u.id = o.id + orders o ON u.id = o.user_id WHERE o.user_id IS NOT NULL