join tasks done

This commit is contained in:
pavel
2026-02-12 21:48:35 +01:00
parent 35283077b6
commit 1cf0709bbc
2 changed files with 158 additions and 188 deletions
-188
View File
@@ -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;
+158
View File
@@ -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';