Files
homework/pmikhailov/postgresql/base_sql.sql
T
2026-02-11 23:57:08 +01:00

189 lines
4.2 KiB
SQL

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;