join tasks done
This commit is contained in:
@@ -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;
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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';
|
||||||
Reference in New Issue
Block a user