homework, pet project DE Dmitry_Medvedev #1

Open
dmitry_medvedev wants to merge 264 commits from md_branch into main
4 changed files with 306 additions and 0 deletions
Showing only changes of commit 0f63e21353 - Show all commits
+32
View File
@@ -0,0 +1,32 @@
CREATE TABLE dsolovianov.users (
id INT GENERATED ALWAYS AS IDENTITY NOT NULL,
name VARCHAR(100) NOT NULL,
age INT,
email VARCHAR(100),
country VARCHAR(100),
is_active BOOLEAN,
created_at TIMESTAMPTZ NOT NULL
);
CREATE TABLE dsolovianov.products (
id INT GENERATED ALWAYS AS IDENTITY NOT NULL,
name VARCHAR(100) NOT NULL,
category VARCHAR(50),
price DECIMAL(10,2) NOT NULL,
in_stock BOOLEAN
);
CREATE TABLE dsolovianov.orders (
id INT GENERATED ALWAYS AS IDENTITY NOT NULL,
user_id INT,
order_date TIMESTAMPTZ NOT NULL,
status VARCHAR(20)
);
CREATE TABLE dsolovianov.order_items (
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
price_at_purchase DECIMAL(10,2) NOT NULL,
CONSTRAINT order_items_pk PRIMARY KEY (order_id, product_id)
);
+59
View File
@@ -0,0 +1,59 @@
INSERT INTO dsolovianov.users (name, age, email, country, is_active, created_at) VALUES
('Alice', 25, 'alice@example.com', 'US', true, '2024-01-10 10:00:00+00'),
('Bob', 30, 'bob@example.com', 'UK', true, '2024-02-05 09:30:00+00'),
('Carol', 27, 'carol@example.com', 'US', false, '2024-03-01 15:20:00+00'),
('Diana', 22, 'diana@GMAIL.com', 'US', true, '2024-01-12 08:15:00+00'),
('Evan', 35, 'EVAN@example.com', 'UK', true, '2024-01-18 19:40:00+00'),
('Farida', 29, 'farida@example.com', 'KZ', true, '2024-02-20 11:05:00+00'),
('George', 31, 'george+test@example.com', 'US', true, '2024-03-05 16:45:00+00'),
('Helen', 24, NULL, 'UK', false, '2024-03-06 08:20:00+00'),
('Ivan', 26, 'ivan@example.com', 'RU', true, '2024-01-11 14:30:00+00'),
('Julia', 28, 'julia@example.com', 'US', true, '2024-03-07 18:05:00+00');
INSERT INTO dsolovianov.products (name, category, price, in_stock) VALUES
('iPhone 15', 'Электроника', 80000, true),
('Kindle', 'Электроника', 15000, true),
('Кроссовки Nike', 'Одежда', 9000, true),
('Кроссовки NoName', 'Одежда', 3000, false),
('Наушники Pro', 'Электроника', 12000, true),
('Фитнес-браслет', 'Гаджеты', 6000, true),
('Подарочная карта', 'Сервисы', 1000, true);
INSERT INTO dsolovianov.orders (user_id, order_date, status) VALUES
(1, '2025-01-10 12:00:00+00', 'paid'),
(3, '2025-01-12 09:30:00+00', 'cancelled'),
(1, '2025-01-15 18:20:00+00', 'paid'),
(2, '2025-01-20 11:05:00+00', 'created'),
(4, '2025-02-01 17:45:00+00', 'paid'),
(5, '2025-02-10 10:10:00+00', 'refunded'),
(7, '2025-03-01 09:00:00+00', 'paid'),
(9, '2025-03-05 19:30:00+00', 'paid');
INSERT INTO dsolovianov.order_items (order_id, product_id, quantity, price_at_purchase) VALUES
-- Заказ #1: iPhone 15 (1 шт) + Наушники Pro (2 шт)
(1, 1, 1, 80000.00),
(1, 5, 2, 12000.00),
-- Заказ #2 (cancelled): Kindle (1 шт)
(2, 2, 1, 15000.00),
-- Заказ #3: Кроссовки Nike (2 шт)
(3, 3, 2, 9000.00),
-- Заказ #4 (created): Фитнес-браслет (1 шт)
(4, 6, 1, 6000.00),
-- Заказ #5: iPhone 15 (1 шт) + Подарочная карта (3 шт)
(5, 1, 1, 80000.00),
(5, 7, 3, 1000.00),
-- Заказ #6 (refunded): Наушники Pro (1 шт)
(6, 5, 1, 12000.00),
-- Заказ #7: Kindle (1 шт) + Фитнес-браслет (2 шт)
(7, 2, 1, 15000.00),
(7, 6, 2, 6000.00),
-- Заказ #8: iPhone 15 (1 шт) + Кроссовки Nike (1 шт)
(8, 1, 1, 80000.00),
(8, 3, 1, 9000.00);
@@ -0,0 +1,89 @@
/*
- Задание 1 — Спроектируй «карточку пользователя»
Ты делаешь экран “Пользователи” в админке и решаешь, какие поля там важны.
Работаем с таблицей **`users`**
**✅ Требования:**
1. Напиши запрос, который вернёт в результате только столбцы: **`id`**, **`name`**, **`country`**, **`created_at`**, **`email`**
2. Потом измени запрос так, чтобы:
- сначала отсортировать по **`created_at`** (новые сверху)
- потом по **`name`** по алфавиту внутри одной даты
- Задание 2 — Сегментация по странам (с выбором)
Маркетолог хочет понять, какая страна сейчас интереснее.
Работаем с таблицей **`users`**
**✅ Требования:**
1. Выбери страну **`US`**и напиши запрос, который:
- вернёт **`id`**, **`name`**, **`country`**;
- покажет только пользователей из выбранной страны;
- отсортирует их по имени.
2. Напиши второй запрос, который вернёт пользователей из страны **`UK`**.
- Задание 3 — Контакты для рассылки (думать про качество)
Нужно сделать список e‑mail для рассылки так, чтобы его не стыдно было отдавать маркетологу.
**✅ Требования:**
1. Напиши один запрос, который:
- вернёт только пользователей, у которых email **есть**;
- вернёт столбцы **`id`**, **`name`**, **`email`**;
- отсортирует их по имени.
2. Напиши второй запрос, который подготовит «чистый» вид email:
- вернёт только **`email`** в нижнем регистре (как **`email_lower`**);
- уберёт дубликаты email (нужно использовать **`DISTINCT`**).
- Задание 4 — Новички и активность
«Тебе нужно посмотреть, кто пришёл недавно и кого стоит “подогреть”.»
**✅ Требования:**
1. Напиши запрос, который:
- выберет пользователей, зарегистрированных **после** даты, которую ты сам выберешь (например, **`2024‑01‑11`**);
- вернёт **`id`**, **`name`**, **`created_at`**;
- отсортирует по **`created_at`** от новых к старым.
2. Ограничь результат так, чтобы увидеть только 3 самых новых пользователя.
3. Измени запрос так, чтобы пропустить самого нового и показать следующих двух (используй **`LIMIT`** и **`OFFSET`**).
*/
SELECT id,
name,
country,
created_at,
email
FROM dsolovianov.users
ORDER BY created_at DESC, name ASC;
SELECT id,
name,
country
FROM dsolovianov.users
WHERE country LIKE 'US';
SELECT id,
name,
country
FROM dsolovianov.users
WHERE country LIKE 'UK';
SELECT id,
name,
email,
LOWER(email) AS email_lower
FROM dsolovianov.users
WHERE email IS NOT NULL
ORDER BY name;
SELECT id,
name,
created_at
FROM dsolovianov.users
WHERE created_at > '2024-01-11'
ORDER BY created_at DESC
LIMIT 3 OFFSET 1;
@@ -0,0 +1,126 @@
/*INSERT INTO dsolovianov.products (name, category, price, in_stock) VALUES
('Mi Band 7', 'smartwatch', 49.00, true),
('Surface Pro', 'tablet', 1299.00, true),
('iPhone 15', 'smartphone', 999.00, true),
('Logitech MX Master', 'mouse', 120.00, true);*/
/*
- Задача 1 — Товары для продажи
Ты настраиваешь главную витрину магазина. Нужно показывать только товары, которые сейчас реально готовы продавать.
**✅ Условия:**
- товар **в наличии**
- категория **НЕ smartwatch**
- цена **от 100 до 1300**
- отдельно хотим видеть цену:
- с наценкой 30% ( price + 30%)
- с «виртуальным НДС» 50% (price + 50%)
**✅ Вывести:**
- `name`, `category`, `price`
- `price_with_markup` = price + 30%
- `price_with_vat` = price + 50%
- Задача 2 — Скидочная корзина: дешёвые или дорогие
Нужно собрать товары под акцию
**✅ Условия:**
- участвуют товары с ценой **меньше 100** или **больше 1000**
- скидка 15% (price - 15%)
**✅ Вывести:**
- `name`, `price`
- `price_with_discount` = price - 15%
- Задача 3 — Категории для рекламы
Маркетолог просит товары только из нужных категорий:
**✅ Условия:**
- category в списке: `tablet`, `smartphone`, `mouse`
- цена **не меньше 100**
**✅ Вывести:**
- `id`, `name`, `category`, `price`
- сортировка по цене по убыванию
- Задача 4 — Убрать iPhone из выборки
Собираем список товаров, **кроме iPhone**, чтобы сделать подборку “не Apple”.
**✅ Условия:**
- название **НЕ содержит** `iPhone`
**✅ Вывести:**
- `name`, `category`, `price`
- Задача 5 — Поиск товаров по названию
Представь, что у пользователя есть строка поиска на сайте. Нужно сделать **2 запроса**, которые помогут искать товары по названию.
- 1) Найти товары, где в названии есть `"pro"` (без учёта регистра)
📌 Условия:
- поиск должен сработать на `pro`, `PRO`, `Pro`
- вывести: `name`, `category`, `price`
- 2) Найти товары, где в названии есть `"mx"` (без учёта регистра)
📌 Условия:
- вывести: `name`, `category`, `price`
- отсортировать по `price DESC`
*/
SELECT name,
category,
price,
(price * 0.30) + price AS price_with_markup,
(price * 0.50) + price AS price_with_vat
FROM dsolovianov.products
WHERE category NOT IN ('smartwatch')
AND (price >= 100 AND price <= 1300);
SELECT name,
price,
price - (price * 0.15) AS price_with_discount
FROM dsolovianov.products
WHERE price < 100 OR price > 1000;
SELECT id,
name,
category,
price
FROM dsolovianov.products
WHERE category IN ('tablet', 'smartphone', 'mouse') AND price >= 100
ORDER BY price DESC;
SELECT name,
category,
price
FROM dsolovianov.products
WHERE category NOT LIKE '%iPhone%';
SELECT id,
name,
category,
price
FROM dsolovianov.products
WHERE name ILIKE '%pro%';
SELECT id,
name,
category,
price
FROM dsolovianov.products
WHERE name ILIKE '%mx%';