Загрузка данных


Команда 1:
CREATE TABLE products (id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, category VARCHAR(100), price NUMERIC(10,2), stock INTEGER DEFAULT 0);
Что она делает: Создаёт таблицу товаров (products) с автоинкрементным id, названием, категорией, ценой и остатком на складе.
Команда 2:
CREATE TABLE customers (id SERIAL PRIMARY KEY, full_name VARCHAR(255), email VARCHAR(255) UNIQUE);
Что она делает: Создаёт таблицу клиентов с id, ФИО и уникальным email.
Команда 3:
CREATE TABLE orders (id SERIAL PRIMARY KEY, customer_id INTEGER REFERENCES customers(id), order_date DATE DEFAULT CURRENT_DATE);
Что она делает: Создаёт таблицу заказов, ссылается на клиента.
Команда 4:
CREATE TABLE order_items (order_id INTEGER REFERENCES orders(id), product_id INTEGER REFERENCES products(id), quantity INTEGER);

3333333333333333
INSERT INTO products (name, category, price, stock) VALUES ('Смартфон Samsung Galaxy', 'Электроника', 29999.99, 8);
INSERT INTO products (name, category, price, stock) VALUES ('Ноутбук Lenovo', 'Электроника', 54999.99, 3);
INSERT INTO products (name, category, price, stock) VALUES ('Наушники Sony', 'Электроника', 8999.99, 15);
INSERT INTO products (name, category, price, stock) VALUES ('Мышка Logitech', 'Аксессуары', 1499.99, 20);
INSERT INTO products (name, category, price, stock) VALUES ('Клавиатура Cherry', 'Аксессуары', 2999.99, 4);
INSERT INTO products (name, category, price, stock) VALUES ('Монитор Dell', 'Электроника', 18999.99, 2);

33333333333333333333333333
INSERT INTO customers (full_name, email) VALUES ('Иванов Иван Иванович', 'ivanov@mail.ru');
INSERT INTO customers (full_name, email) VALUES ('Петрова Анна Сергеевна', 'petrova@yandex.ru');
INSERT INTO customers (full_name, email) VALUES ('Сидоров Алексей Петрович', 'sidorov@gmail.com');
INSERT INTO customers (full_name, email) VALUES ('Козлова Мария Викторовна', 'kozlova@mail.ru');
INSERT INTO customers (full_name, email) VALUES ('Смирнов Дмитрий Александрович', 'smirnov@bk.ru');
INSERT INTO customers (full_name, email) VALUES ('Васильева Ольга Николаевна', 'vasilieva@mail.ru');

INSERT INTO orders (customer_id, order_date) VALUES (1, '2026-04-01');
INSERT INTO orders (customer_id, order_date) VALUES (2, '2026-04-02');
INSERT INTO orders (customer_id, order_date) VALUES (1, '2026-04-05');
INSERT INTO orders (customer_id, order_date) VALUES (3, '2026-04-10');
INSERT INTO orders (customer_id, order_date) VALUES (4, '2026-04-12');
INSERT INTO orders (customer_id, order_date) VALUES (2, '2026-04-15');

INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 1, 1);
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 3, 2);
INSERT INTO order_items (order_id, product_id, quantity) VALUES (2, 2, 1);
INSERT INTO order_items (order_id, product_id, quantity) VALUES (3, 6, 1);
INSERT INTO order_items (order_id, product_id, quantity) VALUES (4, 4, 3);
INSERT INTO order_items (order_id, product_id, quantity) VALUES (5, 5, 1);
INSERT INTO order_items (order_id, product_id, quantity) VALUES (6, 1, 1);
INSERT INTO order_items (order_id, product_id, quantity) VALUES (6, 2, 1);


Задание 9 (Напишите все требуемые запросы и проверьте их)
Внутри psql выполните по очереди:
Запрос 1 (Список товаров в категории "Электроника"):
SELECT * FROM products WHERE category = 'Электроника';
Что делает: Выводит все товары только из категории Электроника.
Запрос 2 (Top-3 клиента по сумме заказов):
SELECT c.full_name, SUM(p.price * oi.quantity) AS total_sum FROM customers c JOIN orders o ON c.id = o.customer_id JOIN order_items oi ON o.id = oi.order_id JOIN products p ON oi.product_id = p.id GROUP BY c.full_name ORDER BY total_sum DESC LIMIT 3;
Что делает: Считает общую сумму каждого клиента и показывает топ-3 по убыванию.
Запрос 3 (Товары, которых осталось меньше 5):
SELECT * FROM products WHERE stock < 5;
Что делает: Показывает товары, остаток которых меньше 5 штук.
Задание 10 (Транзакция + откат)
Внутри psql выполните по очереди:
Команда 1:
BEGIN;
Что делает: Начинает транзакцию (все следующие действия временные).
Команда 2:
INSERT INTO products (name, category, price, stock) VALUES ('Тестовый товар для отката', 'Тест', 999.99, 1);
Что делает: Добавляет тестовую запись (пока только внутри транзакции).
Команда 3:
ROLLBACK;
Что делает: Откатывает транзакцию — все изменения внутри неё отменяются.
Команда 4 (проверка):
SELECT * FROM products WHERE name = 'Тестовый товар для отката';
Что делает: Должно вернуть 0 строк — данные не сохранились.
Задание 11 (Резервное копирование pg_dump + восстановление в новую базу)
Выйдите из psql командой \q, затем в терминале:
Команда 1 (бэкап):
sudo -u postgres pg_dump -d students_db -F c -f /tmp/students_db.backup
Что она делает: Создаёт резервную копию всей базы students_db в бинарном формате (custom).
Команда 2 (новая база):
sudo -u postgres createdb students_db_copy
Что она делает: Создаёт новую пустую базу students_db_copy.
Команда 3 (восстановление):
sudo -u postgres pg_restore -d students_db_copy -F c /tmp/students_db.backup
Что она делает: Восстанавливает все данные и таблицы из бэкапа в новую базу students_db_copy.