DDL, DML, Basic, Filter
This commit is contained in:
@@ -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)
|
||||
);
|
||||
@@ -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%';
|
||||
|
||||
Reference in New Issue
Block a user