Загрузка данных
-- =====================================================
-- БАЗА ДАННЫХ: bookstore_lab
-- ПОЛНЫЙ СКРИПТ: создание + данные + все запросы
-- =====================================================
-- =====================================================
-- ЧАСТЬ 1. СОЗДАНИЕ ТАБЛИЦ
-- =====================================================
-- Таблица авторов
CREATE TABLE authors(
id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL
);
-- Таблица жанров
CREATE TABLE genres(
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE
);
-- Таблица книг
CREATE TABLE books(
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
price NUMERIC(10,2) CHECK (price > 0),
author_id INT NOT NULL,
genre_id INT NOT NULL,
FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE CASCADE,
FOREIGN KEY (genre_id) REFERENCES genres(id) ON DELETE CASCADE
);
-- Таблица клиентов
CREATE TABLE customers(
id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
-- Таблица заказов
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
order_date DATE NOT NULL DEFAULT CURRENT_DATE,
customer_id INT NOT NULL,
book_id INT NOT NULL,
quantity INT CHECK (quantity > 0),
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE
);
-- =====================================================
-- ЧАСТЬ 2. ЗАПОЛНЕНИЕ ТЕСТОВЫМИ ДАННЫМИ
-- =====================================================
-- Авторы
INSERT INTO authors (first_name, last_name) VALUES
('Джордж', 'Оруэлл'),
('Джоан', 'Роулинг'),
('Лев', 'Толстой'),
('Фёдор', 'Достоевский');
-- Жанры
INSERT INTO genres (name) VALUES
('Роман'),
('Фэнтези'),
('Антиутопия'),
('Детектив');
-- Книги
INSERT INTO books (title, price, author_id, genre_id) VALUES
('1984', 350.00, 1, 3),
('Скотный двор', 250.00, 1, 3),
('Гарри Поттер и философский камень', 450.00, 2, 2),
('Война и мир', 900.00, 3, 1),
('Преступление и наказание', 550.00, 4, 1);
-- Клиенты
INSERT INTO customers (first_name, last_name, email) VALUES
('Иван', 'Петров', 'ivan@example.com'),
('Мария', 'Сидорова', 'maria@example.com'),
('Алексей', 'Смирнов', 'alex@example.com'),
('Ольга', 'Кузнецова', 'olga@example.com');
-- Заказы
INSERT INTO orders (order_date, customer_id, book_id, quantity) VALUES
('2024-01-15', 1, 1, 1),
('2024-01-20', 2, 3, 2),
('2024-02-10', 1, 4, 1),
('2024-02-15', 3, 5, 1),
('2024-03-01', 4, 2, 3);
-- Добавляем клиента без заказов (для демонстрации LEFT JOIN)
INSERT INTO customers (first_name, last_name, email)
VALUES ('Дмитрий', 'Беззаказный', 'norders@example.com');
-- =====================================================
-- ЧАСТЬ 3. ПРОВЕРКА ДАННЫХ
-- =====================================================
SELECT 'authors' as table_name, COUNT(*) FROM authors
UNION ALL SELECT 'genres', COUNT(*) FROM genres
UNION ALL SELECT 'books', COUNT(*) FROM books
UNION ALL SELECT 'customers', COUNT(*) FROM customers
UNION ALL SELECT 'orders', COUNT(*) FROM orders;
-- =====================================================
-- ЧАСТЬ 4. АГРЕГАТНЫЕ ФУНКЦИИ
-- =====================================================
-- 1. Общее количество проданных книг
SELECT SUM(quantity) AS total_sold FROM orders;
-- 2. Средняя цена книг
SELECT ROUND(AVG(price), 2) AS avg_price FROM books;
-- 3. Самый дорогой заказ
SELECT
o.id,
b.title,
b.price * o.quantity AS total_cost
FROM orders o
JOIN books b ON o.book_id = b.id
ORDER BY total_cost DESC
LIMIT 1;
-- 4. Самый дешёвый заказ
SELECT
o.id,
b.title,
b.price * o.quantity AS total_cost
FROM orders o
JOIN books b ON o.book_id = b.id
ORDER BY total_cost ASC
LIMIT 1;
-- 5. Сумма покупок по каждому клиенту
SELECT
c.first_name,
c.last_name,
SUM(b.price * o.quantity) AS total_spent
FROM customers c
JOIN orders o ON c.id = o.customer_id