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


CREATE DATABASE library;
USE library;
CREATE TABLE authors(
	id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    country VARCHAR(50),
    birth_year INT
);

CREATE TABLE readers(
	id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    age INT,
    city VARCHAR(50),
    registration_date DATE
);

CREATE TABLE books(
	id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200),
    pages INT,
    price DECIMAL(10,2),
    genre VARCHAR(50),
    pub_year INT
);

CREATE TABLE book_authors(
	book_id INT,
    author_id INT,
    PRIMARY KEY (book_id, author_id),
    FOREIGN KEY (book_id) REFERENCES books(id),
    FOREIGN KEY (author_id) REFERENCES authors(id)
);

CREATE TABLE issues(
	id INT PRIMARY KEY AUTO_INCREMENT,
    book_id INT,
    reader_id INT,
    issue_date DATE,
    return_date DATE,
    rating INT,
    fine DECIMAL(10,2),
    FOREIGN KEY (book_id) REFERENCES books(id),
    FOREIGN KEY (reader_id) REFERENCES readers(id)
);

INSERT INTO authors(name, country, birth_year) VALUES
('Лев Толстой', 'RU', 1828),
('Фёдор Достоевский', 'RU', 1821),
('Джейн Остин', 'UK', 1775),
('Дж. Р. Р. Толкин', 'UK', 1892),
('Дж. К. Роулинг', 'UK', 1965),
('Антуан де Сент-Экзюпери', 'FR', 1900),
('Уильям Шекспир', 'UK', 1564),
('Марк Твен', 'US', 1835);

INSERT INTO books(title, pages, price, genre, pub_year) VALUES
('Война и мир', 1400, 25.50, 'Роман', 1869),
('Преступление и наказание', 670, 18.00, 'Роман', 1866),
('Гордость и предубеждение', 432, 15.99, 'Роман', 1813),
('Властелин колец', 1178, 35.00, 'Фэнтези', 1954),
('Гарри Поттер и философский камень', 223, 12.50, 'Фэнтези', 1997),
('Маленький принц', 96, 8.99, 'Сказка', 1943),
('Гамлет', 350, 10.50, 'Драма', 1603),
('Приключения Гекльберри Финна', 366, 14.00, 'Приключения', 1884);

INSERT INTO book_authors(book_id, author_id) VALUES
(1, 1),
(1, 2),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8);

INSERT INTO readers(name, age, city, registration_date) VALUES
('Иван Петров', 25, 'Москва', '2024-01-15'),
('Мария Сидорова', 32, 'СПб', '2023-11-20'),
('Алексей Иванов', 28, 'Казань', '2024-03-10'),
('Елена Козлова', 22, 'Москва', '2025-09-01'),
('Дмитрий Смирнов', 45, 'Екатеринбург', '2023-05-12');

INSERT INTO issues(id, book_id, reader_id, issue_date, return_date, rating, fine) VALUES
(1, 1, 1, '2026-01-10', '2026-02-05', 10, 0.00),
(2, 2, 2, '2026-02-01', NULL, NULL, 5.00),
(3, 3, 1, '2026-03-15', '2026-04-10', 8, 0.00),
(4, 4, 3, '2026-04-01', NULL, NULL, 0.00),
(5, 5, 4, '2026-03-20', '2026-04-15', 9, 2.50),
(6, 1, 5, '2026-01-20', '2026-02-10', 7, 0.00),
(7, 5, 5, '2026-01-09', NULL, NULL, 0.00),
(8, 4, 1, '2025-06-15', NULL, 3, 8.03),
(9, 7, 5, '2025-06-06', '2026-03-25', 1, 1.15),
(10, 8, 4, '2026-01-14', NULL, NULL, 0.77),
(11, 2, 4, '2025-12-10', NULL, NULL, 0.00),
(12, 6, 5, '2026-04-12', NULL, 1, 0.00),
(13, 2, 2, '2025-10-01', NULL, 7, 0.58),
(14, 4, 1, '2025-10-14', NULL, 4, 0.00),
(15, 4, 4, '2025-06-17', NULL, 5, 0.00);

-- Задание 1
DELIMITER //
CREATE FUNCTION выдачи(id_книги int)
RETURNS INT
DETERMINISTIC
BEGIN
	DECLARE количество INT DEFAULT 0;
    SELECT COUNT(book_id) INTO количество
    FROM issues
    GROUP BY book_id
    HAVING book_id = id_книги;
    RETURN количество;    
END //
DELIMITER ;

DELIMITER //
CREATE PROCEDURE табл_выдачи(in id_книги int)
BEGIN
	IF EXISTS (SELECT 1 FROM books WHERE id = id_книги)
    THEN CREATE TABLE IF NOT EXISTS temp_popularity(
			book_id INT PRIMARY KEY,
            popularity INT,
            FOREIGN KEY (book_id) REFERENCES books(id));
    INSERT INTO temp_popularity(book_id, popularity) VALUES
    (id_книги, выдачи(id_книги));
    SELECT * FROM temp_popularity;
    ELSE SELECT 'Ошибка' AS 'Ошибка';
    END IF;
END //
DELIMITER ;

-- Задание 2
DELIMITER //
CREATE FUNCTION возр_чит(возраст int)
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
	DECLARE категория VARCHAR(20);
    IF возраст < 25 THEN SET категория = 'Молодой';
    ELSEIF возраст BETWEEN 25 AND 60 THEN SET категория = 'Взрослый';
    ELSE SET категория = 'Пенсионер';
    END IF;
    RETURN категория;
END //
DELIMITER ;

DELIMITER //
CREATE PROCEDURE обн_таб()
BEGIN
	IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'readers' AND COLUMN_NAME = 'age_category')
    THEN ALTER TABLE readers
		 ADD COLUMN age_category VARCHAR(20);
	END IF;
    UPDATE readers
    SET age_category = возр_чит(age);
    SELECT * FROM readers;
END //
DELIMITER ;

-- Задание 3
DELIMITER //
CREATE FUNCTION штраф(дата_выдачи date, дата_возврата date)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
	DECLARE сумма_штрафа DECIMAL(10,2) DEFAULT 0;
    IF дата_возврата IS NULL THEN SET сумма_штрафа = 1 * (DATEDIFF(CURRENT_DATE, дата_выдачи) - 7);
    ELSEIF DATEDIFF(дата_возврата, дата_выдачи) <= 7 THEN SET сумма_штрафа = 0;
    ELSE SET сумма_штрафа = 1 * (DATEDIFF(дата_возврата, дата_выдачи) - 7);
    END IF;
    RETURN сумма_штрафа;
END //
DELIMITER ;